/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.program.model;
import java.awt.Point;
import java.awt.geom.Point2D;
import mobac.gui.mapview.JMapViewer;
import mobac.program.interfaces.MapSpace;
/**
* Coordinate point in Mercator projection regarding a world with height and
* width 2<sup>30</sup> pixels (2<sup>22</sup> tiles with size 256 pixels). This
* is the maximum size a <code>int</code> can hold.
*/
public class MercatorPixelCoordinate {
private final MapSpace mapSpace;
private final int x;
private final int y;
private final int zoom;
public MercatorPixelCoordinate(MapSpace mapSpace, int x, int y, int zoom) {
super();
this.mapSpace = mapSpace;
this.x = x;
this.y = y;
this.zoom = zoom;
}
public MercatorPixelCoordinate(MapSpace mapSpace, double lat, double lon) {
super();
this.mapSpace = mapSpace;
//this.x = mapSpace.cLonToX(lon, JMapViewer.MAX_ZOOM);
//this.y = mapSpace.cLatToY(lat, JMapViewer.MAX_ZOOM);
Point p = mapSpace.cLonLatToXY(lon, lat, JMapViewer.MAX_ZOOM);
this.x = p.x;
this.y = p.y;
this.zoom = JMapViewer.MAX_ZOOM;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getZoom() {
return zoom;
}
public MapSpace getMapSpace() {
return mapSpace;
}
public EastNorthCoordinate getEastNorthCoordinate() {
//double lon = mapSpace.cXToLon(x, zoom);
//double lat = mapSpace.cYToLat(y, zoom);
Point2D.Double p = mapSpace.cXYToLonLat(x, y, zoom);
double lon = p.x;
double lat = p.y;
return new EastNorthCoordinate(lat, lon);
}
public MercatorPixelCoordinate adaptToZoomlevel(int aZoomlevel) {
int zoomDiff = this.zoom - aZoomlevel;
int new_x = x;
int new_y = y;
if (zoomDiff < 0) {
zoomDiff = -zoomDiff;
new_x <<= zoomDiff;
new_y <<= zoomDiff;
} else {
new_x >>= zoomDiff;
new_y >>= zoomDiff;
}
return new MercatorPixelCoordinate(mapSpace, new_x, new_y, aZoomlevel);
}
@Override
public String toString() {
return "x=" + x + " y=" + y + " zoom=" + zoom;
}
}