美好的一天。 我想将屏幕x,y像素位置(用户点击/点击的位置)转换为地图上的lon / lat位置。
当前屏幕位置位于边界框中,您可以在其中选择左上角和最右下角的lon / lat值。
当屏幕未旋转时,将x / y位置转换为lon,lat值非常简单:
然后每像素宽度= abs(lon2 - lon1)/ screenWidthInPixels
然后每像素高度= abs(lat2 - lat1)/ screenHeightInPixels
然后你可以按照以下方式获得Lon / Lat:
float longitude = ((touchXInPixels) * degreesPerPixelWidth) + mapBoundingBox[1];
float latitude = ((touchYPixels) * degreesPerPixelHeight) + mapBoundingBox[0];
这很容易。我有的问题是在旋转屏幕时计算Lat / Lon值,即:
由此可以看出屏幕现在已经旋转了角度Ө。 -180< Ө< 180
因此,我们假设用户在Sx,Sy点的屏幕FQKD上点击/点击。我怎样才能获得用户点击的新lon / lat值,假设我们在Lat / Lon中有Z和R点,以及角度Ө,以及屏幕高度和宽度(以像素为单位)?
非常感谢任何和所有帮助!
答案 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];