缩放事件后计算地图的新中心

时间:2018-03-29 09:15:03

标签: math openstreetmap

我想弄清楚如何放大地图,这意味着我缩放到鼠标的位置然后再回来。 为此,我必须为每个缩放迭代重新计算地图的中心。

我使用这些公式进行放大并且工作正常

// amount is 1.0 when zooming in and -1.0 when zooming out
newCenterX = (eventPoint.getX() - (mapWidth / 2)) * resolution + center.getX();
newCenterY = ((eventPoint.getY() - (mapHeight / 2)) * resolution / (-amount)) + center.getY();

但不幸的是我无法弄清楚如何缩小,我只是有点无法理解它,所以一些数学爱好者的一些帮助将非常感激。感谢。

2 个答案:

答案 0 :(得分:1)

你的问题不太清楚。我假设您的问题是:如果我在地图上更改缩放,我必须在哪里移动地球上图像中心的位置,以便鼠标仍然指向地球上的相同位置。

我不知道任何合理接近实际情况的封闭公式(即考虑到地球的曲率)。对于一个近距离变焦的简单情况,当您可以通过局部平面矩形逼近地球表面时,问题或多或少会成为放大图像的问题。

我们来介绍一些符号。 Xr - 原始图像(地球)上的实际X位置(以像素为单位)。 Xi - 缩放图像上的位置(以像素为单位)。 W - 缩放视图的宽度(以像素为单位)。 Z - 缩放级别。任何这些符号可能会被索引和/或后缀c另外修改,意思是“中心”。示例:Xrc1 - 原始图像(地球)上缩放级别#1处图像中心的X位置。

如果我们想从Xi计算Xr,则公式为:

(Xi - Xic)*Z = (Xr - Xrc)

显然Xic总是W/2

现在考虑我们有一个缩放级别Z1,鼠标指向Xi,用户可以缩放到其他缩放级别Z2。我们希望找到移动Xrc1的位置,以便我们在真实图像(地球)上的点Xr其投影相同或Xi1 = Xi2 = {{1 }}。所以

Xi

要为(Xi - W/2)*Z1 = (Xr - Xrc1) (Xi - W/2)*Z2 = (Xr - Xrc2) 解决此问题,我们先将Xrc2乘以Z2,将第二个乘以Z1

(Xr - Xrc1)*Z2 = (Xi - W/2)*Z1*Z2 = (Xr - Xrc2)*Z1

所以

Xrc2 = (Xrc1*Z2 + Xr*(Z1-Z2)) / Z1

或者,如果我们使用K作为缩放比例Z2/Z1

的名称
Xrc2 = Xrc1*K + Xr*(1-K)

完整性检查:

  1. 如果Xr = Xrc1,即鼠标指向中心,Xrc2 = Xrc1
  2. 如果鼠标指向角落且K0.5(缩放两次近),则中心应该移近Xr两次。

答案 1 :(得分:0)

问题是我使用了"新决议"由于缩放事件,在它已经改变之后进行计算。相反,我需要"旧决议"这是新决议的一半。

另外,我不得不考虑中心的x偏移,当缩小时,它会被反转。

所以修改后的缩放公式是

Double resolutionFactor = zoomLevels > 0 ? resolution : (resolution / 2);

newCenterX = ((eventX - (mapWidth / 2)) * zoomLevels) * resolutionFactor + oldCenterX;
newCenterY = ((eventY - (mapHeigth / 2)) * resolutionFactor / (-zoomLevels)) + oldCenterY;