Я пытаюсь преобразовать точку lat/long в точку 2d, чтобы я мог отображать ее на изображении мира - проекции меркатора.
Я видел различные способы сделать это и несколько вопросов о переполнении стека - я опробовал разные фрагменты кода, и хотя я получаю правильную долготу к пикселю, широта всегда выключена - кажется, получается больше разумно.
Мне нужна формула, чтобы учесть размер изображения, ширину и т.д.
Я пробовал этот кусок кода:
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);
В примере, который я пытаюсь, широта, кажется, отключена примерно на 30 пикселей. Любая помощь или совет?
Обновление
Исходя из этого вопроса: Lat/lon to xy
Я попытался использовать предоставленный код, но у меня все еще есть проблемы с преобразованием широты, долгота в порядке.
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);
При использовании исходного кода, если значение широты положительное, оно возвратило отрицательную точку, поэтому я немного изменил его и протестировал с экстремальными широтами, который должен быть точкой 0 и точкой 766, он отлично работает. Однако, когда я пробую другое значение широты ex: 58.07 (только к северу от Великобритании), он отображается как север Испании.