Statistics
| Revision:

root / branches / Mobile_Compatible_Hito_1 / libFMap / src / es / prodevelop / gvsig / mobile / fmap / driver / raster / google / GoogleUtils.java @ 21606

History | View | Annotate | Download (2.39 KB)

1
package es.prodevelop.gvsig.mobile.fmap.driver.raster.google;
2

    
3
import java.awt.Image;
4
import java.awt.geom.Point2D;
5

    
6
import es.prodevelop.gvsig.mobile.fmap.util.ResourceReader;
7

    
8
public class GoogleUtils {
9
        
10
        public static double SEMI_EQUATOR_LENGTH = 180.0;
11
        public static Image GOOGLE_FORBIDDEN = ResourceReader.getResourceImage("img", "google_forbidden.png");
12
        public static Image NO_DATA = ResourceReader.getResourceImage("img", "nodata.png");
13

    
14
        public static GoogleMapsTile getTileFor(Point2D p, int depth) {
15
                
16
                Point2D _p = normalize(p);
17
                
18
                GoogleMapsTile world = new GoogleMapsTile();
19
                
20
                for (int i=0; i<depth; i++) {
21
                        int q = qForPoint(world, _p);
22
                        world.goToQ(q);
23
                }
24
                return world;
25
        }
26
        
27
        public static Point2D normalize(Point2D p) {
28
                
29
                if ((p.getX() >= -SEMI_EQUATOR_LENGTH) && (p.getX() <= SEMI_EQUATOR_LENGTH)
30
                                && (p.getY() >= -SEMI_EQUATOR_LENGTH) && (p.getY() <= SEMI_EQUATOR_LENGTH)) {
31
                        return p;
32
                }
33

    
34
                double tx = 0;
35
                double ty = 0;
36
                double x = 0, y = 0;
37
                if (p.getX() > 0) {
38
                        tx = 1 + Math.floor((p.getX() - SEMI_EQUATOR_LENGTH) / (2 * SEMI_EQUATOR_LENGTH));
39
                        x = p.getX() - (tx * (2 * SEMI_EQUATOR_LENGTH));
40
                } else {
41
                        tx = -(1 + Math.floor((-p.getX() - SEMI_EQUATOR_LENGTH) / (2 * SEMI_EQUATOR_LENGTH)));
42
                        x = p.getX() - (tx * (2 * SEMI_EQUATOR_LENGTH));
43
                }
44
                
45
                if (p.getY() > 0) {
46
                        ty = 1 + Math.floor((p.getY() - SEMI_EQUATOR_LENGTH) / (2 * SEMI_EQUATOR_LENGTH));
47
                        y = p.getY() - (ty * (2 * SEMI_EQUATOR_LENGTH));
48
                } else {
49
                        ty = -(1 + Math.floor((-p.getY() - SEMI_EQUATOR_LENGTH) / (2 * SEMI_EQUATOR_LENGTH)));
50
                        y = p.getY() - (ty * (2 * SEMI_EQUATOR_LENGTH));
51
                }
52
                
53
                return new Point2D.Double(x, y);
54
        }
55

    
56
        public static int[] getDepthAndTileSize(double world_dist, int pixels) {
57
                
58
                int[] resp = new int[2];
59
                
60
                double dist_per_pixel = world_dist / pixels;
61
                int d = 0;
62
                while (dist_per_pixel < (2.0 * SEMI_EQUATOR_LENGTH / 256.0)) {
63
                        d++;
64
                        dist_per_pixel = 2 * dist_per_pixel;
65
                }
66
                
67
                resp[0] = d;
68
                
69
                dist_per_pixel = 2.0 * SEMI_EQUATOR_LENGTH / dist_per_pixel;
70
                resp[1] = Math.round((float) dist_per_pixel);
71
                return resp;
72
        }
73
        
74
        private static int qForPoint(GoogleMapsTile t, Point2D p) {
75
                
76
                double px = p.getX();
77
                double py = p.getY();
78
                double cx = t.getExtent().getCenterX();
79
                double cy = t.getExtent().getCenterY();
80
                
81
                if ((px <= cx) && (py <= cy)) return 0;
82
                if ((px >= cx) && (py <= cy)) return 1;
83
                if ((px >= cx) && (py >= cy)) return 2;
84
                return 3;
85
        }
86

    
87
}