16

地理的位置座標(緯度および経度)でオブジェクトを作成し、すべてのオブジェクトに5km以内のオブジェクト(つまり半径)を照会できるPythonモジュールはありますか?与えられた座標?地理座標を格納および照会するためのPythonモジュール

私は緯度と経度を辞書のキーとして(キーで索引付けされているように)格納し、いくつかの距離検索アルゴリズムを使用してそれらを照会しようとしています。しかし、これはひどいハックのように感じます。

PostGIS for PostgreSQLのようなものですが、すべて私のPythonアプリケーションのメモリ内にあります。

答えて

16

はい、試してみてくださいgeopy

import geopy 
import geopy.distance 

pt1 = geopy.Point(48.853, 2.349) 
pt2 = geopy.Point(52.516, 13.378) 

dist = geopy.distance.distance(pt1, pt2).km 
# 878.25 

その後、あなたは点のあなたのリストを照会することができます

[pt for pt in points if geopy.distance.distance(orig, pt).km < 5.] 
+0

ありがとうございました。私はそれが完全にジオコーディングのためだと思ったので、私はうんざりに飛び越えました。クエリの例では、 'points'のすべてのオブジェクトをループしませんか? PostGISのポイントのインデックス作成ほど効率的ではない - おそらくデータベースアプローチがより効率的になるだろう。 –

+0

@Jonathan - あなたはそうだ、それはポイントの全体のリストを繰り返します。私はジオピー内でインデックスを作成する可能性についてはわかりません。多分あなたは何かを見つけるでしょう。 – eumiro

5

私は、これはあなたが何を意味するのか、正確ではないですけど、あなたは、インメモリのSQLiteデータベースとGeoDjangoを使用することができます。これは、Webアプリケーションとして公開されているGISツールのフルセットです.GISアプリケーションを迅速に開発するための、特に小規模な特別なクエリのためのスイス軍ナイフです。

1

あなたの辞書のアイデアはそれほど悪くはありませんが、「隣接する」辞書キーにも該当する点をチェックする必要があります。

コーディングアルゴリズムのような適切なツールが見つからない場合は、バイナリスペースパーティションツリーを実装することができます。これは、afaikが同様のことを達成するためのあまりハッキリな方法ではありません。

0

あなたはShapelyを見ましたか?それは遠くのオブジェクトを照会するいくつかの方法を持っています。 Binary Spatial Predicatesをご覧ください。それはちょうどあなたが探しているものかもしれません。

2

GISの通常のアプローチは、関心のあるポイントの周りにバッファを作成し、交差点を照会することです。 @ RyanDaltonが示唆しているように、多くのジオロケーションを処理する予定の場合は、 GIS API for Pythonを使用してください。依然として空間索引が必要な場合でも、Shapelyについて知ることは良いことです(下記参照)。あなたは

distance = 3 
center = Point(1, 1) 
pts = [Point(1.1, 1.2),Point(1.2,1.2)] 
center_buf = a.buffer(distance) 
#filters the points list according to whether they are contained in the list 
contained = filter(center_buf.contains,pts) 

自分できインデックスあなたのポイントあなたは多くを持っていない場合(のは、例えば経度で言わせて):ここで格好の良い内のバッファを作成する方法です。それ以外の場合は、Rtreeパッケージを使用して、Using Rtree as a cheapo spatial databaseというリンクを確認してください!

1

Rtreeという拡張子を持つSQLiteを使用すると、そのような種類のストレージとクエリを正確に実行できます。この方法は、データが使用するメモリよりも大きい場合や、プログラム実行の間にデータを保存および操作したい場合に便利です。実際のストレージとクエリコードはC言語になっているため、コンパイルする必要がありますが、その利点は、ジオピーのような純粋なPythonソリューションに比べて優れたパフォーマンスです。 pysqliteまたはAPSWは、SQLiteアクセスのために動作します。 (私はAPSWの著者です。)

関連する問題