将图像X,Y坐标转换为经度和纬度?
我已经设置了特定静态地图图像的最小经度和纬度值。 该地图图像是某个国家的剪辑。
/**
* Maximum longitude value of the map
*/
private float mapLongitudeMax;
/**
* Minimum longitude value of the map
*/
private float mapLongitudeMin;
/**
* Maximum latitude value of the map
*/
private float mapLatitudeMax;
/**
* Minimum latitude value of the map
*/
private float mapLatitudeMin;
我有一个名为mapImage
的BufferedImage
。
我有一种方法,我可以和一位接收longitude
和latitude
的朋友写信,在地图上给你一个X
和Y
位置,这样你就可以在地图上绘制一些东西。
现在,如果我想在地图上移动鼠标,我希望它显示鼠标位置的longitude/latitude
,这意味着我需要创建一个将鼠标位置的X和Y转换为longitude
和latitude
,与我另一种方法相反。
这是我将地球坐标转换为图像X
和Y
:
protected Location getCoordinatesByGlobe(float latitude, float longitude) {
/**
* Work out minimum and maximums, clamp inside map bounds
*/
latitude = Math.max(mapLatitudeMin, Math.min(mapLatitudeMax, latitude));
longitude = Math.max(mapLongitudeMin, Math.min(mapLongitudeMax, longitude));
/**
* We need the distance from 0 or minimum long/lat
*/
float adjLon = longitude - mapLongitudeMin;
float adjLat = latitude - mapLatitudeMin;
float mapLongWidth = mapLongitudeMax - mapLongitudeMin;
float mapLatHeight = mapLatitudeMax - mapLatitudeMin;
float mapWidth = mapImage.getWidth();
float mapHeight = mapImage.getHeight();
float longPixelRatio = mapWidth / mapLongWidth;
float latPixelRatio = mapHeight / mapLatHeight;
int x = Math.round(adjLon * longPixelRatio) - 3;// these are offsets for the target icon that shows.. eedit laterrr @oz
int y = Math.round(adjLat * latPixelRatio) + 3; //
// turn it up
y = (int) (mapHeight - y);
return new Location(x, y);
}
现在我试着想,头脑里想到的第一个想法就是在做相反的事情...所以我开始这样做,并遇到了类似的问题,我无法获得adjLon
或adjLat
的价值,而没有longitude
或latitude
,所以这不能简单地通过倒转来完成。 我对协调系统都很陌生,所以对我来说这有点令人困惑,但我开始着手追赶它。
任何提示给我?
编辑(它不可能?)
根据这个答案,由于地球不是平坦的,你不能真正得到真正的结果,它不能真正转化为具有经度和纬度的平坦地图,而不实现真正的数学算法以使其适应变化。
我的代码中有几个原因为什么答案不能确切:
所以现在我的问题,如果我的方法真的不可能?
可悲的是,这不是一个简单的答案。 虽然你可以自己编写投影程序,但最简单的做法可能是获得一个GIS库,但是由于我最终是用C#而不是Java来做这件事,所以我不知道有什么可用的。
您需要的最大信息是您的地图图像使用哪种投影。 墨卡托投影颇受欢迎,但并非唯一。 您还需要确保您选择的投影适用于您想要的纬度和经度范围。 如果你开始超过+ 70 N,那么墨卡托投影就会中断,所以如果你在极点上做了很多位置,那可能不是你的投影。
根据我在代码中读取的内容,图像位于经度/纬度坐标中,并将其绘制在画布上以在屏幕上显示。 那么你在这个图像上添加你的监听器是否正确?
如果这是正确的,则响应会变得更加复杂,因为您可以通过Canvas上的MouseListener方法检索图像中的X / Y位置,并根据画布内的鼠标位置(mouseEvent中的方法getX / getY)和当前然后在经度/纬度范围内翻译此位置。
longitude = minLongitude + (MouseEvent.getX/Canvas.Width)*maxLongitude
lalitude = minLaltitude + (MouseEvent.getY/Canvas.Height)*maxLatitude
如果不是,那么你必须知道@ginkner说投影技术用来从long / lat传递到X / Y,并且知道你会丢失一些信息进行逆转换。
地理坐标和几何坐标之间有一个区别,它非常像3D立体表面和画布。 网络墨卡托投影或其他流行的投影坐标系被用于抽象地球表面的可视化。 因此,不同位置的像素偏移会导致不同的距离。
如果您正在寻找一些基本的GIS Java库来处理这类问题,Java中的Geotools可能是一种选择。 GeoTools
链接地址: http://www.djcxy.com/p/92789.html上一篇: Converting image X,Y coordinates to longitude and latitude?