【问题标题】:Convert latitude, longitude to distance from equator in kilometers and round to nearest kilometer将纬度、经度转换为到赤道的距离(以公里为单位)并四舍五入到最近的公里
【发布时间】:2017-03-08 13:46:33
【问题描述】:

对于我拥有的每个坐标,我发现到赤道的距离(以公里为单位)给了我两个距离:

from pyproj import Geod
wgs84_geod = Geod(ellps='WGS84')    
_,_, lon_dist = wgs84_geod.inv(0, 0,lon, 0)
_,_, lat_dist = wgs84_geod.inv(0, 0,0, lat)

作为一个健全的检查,我可以从这些值重新计算原始坐标如下(假设赤道坐标(0,0)的方向是北和西:

_, new_lat, _ = wgs84_geod.fwd(0,0, 0, lat_dist)
new_lon, _, _ = wgs84_geod.fwd(0, 0, 90, lon_dist)

这给了我开始时相同的坐标。

现在我想找到离我的坐标最近的公里点。我将 lon_dist 和 lat_dist 舍入到距离赤道值的公里处。

lat_km_dist = round(lat_dist/1000)*1000 #to nearest km and back to meters
lon_km_dist = round(lon_dist/1000)*1000 

我以与以前相同的方式使用这些距离获取坐标

_, km_lat, _ = wgs84_geod.fwd(0,0, 0, lat_km_dist)
km_lon, _, _ = wgs84_geod.fwd(0, 0, 90, lon_km_dist)

逻辑应该是,对于同一区域的多个坐标,任何km_lat、km_lon对之间的最近距离应该是1km。 这在北/南轴上是正确的,但对于经度,距离取决于我所在的纬度。 我附上两张截图来可视化km_lat,km_lon坐标由面积为1km的多边形中心的黑色圆圈表示的问题。

我该如何纠正这个问题?

【问题讨论】:

    标签: python google-maps coordinates latitude-longitude pyproj


    【解决方案1】:

    这个算法本质上是在赤道(lat=0)和主子午线(lon=0)上构造一个等距网格(点相距1km)。然后,它有效地在椭圆体上构建一个网格,作为这些点的笛卡尔积。

    但是,纬度/经度坐标不构成笛卡尔坐标系,由这些网格点生成的平行线/经线定义了“正方形”,其大小不仅取决于特定的经度,还取决于纬度。在一个完美的球体上,这将在南北方向上起作用,因为那时 lon=0 上的等距(就大圆距离而言)网格在纬度上也是等距的(纬度差等于距离上的差球体的半径)。

    换句话说,如果您固定两个纬度 lat1lat2 并针对特定经度 lon(lat1, lon)(lat2, lon) 移动 1 公里,比如说向西方向,那么这些新获得的点就赢了'没有相同的经度...

    我不完全确定您要达到的目标,但如果目标是获得一些彼此不太接近的代表点,那么就大圆距离而言,hierarchical clustering 可能会提供合理的结果。 .

    编辑:

    作为一种近似的解决方法,您最有可能通过选择除 (0, 0) 之外的另一个参考点来避开 - 新参考点不应离您要描述的区域太远(类似于“底部-left” 感兴趣区域的角)。如果整个感兴趣区域没有覆盖地球的大部分地区(大纬度跨度),那么差异将非常小,因此它们可能在 GoogleMaps 可视化中几乎不可见...

    因此,如果您对丹麦感兴趣(从屏幕截图来看),那么以下内容可能会起作用:

    lat_ref, lon_ref = 53.637976, 6.694138
    
    _,_, lon_dist = wgs84_geod.inv(lon_ref,lat_ref, lon, 0)
    _,_, lat_dist = wgs84_geod.inv(lon_ref,lat_ref, 0, lat)
    
    lat_km_dist = round(lat_dist/1000)*1000 #to nearest km and back to meters
    lon_km_dist = round(lon_dist/1000)*1000
    
    
    _, km_lat, _ = wgs84_geod.fwd(lon_ref,lat_ref,  0, lat_km_dist)
    km_lon, _, _ = wgs84_geod.fwd(lon_ref,lat_ref, 90, lon_km_dist)
    

    【讨论】:

    • 目标是,如您所说,将大量坐标减少为更少的代表性点。这需要独立于数据集,因此在同一区域中给定不同的坐标,底层网格不会改变。出于这个原因,我不想使用集群。有没有办法在这种方法中考虑纬度对经度距离的影响?
    • @clurhur 您可能会尝试更改参考点 - 我已经包含了一个示例...
    • 感谢您。我已经尝试过这种方法,它让我更接近我想要的 1 公里距离。困难在于这依赖于知道这些参考坐标。由于我想在世界任何地方使用这种方法,这需要收集许多这样的参考资料。我看过一个国家中心列表,但是对于跨越大片南北区域的国家,也会出现同样的问题。
    • @clurhur 所以也许是这样的? stackoverflow.com/questions/9600801/…
    • 感谢@ewcz 的提示。我已经采用了使用原始坐标之一作为中心而不是原点 (0,0) 的方法。
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多