GeoDjangoを使用して2点間の距離を取得しますか?[閉まっている]


11

Googleマップで返されるような緯度/経度のGPS座標で定義された2つの場所があります。

http://gmaps-samples.googlecode.com/svn/trunk/geocoder/singlegeocode.html

それらの間の距離を計算する必要があります。google APIを使用できることはわかっていますが、バルククエリを処理するので、自分のサーバーで実行したいです。

ドキュメントで数時間を費やし、geodangoをインストールしましたが、この例は見つかりません。文献のすべては、私が必要とするよりもずっと複雑です。

回答:


9

答えはこのGoogleグループスレッドにあるようです:

from django.contrib.gis.geos import GEOSGeometry
pnt = GEOSGeometry('SRID=4326;POINT(40.396764 -3.68042)')
pnt2 = GEOSGeometry('SRID=4326;POINT( 48.835797 2.329102  )')
pnt.distance(pnt2) * 100

3
POINT()の形式はPOINT(XY)であることに注意してください。おそらくマドリッドの例を挙げようとしていましたが、実際に使用するポイントはそれぞれインド洋とケニアにあります。

6
の目的は* 100何ですか?
クリスチャン・シウピトゥ

4
ポイントをメートル単位の投影に変換してはいけませんか?正確であれば、UTMゾーンを使用してください。>>> pnt.transform(900913)>>> pnt2.transform(900913)>>> pnt.distance(pnt2)1153485.9216961625
monkut

Point未使用のようです
オレグベロソフ

1
この回答は使用しないでください。距離関数は、どのような形式でもSRIDを考慮せず、2D平面上の距離を単に与えます。
ジョナサンリチャーズ


2

Pointも使用できます。

from django.contrib.gis.geos import Point
p1 = Point(37.2676483,-6.9273579)
p2 = Point(37.2653293,-6.9249401)
distance = p1.distance(p2)
distance_in_km = distance * 100

1
この回答は使用しないでください。距離関数は、どのような形式でもSRIDを考慮せず、2D平面上の距離を単に与えます。
ジョナサンリチャーズ

1

Sven MarnachのPythonコードを使用して目的の結果を取得することもできます。結果をメートル単位で取得するためのコード行を追加しました。

コード:

from math import sin, cos, radians, degrees, acos

def calc_dist(lat_a, long_a, lat_b, long_b):
    lat_a = radians(lat_a)
    lat_b = radians(lat_b)
    long_diff = radians(long_a - long_b)
    distance = (sin(lat_a) * sin(lat_b) +
                cos(lat_a) * cos(lat_b) * cos(long_diff))
    resToMile = degrees(acos(distance)) * 69.09
    resToMt = resToMile / 0.00062137119223733
    return resToMt

0

ジオジャンゴライブラリまたは関数を使用しない回答が必要な場合。タグでいくつかの質問と回答を探します。それらは、任意の言語またはフレームワークで機能する数式を提供します。そのような質問の1つは、GPS座標間の距離です


大量の計算を行う最も効率的な方法は空間データベースの内部ロジックを使用することであると推測されるため、むしろジオジャンゴを使用します。そして、私のサイトの残りの部分はdjangoなので、同じフレームワークの下ですべての一貫性を保つといいでしょう。
-MadMaardigan

0

私はジャンゴとジオピーの助けを借りて一度見たソリューションがとても好きでした。それでも、2つ以上のポイントを入力できるようにするために、コードを少し変更しました。

from django.contrib.gis.geos import Point
from geopy.distance import distance as geopy_distance
from itertools import tee, izip


def pairwise(iterable):
    a, b= tee(iterable)
    next(b, None)
    return izip(a,b)

chicago = Point(41.50, 87.37)
san_francisco = Point(37.47, 122.26)
st_louis = Point(38.62, 90.19)
washington = Point(38.53, 77.02)

points = (washington, st_louis, chicago, san_francisco)

d = sum(geopy_distance(a,b).meters for (a,b) in pairwise(points))

distance_km = d/1000
distance_miles = distance_km*0.621371

print "Distance in kilometre: ",distance_km
print "Distance in miles: ",distance_miles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.