Konvertieren Sie den Breiten- / Längengrad in Pixel (x, y) in der Mercator-Projektion
Ich versuche zu konvertieren, eine lat/long-Punkt in einem 2d-Punkt, so dass ich Sie anzeigen kann auf ein Bild von der Welt-das ist eine mercator-Projektion.
Ich habe gesehen, verschiedene Arten, dies zu tun und ein paar Fragen auf stack overflow-ich habe versucht, die verschiedenen code-Schnipsel und ich bekomme zwar die richtige Länge, um pixel, die Breite ist immer aus-scheint sich immer mehr vernünftig obwohl.
Ich brauche die Formel zu berücksichtigen, die Bild Größe, Breite usw.
Habe ich versucht, dieses Stück code:
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);
Die Breite scheint zu sein, die aus von etwa 30px in dem Beispiel, das ich versuche. Jede Hilfe oder Beratung?
Update
Basierend auf dieser Frage:Lat/lon zu xy
Habe ich versucht, den code zu verwenden, aber ich bin immer noch einige Probleme mit der latitude-Konvertierung, Länge 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 mit dem ursprünglichen code, wenn der latitude-Wert positiv ist wird es wieder ein negativ-Punkt, so dass ich Sie modifiziert habe es etwas getestet und mit der extreme breiten-das sollte der Punkt 0 und Punkt 766, funktioniert es einwandfrei. Jedoch, wenn ich versuche einen anderen Breitengrad-Wert ex: 58.07 (nördlich von Großbritannien) zeigt es in den Norden von Spanien.
InformationsquelleAutor der Frage drunkmonkey | 2013-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Formeln zur Ableitung der projizierten Rechtswert-und Hochwert-Koordinaten in sphärische Breite φ und Länge λ
sind:
wobei λO ist die Länge des natürlichen Ursprungs und FE und FN false easting und false northing.
In sphärischer Mercator-diese Werte sind eigentlich nicht verwendet werden, so können Sie zur Vereinfachung die Formel
Pseudo-code-Beispiel, so kann dieser angepasst werden, um jede Programmiersprache.
Quellen:
BEARBEITEN
Erstellt eine Beispielimplementierung in PHP (weil ich saugen an Java)
https://github.com/mfeldheim/mapStuff.git
InformationsquelleAutor der Antwort Michel Feldheim
Können Sie nicht nur transponieren von Längengrad/Breitengrad zu x/y, denn die Welt ist nicht flach. Haben Sie diesen Beitrag anzusehen? Umwandlung von Längen - /Breitengrad, um X/Y-Koordinate
UPDATE - 1/18/13
Habe ich beschlossen, mit diesem einen stab, und hier ist, wie ich es mache:-
ERGEBNIS: Image width = 600px, Bild, height = 600px, Bild Polsterung = 50px
ERGEBNIS: Image width = 300px, Bild, height = 500 Pixel, Bild-Polsterung = 50px
InformationsquelleAutor der Antwort limc
Java-version des original Google Maps JavaScript API v3 java-script-code ist wie folgt, es funktioniert ohne Probleme
InformationsquelleAutor der Antwort nik
Möchte ich darauf hinweisen, dass der code in der Prozedur Grenzen Lesen sollte
InformationsquelleAutor der Antwort user3143011
InformationsquelleAutor der Antwort Farsheed