2012-01-03 4 views
0

私は楕円面上の衛星カバレッジフットプリントを計算していますが、私の関数は以下のようなLat/Lonsのリストを返します。それは辞書のpythonのリストです。今MatlabやMatplotlibでプロットを散布すると、切り離された点の3Dフットプリントが得られます。しかし、フットプリントを表す滑らかな3D円を作成するために、プロット(散乱ではない)コマンドを使いたいと考えています。これを行うために、私は何とかそれらを並べ替える必要があります。私はHaversine(最大の円距離)を試して、各点の最近傍点を見つけましたが、より大きな値(GEO座)のセットを持っているときに、時々切断された線が得られます。私はまた、フットプリントが赤道をまたぐときに値をNとSの緯度に分割し、経度でソートしようとしました。私はおそらく何かが欠けているでしょう - 誰かがこのようなリストをソートするためのより良い/より速いアイデアを持っていますので、リスト内のすべてのシーケンシャルポイントを接続すれば完全な、順序付けられたサークルを得るでしょうか?フットプリント用Lat/LonsのPythonソート辞書

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}] 
+0

:ここ

は単純な実装です。ソートした結果をプロットすると、サークルの中心に線が引かれます。ありがとう - – PhilBot

答えて

1

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() 

enter image description here

+0

魅力のように動作します - 答えてくれてありがとう! – PhilBot

0

私は定期的な並べ替えはあなたが必要と思うものではありません。通常のソートでは、アイテム間の絶対順序を使用します。ここでは、絶対順序はありません(「最初の座標」は何ですか?)、相対座標だけです。

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 

そして、各段階における最も近いノードを探して、任意のノードから開始ノードのリストを歩きます。