5

現在、Python/Numpy を使用して地理/GPS データを処理しています (大好きです!)。座標ペアで定義された地理的ポイント間の距離を計算する繰り返しのタスクに直面していますpn = [lon, lat]

私はこのように使用する関数を持っています:dist = geodistance(p1, p2)これは線形代数 (ベクトル減算/差分) のユークリッド距離に類似していますが、長方形のユークリッド空間ではなく測地 (球) 空間で発生します。

プログラムでは、ユークリッド距離は次の式で与えられます。

dist = ((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)**0.5

数学的には、これは「慣用的な」(より適切な言葉がないため) 文と同等です。

dist = p1 - p1   # the "norm" of the vector difference, subtraction.

現在、私は次のように距離を取得しています。

p1 = [-51.598354,-29.953363]
p2 = [-51.598701,-29.953045]
dist = geodistance(p1, p2)
print dist

>> 44.3904032407

私はこれをしたいと思います:

print p2 - p1  # these points now are from some fancy datatype

>> 44.3904032407

そして最終目標:

track = numpy.array([[-51.203018 -29.996149]
                     [-51.203018 -29.99625 ]
                     [-51.20266  -29.996229]
                     [-51.20229  -29.996309]
                     [-51.201519 -29.99416 ]], dtype=fancy)  # (**) or something like

print numpy.diff(track)

>> ndarray([[   0.        ]
            [   7.03531252]
            [  39.82663316]
            [  41.50958596]
            [ 172.49825765]])

同様に、2 つのオブジェクトを取りdatetime、それらを減算すると、演算はオブジェクトを返しtimedeltaます。2 つの座標を減算し、結果として測地線距離を取得したいと考えています。

クラスが機能するかどうかは疑問ですが、dtype(たとえば、float32の「サブタイプ」)は、リストから配列を作成するときに非常に役立ちます(**これがxmlファイルから読み取る方法です)。

どうもありがとう!

4

2 に答える 2

3

Python 言語リファレンス、§3.4.8、「数値型のエミュレート」

具体的には、__sub__().

于 2012-10-23T23:27:38.807 に答える
3

クラスを作成し、__add__または__sub__メソッドを記述することで、独自の型を定義できます。

例えば:

class P(object):
    def __init__(self, lon, lat):
        self.lon = lon
        self.lat = lat

    def __sub__(self, other):
        dist = ((other.lon - self.lon)**2 + (other.lat - self.lat)**2)**0.5
        return dist

現在、リスト インデックス構文を使用してポイントの座標を取得していることを考えると、それらを実装することもできます。

class P(object):
    def __init__(self, lon, lat):
        self.lon = lon
        self.lat = lat

    def __sub__(self, other):
        dist = ((other[0] - self[0])**2 + (other[1] - self[1])**2)**0.5
        return dist

    def __getitem__(self, key):
        if key == 0:
            return self.lon
        elif key == 1:
            return self.lat
        else:
            raise IndexError

    def __setitem__(self, key, value):
        if key == 0:
            self.lon = value
        elif key == 1:
            self.lat = value
        else:
            raise IndexError

(上記が最もエレガントな方法ではない可能性があることを認識しています)。

そうすれば、新しいクラスは、現在使用しているリストを簡単に置き換えることができます。

Pythonのドキュメントには、ユーザー定義型を作成するために記述する必要がある二重アンダースコア メソッドに関する詳細情報が含まれています。(お探しの情報はページの半分くらいから始まります)

于 2012-10-23T23:32:00.757 に答える