1

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

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 坐标由面积为 1 公里的多边形中心的黑色圆圈表示的问题。

我该如何纠正这个?

哥本哈根

旧金山

4

1 回答 1

1

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

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

换句话说,如果您固定两个纬度lat1lat2并且对于特定的经度,lon从向西移动 1 公里,那么这些新获得的点将不会具有相同的经度......(lat1, lon)(lat2, lon)

我不完全确定您要达到的目标,但是如果目标是获得一些彼此不太接近的代表点,那么根据大圆距离的层次聚类可能会提供合理的结果...

编辑:

作为一种近似的解决方法,您最有可能通过选择另一个参考点而不是(0, 0)- 新参考点不应该离您要描述的区域太远(类似于“左下角”)感兴趣的领域)。如果整个感兴趣区域没有覆盖全球的大部分地区(大纬度),那么差异将非常小,因此它们可能在 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)
于 2017-03-08T14:17:23.980 回答