Algorithm 谷歌地图缩放算法是什么?

Algorithm 谷歌地图缩放算法是什么?,algorithm,google-maps,Algorithm,Google Maps,我正在研究一种地图缩放算法,它可以在单击时更改区域(地图的一部分可见)坐标 例如,在开始时,该区域具有以下坐标: (0,0)用于左上角 (100100)用于右下角 (100100)表示该区域的中心 当用户点击区域的某个地方,在(x,y)坐标处,我说该区域的新坐标是: (x-(100-0)/3,y-(100-0)/3)用于左上角 (x+(100-0)/3,y+(100-0)/3)用于右上角 (x,y)表示该区域的中心 问题是,该算法并不真正强大,因为当用户单击某个位置时,鼠标下方的点会移动

我正在研究一种地图缩放算法,它可以在单击时更改区域(地图的一部分可见)坐标

例如,在开始时,该区域具有以下坐标:

  • (0,0)用于左上角
  • (100100)用于右下角
  • (100100)表示该区域的中心
当用户点击区域的某个地方,在(x,y)坐标处,我说该区域的新坐标是:

  • (x-(100-0)/3,y-(100-0)/3)用于左上角
  • (x+(100-0)/3,y+(100-0)/3)用于右上角
  • (x,y)表示该区域的中心
问题是,该算法并不真正强大,因为当用户单击某个位置时,鼠标下方的点会移动到该区域的中间

所以我想了解一下谷歌地图中用来改变区域坐标的算法,因为这个算法非常好:当用户点击某个地方时,鼠标下的点会停留在鼠标下,但周围区域的其余部分会被放大


有人知道谷歌是怎么做的?

假设你有一个矩形
windowArea
,它保存绘图区域坐标(即以像素为单位的web浏览器窗口区域),例如,如果你在整个屏幕上绘制地图,左上角有坐标(0,0),那么该矩形将有值:

windowArea.top = 0;
windowArea.left = 0;
windowArea.right = maxWindowWidth;
windowArea.bottom = maxWindowHeight;
您还需要知道可见地图片段,即经度和纬度范围,例如:

mapArea.top = 8.00; //lat
mapArea.left = 51.00; //lng
mapArea.right = 12.00; //lat
mapArea.bottom = 54.00; //lng
缩放时重新计算贴图区域:

mapArea.left = mapClickPoint.x - (windowClickPoint.x- windowArea.left) * (newMapWidth / windowArea.width());
mapArea.top = mapClickPoint.y - (windowArea.bottom - windowClickPoint.y) * (newMapHeight / windowArea.height());
mapArea.right = mapArea.left + newWidth;
mapArea.bottom = mapArea.top + newHeight;
mapClickPoint
将地图坐标保存在鼠标指针下(经度、纬度)。
windowClickPoint
在鼠标指针(像素)下保持窗口坐标。
newMapHeight
newMapWidth
在缩放后保留可见地图片段的新范围:

newMapWidth = zoomFactor * mapArea.width;//lets say that zoomFactor = <1.0, maxZoomFactor>
newMapHeight = zoomFactor * mapArea.height;
newMapWidth=zoomFactor*mapArea.width//假设zoomFactor=
newMapHeight=zoomFactor*mapArea.height;
当您有新的
mapArea
值时,您需要将其拉伸以覆盖整个
windowArea
,这意味着
mapArea。上/左
应绘制在
windowArea。上/左
mapArea。右/下
应绘制在
windowArea.右/下

我不确定google maps是否使用相同的算法,它会给出类似的结果,而且功能相当广泛,但您需要知道窗口坐标以及将被缩放的对象可见部分的某种坐标


让我们用输入(左、右、点击X、比率)在一维中陈述问题 因此,基本上,您希望从左到右的点击率相同:

Left'-clickx    right'-clickx
------------- = --------------
 left-clickx     right-clickx
此外,窗口缩小,因此:

right'-left'   
------------ = ratio
 right-left
因此,解决办法是:

left'  = ratio*(left -clickx)+clickx
right' = ratio*(right-clickx)+clickx

你也可以对其他维度进行同样的操作。

当你将地图的细节放大到有意义的程度时,谷歌会结合使用简单的放大和更详细的地图替换。“除此之外,你还需要知道什么?”凯斯拉姆,谢谢。但这并不是我想知道的。我将编辑我的问题,更具体一些。越具体越好。“读心术需要额外的费用。”@keshlam我编辑了我的问题。你说的“不是很强大”是什么意思?你认为它还能或应该做什么?你认为谷歌还在做什么?非常感谢。这正是我想要的。嗨,米克尔,我刚刚看到你回答了我三年前提出的问题!我向Reflect4You问这个问题是因为我想重现放大反射的缩放算法。