0

楕円体の表面で衛星カバレッジのフットプリントを計算しています。関数は以下のような緯度/経度のリストを返します。Python の辞書リストです。これをMatlabまたはMatplotlibで散布図にすると、切断された点の素晴らしい3Dフットプリントが得られます..しかし、プロット(散布ではない)コマンドを使用して、フットプリントを表す滑らかな3D円を作成できるようにしたいと考えています. これを行うには、何らかの方法でそれらを並べ替える必要があります。各ポイントの最近傍を見つけるために Haversine (最大円距離) を試しましたが、より大きな値のセット (GEO sats) がある場合、これでも時々切断された線が表示されます。また、フットプリントが赤道にまたがる場合は値を北緯と南緯に分割し、経度で並べ替えようとしました。私'

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}]
4

2 に答える 2

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

ここに画像の説明を入力してください

于 2012-01-03T13:48:13.700 に答える
0

通常の並べ替えは必要ないと思います。通常の並べ替えでは、アイテム間に絶対順序を使用します。ここでは、絶対的な順序 (「最初の」座標とは何ですか?) はなく、相対的な順序しかありません。

まず、辞書からデータを取得してタプルのリストに入れます。

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

次に、選択した距離import scipy.spatialを使用して、各ポイントへの最近傍を見つけます。もちろん、scipy に頼らずにユークリッド距離を使用することもできます。

次のようなものを使用して、すべての可能な距離 ( n^2ops である必要があります) を計算します。

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

次に、任意のノードから開始してノード リストをたどり、各ステップで最も近いノードを探します。

于 2012-01-03T13:35:29.553 に答える