Konwertuj punkt szerokości / długości geograficznej na piksele (x, y) na projekcji mercatora

Próbuję przekonwertować długi / długi punkt na punkt 2d, dzięki czemu mogę wyświetlić go na obrazie świata - który jest projekcją mercatora.

Widziałem różne sposoby robienia tego i kilka pytań dotyczących przepełnienia stosu - wypróbowałem różne fragmenty kodu i chociaż otrzymałem poprawną długość geograficzną do piksela, szerokość geograficzna jest zawsze wyłączona - wydaje się jednak być bardziej rozsądna.

Potrzebuję wzoru, aby uwzględnić rozmiar obrazu, szerokość itp.

Próbowałem tego kodu:

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);

Szerokość geograficzna wydaje się być wyłączona o około 30px w przykładzie, który próbuję. Jakiejś pomocy lub porady?

Aktualizacja

Na podstawie tego pytania:Lat / lon do xy

Próbowałem użyć podanego kodu, ale nadal mam problemy z konwersją szerokości geograficznej, długość geograficzna jest dobra.

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);

Kiedy używasz oryginalnego kodu, jeśli wartość szerokości jest dodatnia, zwrócił punkt ujemny, więc nieznacznie go zmodyfikowałem i przetestowałem z ekstremalnymi szerokościami geograficznymi - powinien to być punkt 0 i punkt 766, działa dobrze. Jednak gdy próbuję innej wartości szerokości geograficznej np .: 58,07 (tylko na północ od Wielkiej Brytanii), wyświetla się ona na północ od Hiszpanii.

questionAnswers(5)

yourAnswerToTheQuestion