Ich versuche, einen Lat / Long-Punkt in einen 2d-Punkt umzuwandeln, damit ich ihn auf einem Bild der Welt anzeigen kann - was eine Mercator-Projektion ist.
Ich habe verschiedene Möglichkeiten gesehen, dies zu tun, und ein paar Fragen zum Stapelüberlauf - ich habe die verschiedenen Code-Schnipsel ausprobiert und obwohl ich den richtigen Längengrad für Pixel erhalte, scheint der Breitengrad immer aus zu sein - scheint jedoch vernünftiger zu werden.
Ich brauche die Formel, um die Bildgröße, -breite usw. zu berücksichtigen.
Ich habe diesen Code ausprobiert:
double minLat = -85.05112878;
double minLong = -180;
double maxLat = 85.05112878;
double maxLong = 180;
// Map image size (in points)
double mapHeight = 768.0;
double mapWidth = 991.0;
// Determine the map scale (points per degree)
double xScale = mapWidth/ (maxLong - minLong);
double yScale = mapHeight / (maxLat - minLat);
// position of map image for point
double x = (lon - minLong) * xScale;
double y = - (lat + minLat) * yScale;
System.out.println("final coords: " + x + " " + y);
In dem Beispiel, das ich versuche, scheint der Breitengrad um etwa 30 Pixel versetzt zu sein. Hilfe oder Rat?
Aktualisieren
Basierend auf dieser Frage: Lat / lon bis xy
Ich habe versucht, den bereitgestellten Code zu verwenden, habe aber immer noch Probleme mit der Breitengradkonvertierung. Der Längengrad ist in Ordnung.
int mapWidth = 991;
int mapHeight = 768;
double mapLonLeft = -180;
double mapLonRight = 180;
double mapLonDelta = mapLonRight - mapLonLeft;
double mapLatBottom = -85.05112878;
double mapLatBottomDegree = mapLatBottom * Math.PI / 180;
double worldMapWidth = ((mapWidth / mapLonDelta) * 360) / (2 * Math.PI);
double mapOffsetY = (worldMapWidth / 2 * Math.log((1 + Math.sin(mapLatBottomDegree)) / (1 - Math.sin(mapLatBottomDegree))));
double x = (lon - mapLonLeft) * (mapWidth / mapLonDelta);
double y = 0.1;
if (lat < 0) {
lat = lat * Math.PI / 180;
y = mapHeight - ((worldMapWidth / 2 * Math.log((1 + Math.sin(lat)) / (1 - Math.sin(lat)))) - mapOffsetY);
} else if (lat > 0) {
lat = lat * Math.PI / 180;
lat = lat * -1;
y = mapHeight - ((worldMapWidth / 2 * Math.log((1 + Math.sin(lat)) / (1 - Math.sin(lat)))) - mapOffsetY);
System.out.println("y before minus: " + y);
y = mapHeight - y;
} else {
y = mapHeight / 2;
}
System.out.println(x);
System.out.println(y);
Wenn der ursprüngliche Code verwendet wird und der Breitengradwert positiv ist, wird ein negativer Punkt zurückgegeben. Daher habe ich ihn geringfügig geändert und mit den extremen Breitengraden getestet. Diese sollten Punkt 0 und Punkt 766 sein. Er funktioniert einwandfrei. Wenn ich jedoch einen anderen Breitengradwert versuche, z. B. 58.07 (nördlich von Großbritannien), wird dieser als nördlich von Spanien angezeigt.