J'essaie de convertir un point lat/long en un point 2d afin de pouvoir l'afficher sur une image du monde - qui est une projection mercator.
J'ai vu plusieurs façons de procéder et quelques questions sur stack overflow. J'ai essayé les différents extraits de code et bien que j'obtienne la longitude correcte en pixel, la latitude est toujours erronée - cela semble toutefois devenir plus raisonnable.
J'ai besoin que la formule prenne en compte la taille de l'image, sa largeur, etc.
J'ai essayé ce bout de 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);
La latitude semble être décalée d'environ 30px dans l'exemple que j'essaie. Une aide ou un conseil ?
Mise à jour
En se basant sur cette question : Lat/lon à xy
J'ai essayé d'utiliser le code fourni mais j'ai toujours des problèmes avec la conversion de la latitude, la longitude est bonne.
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);
Lorsque j'utilise le code original, si la valeur de la latitude est positive, il renvoie un point négatif. Je l'ai donc légèrement modifié et testé avec les latitudes extrêmes, qui devraient être le point 0 et le point 766, et cela fonctionne bien. Cependant, lorsque j'essaie une autre valeur de latitude, par exemple 58.07 (juste au nord du Royaume-Uni), il affiche le nord de l'Espagne.
1 votes
Vos formules ne sont qu'une interpolation linéaire, ce qui implique effectivement que vous faites une projection équirectangulaire plutôt qu'une projection Mercator.
0 votes
J'ai mis à jour le code, mais j'ai toujours des problèmes avec la latitude.
1 votes
Comme l'a mentionné @Drew, si votre carte est une projection de Mercator, vous devrez convertir la lat/lng en x/y en utilisant une projection de Mercator. Vérifiez si votre carte est une Mercator transverse ou une Mercator sphérique, puis nous passerons aux formalités...
0 votes
C'est une projection sphérique de Mercator.