1 | // License: GPL. For details, see Readme.txt file.
|
---|
2 | package org.openstreetmap.gui.jmapviewer.tilesources;
|
---|
3 |
|
---|
4 | import java.awt.Point;
|
---|
5 |
|
---|
6 | import org.openstreetmap.gui.jmapviewer.Coordinate;
|
---|
7 | import org.openstreetmap.gui.jmapviewer.OsmMercator;
|
---|
8 | import org.openstreetmap.gui.jmapviewer.Projected;
|
---|
9 | import org.openstreetmap.gui.jmapviewer.Tile;
|
---|
10 | import org.openstreetmap.gui.jmapviewer.TileRange;
|
---|
11 | import org.openstreetmap.gui.jmapviewer.TileXY;
|
---|
12 | import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
|
---|
13 | import org.openstreetmap.gui.jmapviewer.interfaces.IProjected;
|
---|
14 |
|
---|
15 | /**
|
---|
16 | * TMS tile source.
|
---|
17 | */
|
---|
18 | public class TMSTileSource extends AbstractTMSTileSource {
|
---|
19 |
|
---|
20 | protected int maxZoom;
|
---|
21 | protected int minZoom;
|
---|
22 | protected OsmMercator osmMercator;
|
---|
23 |
|
---|
24 | /**
|
---|
25 | * Constructs a new {@code TMSTileSource}.
|
---|
26 | * @param info tile source information
|
---|
27 | */
|
---|
28 | public TMSTileSource(TileSourceInfo info) {
|
---|
29 | super(info);
|
---|
30 | minZoom = info.getMinZoom();
|
---|
31 | maxZoom = info.getMaxZoom();
|
---|
32 | this.osmMercator = new OsmMercator(this.getTileSize());
|
---|
33 | }
|
---|
34 |
|
---|
35 | @Override
|
---|
36 | public int getMinZoom() {
|
---|
37 | return (minZoom == 0) ? super.getMinZoom() : minZoom;
|
---|
38 | }
|
---|
39 |
|
---|
40 | @Override
|
---|
41 | public int getMaxZoom() {
|
---|
42 | return (maxZoom == 0) ? super.getMaxZoom() : maxZoom;
|
---|
43 | }
|
---|
44 |
|
---|
45 | @Override
|
---|
46 | public double getDistance(double lat1, double lon1, double lat2, double lon2) {
|
---|
47 | return osmMercator.getDistance(lat1, lon1, lat2, lon2);
|
---|
48 | }
|
---|
49 |
|
---|
50 | @Override
|
---|
51 | public Point latLonToXY(double lat, double lon, int zoom) {
|
---|
52 | return new Point(
|
---|
53 | (int) osmMercator.lonToX(lon, zoom),
|
---|
54 | (int) osmMercator.latToY(lat, zoom)
|
---|
55 | );
|
---|
56 | }
|
---|
57 |
|
---|
58 | @Override
|
---|
59 | public ICoordinate xyToLatLon(int x, int y, int zoom) {
|
---|
60 | return new Coordinate(
|
---|
61 | osmMercator.yToLat(y, zoom),
|
---|
62 | osmMercator.xToLon(x, zoom)
|
---|
63 | );
|
---|
64 | }
|
---|
65 |
|
---|
66 | @Override
|
---|
67 | public TileXY latLonToTileXY(double lat, double lon, int zoom) {
|
---|
68 | return new TileXY(
|
---|
69 | osmMercator.lonToX(lon, zoom) / getTileSize(),
|
---|
70 | osmMercator.latToY(lat, zoom) / getTileSize()
|
---|
71 | );
|
---|
72 | }
|
---|
73 |
|
---|
74 | @Override
|
---|
75 | public ICoordinate tileXYToLatLon(int x, int y, int zoom) {
|
---|
76 | return new Coordinate(
|
---|
77 | osmMercator.yToLat(y * getTileSize(), zoom),
|
---|
78 | osmMercator.xToLon(x * getTileSize(), zoom)
|
---|
79 | );
|
---|
80 | }
|
---|
81 |
|
---|
82 | @Override
|
---|
83 | public IProjected tileXYtoProjected(int x, int y, int zoom) {
|
---|
84 | double mercatorWidth = 2 * Math.PI * OsmMercator.EARTH_RADIUS;
|
---|
85 | double f = mercatorWidth * getTileSize() / osmMercator.getMaxPixels(zoom);
|
---|
86 | return new Projected(f * x - mercatorWidth / 2, -(f * y - mercatorWidth / 2));
|
---|
87 | }
|
---|
88 |
|
---|
89 | @Override
|
---|
90 | public TileXY projectedToTileXY(IProjected p, int zoom) {
|
---|
91 | double mercatorWidth = 2 * Math.PI * OsmMercator.EARTH_RADIUS;
|
---|
92 | double f = mercatorWidth * getTileSize() / osmMercator.getMaxPixels(zoom);
|
---|
93 | return new TileXY((p.getEast() + mercatorWidth / 2) / f, (-p.getNorth() + mercatorWidth / 2) / f);
|
---|
94 | }
|
---|
95 |
|
---|
96 | @Override
|
---|
97 | public boolean isInside(Tile inner, Tile outer) {
|
---|
98 | int dz = inner.getZoom() - outer.getZoom();
|
---|
99 | if (dz < 0) return false;
|
---|
100 | return outer.getXtile() == inner.getXtile() >> dz &&
|
---|
101 | outer.getYtile() == inner.getYtile() >> dz;
|
---|
102 | }
|
---|
103 |
|
---|
104 | @Override
|
---|
105 | public TileRange getCoveringTileRange(Tile tile, int newZoom) {
|
---|
106 | if (newZoom <= tile.getZoom()) {
|
---|
107 | int dz = tile.getZoom() - newZoom;
|
---|
108 | TileXY xy = new TileXY(tile.getXtile() >> dz, tile.getYtile() >> dz);
|
---|
109 | return new TileRange(xy, xy, newZoom);
|
---|
110 | } else {
|
---|
111 | int dz = newZoom - tile.getZoom();
|
---|
112 | TileXY t1 = new TileXY(tile.getXtile() << dz, tile.getYtile() << dz);
|
---|
113 | TileXY t2 = new TileXY(t1.getX() + (1 << dz) - 1, t1.getY() + (1 << dz) - 1);
|
---|
114 | return new TileRange(t1, t2, newZoom);
|
---|
115 | }
|
---|
116 | }
|
---|
117 |
|
---|
118 | @Override
|
---|
119 | public String getServerCRS() {
|
---|
120 | return "EPSG:3857";
|
---|
121 | }
|
---|
122 | }
|
---|