2017-08-29 25 views
1

私のモデル都市ではあるが、私の地図には多角形がある。例えば ボゴタには座標-8243997.66798 , 517864.86656がある。しかし私は(4.697857, -74.144554) - > google mapsのような座標を使ってクエリを作成する必要があります。geodjangoクエリ形式座標 - 緯度経度変換、道路地図を開く

pnt = 'POINT(%d %d)'%(lon, lat) 
zonas = ciudad.zona_set.filter(polygon__contains=pnt) 

zonas空である:/、 私は、オープンストリートマップの座標をstandarするlatlonを変換、またはどのように一つの入力(lat,lon)

pnt = GEOSGeometry('POINT(-96.876369 29.905320)', srid=srid_from_lat_lon) 

感謝

ため SRIDコードを知ることができる方法

答えて

0

空間クエリを行うときは、指定された空間参照系(srid)を持つジオメトリを渡すことをお勧めします。このように、GeoDjangoは自動的に入力クエリジオメトリをテーブルの座標系(あなたの場合はあなたの都市モデルの座標系)に変換します。

最初に示したコード例では、ジオメトリにsridを指定しないため、pnt = 'POINT(%d %d)'%(lon, lat)にはsridがありません。この場合、GeoDjangoはsridが入力データとモデルデータテーブルで同じであると仮定します。あなたの例ではそうではありません、そして、それはあなたがマッチを取得しない理由です。

正しいSRIDでポイントを作成する必要があります。 OSMから座標を取得した場合、座標はWeb Mercator projectionであり、座標は3857です。この投影法はWebマッピングでよく使用されます。このため

、あなたはそうのようなEWKT format (which is essentially SRID + WKT)を使用することができます。

pnt = 'SRID=4326;POINT(-96.876369 29.90532)' 

それとも、ウェブメルカトル図法の座標を持っている場合は、次のように動作するはずです:

pnt = 'SRID=3857;POINT(-8243997.66798 517864.86656)' 
zonas = ciudad.zona_set.filter(polygon__contains=pnt) 

ただ、参考のために、ここで

このように(ジオメトリの作成時に指定されたsridを持つ通常のWKT)、次のようにEWKTとGEOSGeometriesの間で戻っていく方法の例がいくつかあります。

GEOSGeometry('POINT(-8243997.66798 517864.86656)', srid=3857) 

この(EWKT列に含まれるSRID)に相当する:

GEOSGeometry('SRID=3857;POINT(-8243997.66798 517864.86656)') 
関連する問題