屏幕X,Y坐标转换为映射Lon / Lat坐标

时间:2015-03-13 06:10:02

标签: java c#

美好的一天。 我想将屏幕x,y像素位置(用户点击/点击的位置)转换为地图上的lon / lat位置。

当前屏幕位置位于边界框中,您可以在其中选择左上角和最右下角的lon / lat值。

当屏幕未旋转时,将x / y位置转换为lon,lat值非常简单:

  • 让mapboudingbox [0,1]包含最左上角的lat / lon
  • mapboundingbox [2,3]包含最右下角的lat / lon

然后每像素宽度= abs(lon2 - lon1)/ screenWidthInPixels

然后每像素高度= abs(lat2 - lat1)/ screenHeightInPixels

然后你可以按照以下方式获得Lon / Lat:

 float longitude = ((touchXInPixels) * degreesPerPixelWidth) + mapBoundingBox[1];
 float latitude = ((touchYPixels) * degreesPerPixelHeight) + mapBoundingBox[0];

这很容易。我有的问题是在旋转屏幕时计算Lat / Lon值,即: Rotated Screen

由此可以看出屏幕现在已经旋转了角度Ө。 -180< Ө< 180

因此,我们假设用户在Sx,Sy点的屏幕FQKD上点击/点击。我怎样才能获得用户点击的新lon / lat值,假设我们在Lat / Lon中有Z和R点,以及角度Ө,以及屏幕高度和宽度(以像素为单位)?

非常感谢任何和所有帮助!

2 个答案:

答案 0 :(得分:1)

我只想修改2D的标准旋转和缩放算法。请阅读一下:
2dTransformations

答案 1 :(得分:1)

实现这一目标的最简单方法是使用矩阵。

3x3矩阵可以描述旋转,平移和在2D空间中缩放。

使用此矩阵,您可以将地图图像投影到屏幕区域。使用矩阵的逆矩阵,您可以在屏幕空间中取一个点来映射空间。

伪代码:(因为你不在乎什么语言)

构建矩阵:

var matrix = Matrix.newIdentity();
matrix.postAppendTranslate(tx, ty);
matrix.postAppendScale(zoom);
matrix.postAppendRotate(rot);

使用该矩阵渲染地图图像。

要反转新闻:

var inverseMatrix = matrix.inverse();
var point = new float[]{touchPointX, touchPointY, 1};
var transformedPoint = inverseMatrix.multiply(point);
var mapX = transformedPoint[0];
var mapY = transformedPoint[1];
相关问题