为了账号安全,请及时绑定邮箱和手机立即绑定

在两个经纬度点之间生成更多点

在两个经纬度点之间生成更多点

慕的地10843 2021-08-14 16:33:15
在二维平面中,给定两个点(x1, y1)和(x2, y2),N沿着两点之间的直线生成等距的点是直接的。这也适用于 3D 平面。但是,我正在尝试弄清楚您将如何处理地理坐标点。为了进一步说明我的观点,假设你有一个点 A ,(latA, lonA)它代表它的纬度和经度,另一个点 B 代表它的纬度和经度(latB, lonB)。你将如何N在 A 和 B 之间生成点?是否有一个简单的库python可以实现这一目标?
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

您可以直接使用 numpy 执行此操作。这个想法是使用 3D 空间的标准插值公式,如A + d * (B - A). 像这样计算的点位于 A 和 B 之间的弦上,但可以投影回球体。

为了在角度上有一个均匀的分布,我们需要从角度到弦上距离的映射,就像这里的图中

//img1.sycdn.imooc.com//61177fe800017bd603260245.jpg

这显示了均匀间隔角度的弦位置,并使用以下代码生成以检查正确性,因为所有角度和三角函数都很容易弄乱。


def embed_latlon(lat, lon):

    """lat, lon -> 3d point"""

    lat_, lon_ = np.deg2rad(lat), np.deg2rad(lon)

    r = np.cos(lat_)

    return np.array([

        r * np.cos(lon_),

        r * np.sin(lon_),

        np.sin(lat_)

    ]).T


def project_latlon(x):

    """3d point -> (lat, lon)"""

    return (

        np.rad2deg(np.arcsin(x[:, 2])),

        np.rad2deg(np.arctan2(x[:, 1], x[:, 0]))

    )


def _great_circle_linspace_3d(x, y, n):

    """interpolate two points on the unit sphere"""

    # angle from scalar product

    alpha = np.arccos(x.dot(y))

    # angle relative to mid point

    beta = alpha * np.linspace(-.5, .5, n)

    # distance of interpolated point to center of sphere

    r = np.cos(.5 * alpha) / np.cos(beta)

    # distance to mid line

    m = r * np.sin(beta)

    # interpolation on chord

    chord = 2. * np.sin(.5 * alpha) 

    d = (m + np.sin(.5 * alpha)) / chord


    points = x[None, :] + (y - x)[None, :] * d[:, None]

    return points / np.sqrt(np.sum(points**2, axis=1, keepdims=True))


def great_circle_linspace(lat1, lon1, lat2, lon2, n):

    """interpolate two points on the unit sphere"""

    x = embed_latlon(lat1, lon1)

    y = embed_latlon(lat2, lon2)

    return project_latlon(_great_circle_linspace_3d(x, y, n))


# example on equator

A = 0, 0.

B = 0., 30.


great_circle_linspace(*A, *B, n=5)

(array([0., 0., 0., 0., 0.]), array([ 0. ,  7.5, 15. , 22.5, 30. ]))


查看完整回答
反对 回复 2021-08-14
  • 1 回答
  • 0 关注
  • 434 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号