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

我有一些纬度/经度对映射到(地理位置失真)地图上已知的x / y坐标。

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

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

You can't assume North is up: all you have is the existing lat/long->x/y mappings.

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

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

0
额外 编辑
意见: 6
你尝试过 trimaps.com 吗?
额外 作者 Gilbou,

4 答案

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

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

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

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

0
额外

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

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

0
额外

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

如果地图真的被任意扭曲,那么你可以尝试很多东西,但最简单的可能是计算一个现有点映射中的>加权平均值。你的权重可以是从你的新点到你现有的每个点的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
额外

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

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

所涉及的数学不是微不足道的,但代码只有几行。如果我有更多的时间,我会发布更多,但我需要一个淋浴,所以我会无聊,并链接到维基百科条目,这是相当不错的。

注:编辑后的阵雨。

0
额外