用于足迹的纬度/经度的 Python 排序字典

Posted

技术标签:

【中文标题】用于足迹的纬度/经度的 Python 排序字典【英文标题】:Python sort dictionary of Lat / Lons for Footprint 【发布时间】:2012-01-03 13:22:12 【问题描述】:

我正在计算椭圆体表面的卫星覆盖范围,我的函数返回如下所示的经纬度列表。它是一个 python 字典列表。现在,如果我在 Matlab 或 Matplotlib 中散点图,我会得到一个很好的断开点的 3D 足迹。但是,我希望能够使用 plot(不是 scatter)命令来创建一个平滑的 3D 圆来表示足迹。为了做到这一点,我需要以某种方式对它们进行排序。我已经尝试过Haversine(最大圆距离)来为每个点找到最近的邻居,但是当我有一组更大的值(GEO sats)时,这仍然会给我偶尔的断开线。当足迹跨越赤道时,我还尝试将值拆分为 N 和 S 纬度,然后按经度排序。我可能遗漏了一些东西 - 有没有人有更好/更快的想法来对这样的列表进行排序,以便如果我连接列表中的所有连续点,我会得到一个完整、有序的圆圈?

latLons = ['lat': -33.783781327, 'lon': 137.47747747700001, 'lat': -33.783781326899998, 'lon': 139.63963964000001, 'lat': -33.603601166200001, 'lon': 136.03603603600001, 'lat': -33.423421005500003, 'lon': 134.59459459499999, 'lat': -32.882880523399997, 'lon': 132.43243243200001, 'lat': -32.522520202199999, 'lon': 131.71171171200001, 'lat': -32.342340041600004, 'lon': 145.40540540500001, 'lat': -31.261259078399998, 'lon': 147.56756756799999, 'lat': -31.081078917799999, 'lon': 128.828828829, 'lat': -29.459457473099999, 'lon': 126.666666667, 'lat': -28.558556670200002, 'lon': 125.94594594599999, 'lat': -27.657655866700001, 'lon': 125.225225225, 'lat': -26.936935223300001, 'lon': 151.89189189199999, 'lat': -26.7567550624, 'lon': 124.504504504, 'lat': -25.6756740961, 'lon': 152.61261261300001, 'lat': -25.3153137736, 'lon': 123.78378378399999, 'lat': -23.873872481599999, 'lon': 153.33333333300001, 'lat': -23.333331995999998, 'lon': 123.063063063, 'lat': -19.3693684138, 'lon': 154.05405405400001, 'lat': -15.765765115600001, 'lon': 123.063063063, 'lat': -15.2252246167, 'lon': 153.33333333300001, 'lat': -13.243242777300001, 'lon': 152.61261261300001, 'lat': -12.162161767000001, 'lon': 124.504504505, 'lat': -11.801801428999999, 'lon': 151.89189189199999, 'lat': -10.9009005815, 'lon': 125.225225225, 'lat': -8.1981980155999992, 'lon': 149.00900900900001, 'lat': -6.9369368056800003, 'lon': 147.56756756799999, 'lat': -6.5765764584799999, 'lon': 129.54954954999999, 'lat': -6.5765764584799999, 'lon': 146.84684684699999, 'lat': -5.6756755875199998, 'lon': 130.99099099099999, 'lat': -4.7747747122700002, 'lon': 143.24324324299999, 'lat': -4.23423418502, 'lon': 141.08108108100001, 'lat': -3.8738738326600002, 'lon': 138.198198198]

【问题讨论】:

只是澄清一下-我所有的排序尝试仍然使某些点不正常。如果我绘制排序结果,则会在圆的中心绘制线条。谢谢 - 【参考方案1】:

一种方法是在极坐标中相对于中心点表示您的点,并使用角度作为排序键。

这是一个简单的实现:

import matplotlib.pyplot as plt
import math

def polar_sort(l):
    x, y = zip(*((c['lat'], c['lon']) for c in l))
    ave_x = float(sum(x))/len(x)
    ave_y = float(sum(y))/len(y)

    return sorted(l, key=lambda c: math.atan2(c['lat']-ave_x, c['lon']-ave_y))

latLons = ['lat': -33.783781327, 'lon': 137.47747747700001, 'lat': -33.783781326899998, 'lon': 139.63963964000001, 'lat': -33.603601166200001, 'lon': 136.03603603600001, 'lat': -33.423421005500003, 'lon': 134.59459459499999, 'lat': -32.882880523399997, 'lon': 132.43243243200001, 'lat': -32.522520202199999, 'lon': 131.71171171200001, 'lat': -32.342340041600004, 'lon': 145.40540540500001, 'lat': -31.261259078399998, 'lon': 147.56756756799999, 'lat': -31.081078917799999, 'lon': 128.828828829, 'lat': -29.459457473099999, 'lon': 126.666666667, 'lat': -28.558556670200002, 'lon': 125.94594594599999, 'lat': -27.657655866700001, 'lon': 125.225225225, 'lat': -26.936935223300001, 'lon': 151.89189189199999, 'lat': -26.7567550624, 'lon': 124.504504504, 'lat': -25.6756740961, 'lon': 152.61261261300001, 'lat': -25.3153137736, 'lon': 123.78378378399999, 'lat': -23.873872481599999, 'lon': 153.33333333300001, 'lat': -23.333331995999998, 'lon': 123.063063063, 'lat': -19.3693684138, 'lon': 154.05405405400001, 'lat': -15.765765115600001, 'lon': 123.063063063, 'lat': -15.2252246167, 'lon': 153.33333333300001, 'lat': -13.243242777300001, 'lon': 152.61261261300001, 'lat': -12.162161767000001, 'lon': 124.504504505, 'lat': -11.801801428999999, 'lon': 151.89189189199999, 'lat': -10.9009005815, 'lon': 125.225225225, 'lat': -8.1981980155999992, 'lon': 149.00900900900001, 'lat': -6.9369368056800003, 'lon': 147.56756756799999, 'lat': -6.5765764584799999, 'lon': 129.54954954999999, 'lat': -6.5765764584799999, 'lon': 146.84684684699999, 'lat': -5.6756755875199998, 'lon': 130.99099099099999, 'lat': -4.7747747122700002, 'lon': 143.24324324299999, 'lat': -4.23423418502, 'lon': 141.08108108100001, 'lat': -3.8738738326600002, 'lon': 138.198198198]

x,y = zip(*((c['lat'], c['lon']) for c in polar_sort(latLons)))

plt.plot(x,y)
plt.show()

【讨论】:

【参考方案2】:

我认为常规排序不是您所需要的。在常规排序中,您使用项目之间的绝对顺序。这里没有绝对顺序(“第一”坐标是什么?),只有相对顺序。

首先,我将数据从字典中取出并放入元组列表中:

latlonslist = [ (x['lat'],x['lon']) for x in latLons ]

然后import scipy.spatial 并使用您选择的distance 来查找每个点的最近邻居。当然,您也可以使用欧几里得距离而不使用 scipy。

计算所有可能的距离(应该是n^2 ops),如下所示:

distances =   
for n1 in latlonslist:
  for n2 in latlonslist:
    if n1 == n2:
      continue
    thisdist = scipy.spatial.distance.euclidean(n1,n2)
    distances[n1,n2] = thisdist

然后从任意节点开始遍历节点列表,在每一步中寻找最近的节点。

【讨论】:

以上是关于用于足迹的纬度/经度的 Python 排序字典的主要内容,如果未能解决你的问题,请参考以下文章

python 字典排序

用于根据纬度、经度计算重叠区域的Python包[重复]

python Unicode值和相应名称的排序字典。当UnicodeDecodeErrors发生时,用于向用户提供提示。

如何将动态位置数据加载到字典对象/数组中?

如何从当前位置找到最近的经纬度?

Python根据字典的value进行大小排序