2008-08-05 150 views
22

我有一堆纬度/经度对映射到(地理位置失真)地图上已知的x/y坐标。如何将纬度/经度映射到扭曲的地图?

然后我又有一个纬度/经度对。我想尽可能地将其绘制在地图上。我该如何去做这件事?

起初,我决定为三个最近的经纬度点创建一个线性方程组,并计算这些方程的变换,但是这根本不起作用。既然这是一个线性系统,我也不能使用更多的附近点。

你不能假定北方向上:你现在拥有的是现有的纬度/长 - > x/y映射。

编辑:它不是墨卡托投影,或类似的东西。它为了可读性而被任意地扭曲(想想地铁地图)。我只想使用最接近的5到10个映射,这样映射其他部分的变形不会影响我正在计算的映射。

此外,整个地图位于非常小的地理区域,因此不需要担心地球 - 平坦的地球假设足够好。

+0

你尝试过http://trimaps.com吗? – Gilbou 2014-11-14 15:16:21

回答

8

是否还有关于这种失真的更多具体细节?例如,如果您的纬度和经度使用墨卡托投影“扭曲”到您的二维地图上,则转换数学为readily available

如果地图真的被任意扭曲,有很多东西可以尝试,但最简单的可能是从现有的点映射中计算出weighted average。你的权重可以是从你的新点到你现有的每个点的x/y距离的平方的倒数。

一些伪代码:

estimate-latitude-longitude (x, y) 

    numerator-latitude := 0 
    numerator-longitude := 0 
    denominator := 0 

    for each point, 
     deltaX := x - point.x 
     deltaY := y - point.y 
     distSq := deltaX * deltaX + deltaY * deltaY 
     weight := 1/distSq 

     numerator-latitude += weight * point.latitude 
     numerator-longitude += weight * point.longitude 
     denominator += weight 

    return (numerator-latitude/denominator, numerator-longitude/denominator) 

该代码会给出一个比较简单的近似。如果您可以更精确地确定投影扭曲地理坐标的方式,那么您可能会做得更好。

0

问题是球体可能被扭曲了很多种方式,并且所有这些点在赤道上都是已知的,可以说,不会帮助您将点远离地图。

你需要更好的“关闭”点,然后你可以假设这三个点在第四个平面上,并进行插值 - 知道经度距离是一个函数,而不是一个常数。

0

嗯。也许我在这里错过了关于这个问题的一些事情,但是如果你有长/宽的信息,你也有朝北的方向?

看来您需要将测地坐标映射到投影坐标系。例如osgb到wgs84。

涉及的数学是非平凡的,但代码出来只有几行。如果我有更多的时间,我会发布更多,但我需要一个淋浴,所以我会很无聊,并链接到wikipedia条目,这是非常好的。

注意:后淋浴编辑。

2

好的。从理论的角度来看,鉴于失真是“任意的”,任何解决方案都要求您对这种任意失真进行建模,您显然无法得到“答案”。然而,任何解决方案都将涉及(通常隐含地)施加一些可能或可能不反映现实情况的扭曲模型。

由于您似乎对假定某种局部连续性失真映射的模型最感兴趣,最明显的选择是您已经尝试过的一种:最接近点之间的线性插值。超越这一点将需要更复杂的数学和数值分析知识。

但是,您不正确,因为我们假设您无法将其展开为更多点。您可以通过使用最小平方误差方法。找到最小化其他点的误差的线性答案。这可能是最直接的延伸。换句话说,取5个最近的点,并尝试提出一个线性近似,以最小化这些点的误差。并使用它。我会接下来尝试。

如果这样做不起作用,那么N点区域的线性假设就会被破坏。此时您需要升级为二次或立方模型。数学在这一点上会变得忙碌起来。

相关问题