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 |
} |