如何将经纬度映射到扭曲的地图上?

25

我有一堆经纬度对应的x/y坐标,这些坐标映射到一个地图上(有地理扭曲)。

然后我有一个经纬度对。我想要将它尽可能最好地绘制在地图上。我该怎么做?

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

你无法假设北方朝上:你所拥有的是现有的经纬度->x/y映射。

编辑:这不是墨卡托投影或类似的东西。它是任意扭曲的,为了易读性(比如地铁图)。我想只使用最近的5至10个映射,以便地图其他部分的扭曲不会影响我试图计算的映射。

此外,整张地图都在一个非常小的地理区域内,因此不需要担心地球——平面地球的假设已经足够好了。


你试过 http://trimaps.com 吗? - Gilbou
4个回答

8
有没有更具体的失真细节?例如,如果您的纬度和经度使用墨卡托投影“扭曲”到二维地图上,则可以使用Mercator投影进行转换计算。
如果地图被完全任意地扭曲,您可以尝试很多方法,但最简单的方法可能是从现有的点映射计算加权平均值。您的权重可以是新点到每个现有点的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)

这段代码提供了一个相对简单的近似值。如果您能更精确地描述投影方式如何扭曲地理坐标,那么您可能可以做得更好。


2

好的,从理论上讲,鉴于畸变是“任意”的,任何解决方案都需要对这种任意畸变进行建模,很明显你无法得到一个“答案”。然而,任何解决方案都将涉及施加(通常是隐含的)某种畸变模型,这种模型可能反映也可能不反映情况的现实性。

既然你似乎最感兴趣的模型假定畸变映射具有某种局部连续性,那么最明显的选择就是你已经尝试过的线性插值:在最近的点之间进行线性插值。如果你想超越这一点,就需要更复杂的数学和数值分析知识。

但是,你错误地认为你不能将此扩展到更多的点。你可以使用最小二乘误差方法来扩展到更多的点。找到使其他点误差最小的线性答案。这可能是最直接的扩展方式。换句话说,取最近的5个点,并尝试提出一种线性近似,使这些点的误差最小化。然后使用它。我建议你接下来尝试这个方法。

如果这个方法不起作用,那么假定在N个点的区域内线性是错误的。这时你就需要升级到二次或三次模型。那时数学将变得复杂。


0
问题在于球体可以以多种方式扭曲,并且仅知道赤道上的所有这些点,不能帮助你映射更远的点。
您需要更好的“接近”点,然后您可以假设这三个点与第四个点在同一平面上,并进行插值——知道经度的距离是一个函数而不是常数。

0

嗯,也许我对问题有所遗漏,但如果您有经纬度信息,那么您也知道北方的方向吗?

看起来您需要将大地坐标映射到投影坐标系统中。例如,从osgb到wgs84。

所涉及的数学问题并不简单,但代码只需几行即可完成。如果我有更多时间,我会发更多内容,但现在我需要冲个澡,所以我会无聊地链接到wikipedia条目,它非常好。

注意:冲完澡后编辑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接