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.

Kommentar zu dem Problem
Ihre Formeln sind nur lineare interpolation, die effektiv bedeutet, du machst eine equirectangular Projektion anstatt einer Mercator. Kommentarautor: Drew Hall
Ich habe aktualisiert, der code, auch wenn weiterhin Probleme mit der Breite Kommentarautor: drunkmonkey
@Drew erwähnt, wenn Ihre Karte ist eine Marcator-Projektion, müssen Sie konvertieren die lat/lng in x/y mit einer Mercator-Projektion. Überprüfen Sie, ob Ihre Karte Transverse Mercator oder Sphärische Mercator-Projektion, dann werden wir zum formulars... Kommentarautor: Michael
Es ist eine sphärische Mercator-Projektion Kommentarautor: drunkmonkey

InformationsquelleAutor der Frage drunkmonkey | 2013-01-15

Schreibe einen Kommentar