我正在尝试将一个 lat/long 点转换成2 d 点,这样我就可以将它显示在世界图像上——这是一个麦卡托投影法。
我已经看到了各种各样的方法来实现这一点,并且还有一些关于堆栈溢出的问题——我已经尝试了不同的代码片段,尽管我得到了正确的经度到像素,但是纬度总是关闭的——看起来似乎变得更加合理了。
我需要的公式,以考虑到图像的大小,宽度等。
我试过这段代码:
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 到 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(就在英国北部)时,它显示为西班牙北部。