关于数学:如何将经度/纬度映射到变形的地图?

关于数学:如何将经度/纬度映射到变形的地图?

How to map a latitude/longitude to a distorted map?

我有一堆纬度/经度对,它们映射到(地理上扭曲的)地图上的已知x / y坐标。

然后我又有一个纬度/经度对。我想尽可能地将其绘制在地图上。我该怎么做呢?

最初,我决定为三个最接近的经/纬点创建一个线性方程组,并从中计算出一个变换,但这根本行不通。由于这是一个线性系统,因此我也不能使用更多附近的点。

您不能假设North已经启动:您所拥有的只是现有的lat / long-> x / y映射。

编辑:这不是墨卡托投影,或类似的东西。它的可读性被任意扭曲(想想地铁地图)。我只想使用最接近的5到10映射,以便映射其他部分的失真不会影响我尝试计算的映射。

此外,整个地图都位于很小的地理区域内,因此无需担心地球-地面假设就足够了。


关于失真的种类,是否还有更具体的细节?例如,如果使用墨卡托投影将您的纬度和经度"扭曲"到2D地图上,则转换数学很容易获得。

如果地图确实被任意扭曲,您可以尝试很多方法,但是最简单的方法可能是从现有的点映射计算加权平均值。您的权重可以是从新点到每个现有点的x / y距离的平方的倒数。

一些伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)

该代码将给出一个相对简单的近似值。如果您可以更精确地了解投影扭曲地理坐标的方式,则可能会做得更好。


好的。从理论上讲,鉴于失真是"任意的",并且任何解决方案都需要对这种任意失真进行建模,因此显然无法获得"答案"。但是,任何解决方案都将涉及(通常是隐式地)施加某种畸变模型,该模型可能会也可能不会反映实际情况。

由于您似乎对假定变形映射具有某种局部连续性的模型最感兴趣,因此最明显的选择是您已经尝试过的选择:最近点之间的线性插值。除此之外,还需要更复杂的数学和数值分析知识。

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

如果这不起作用,则将打破N点区域上的线性假设。届时,您需要升级到二次模型或三次模型。那时数学会变得很忙。


嗯。也许我在这里缺少有关此问题的信息,但是如果您有长期/滞后的信息,那么您是否也有向北的方向?

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

所涉及的数学并非易事,但代码只有几行。如果我有更多时间,我会发布更多内容,但我需要冲个澡,所以我会很无聊,并链接到Wikipedia条目,这是相当不错的。

注意:淋浴后已编辑。


问题在于球体可以通过多种方式变形,并且使所有这些点在赤道上已知,可以说,这不会帮助您将点映射得更远。

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


推荐阅读