我有一张世界Map。
我需要创建一个获得两个双参数(经度和纬度)的函数,该函数应该在Map图像中的该区域上绘制一个小圆圈。
我有关于Map的以下信息:
- Map的宽度(像素
- Map的高度(像素
**我得到了基于该图像的像素X,Y。
我试了经度= -106.346771和纬度= 56.130366;
Map宽度为3840.0,Map高度为2160.0 ;
double x = (longitude + 180) / 360 * mapWidth;
double y = (1 - Math.log(Math.tan(Math.toRadians(latitude)) + 1 /
Math.cos(Math.toRadians(latitude))) / Math.PI) / 2 * mapHeight;
结果:[离子:-106.346771纬度:56.130366]:X:785.6344426666666 Y:671.2084211650845
但没有选择在正确的位置。
enter image description here
2条答案
按热度按时间b4lqfgs41#
不幸的是,这个问题比看起来要难得多。
该贴图是一个投影,因此它相对于数据所在的原始(大致)球面坐标系发生了扭曲。
(实际上,你的lat & long值本身可能在几个不同的投影中的一个,但只有当你做非常精确的测量时,这才真正重要。)
因此,您的第一项工作是找出Map使用的投影,然后开始寻找可以在Java中使用的GIS库(我认为有几个)来执行转换。
nzkunb0c2#
为你的地球仪模型确定半径r。你的Map将是2πr像素宽。确定纬度截止值。你不能把极点投影到平面上,在极端的纬度上,东西会扭曲得无法使用。85度是一个常见的选择。
以弧度表示纬度:纬度_r
你的X坐标是r *(lat_r+ π),那么在180° W你的X坐标是r (-π + π)= 0,在180° E你的X坐标是r (π + π)= 2πr
以弧度表示经度:离子_r
你的Y坐标是r * tan(lon_r)(1 - cos(lon_r))。所以在85° N,你的Y坐标是r * tan(1.4835)(1 - cos(1.4835))= 10.4r