1

PostGIS と GeoDjango をインストールしました。すべてがうまくいきましたが、今は問題があり、その理由がわかりません。

私はこのようなモデルを持っています:

from django.contrib.gis.db import models

class Shop(models.Model):
    name = models.CharField(max_length=80)
    point = models.PointField(null=True, blank=True)
    objects = models.GeoManager()

そして、そのポイントをこの位置 (49.794254,9.927489) に設定しました。次に、次のようなポイントを作成します。

pnt = fromstr('POINT(50.084068 8.238381)')

このポイント間の距離は約 125 km である必要がありますが、これを行うと:

results = Shop.objects.distance(pnt)
print results[0].distance.km

私の結果では常に約 60 km が多すぎるため、190 km が返されます。両方のポイントの SRID は 4326 です...おそらく何か問題がありますか?

そして、私がこれを行うとき、おそらく別の興味深い事実:

pnt.distance(shop.point)

結果として 1.713790... が返されます。

私は何を間違っていますか?Python + Djangoで使用する代替手段はありますか? より良い解決策があれば、PostGIS を使用する必要はありません。

あなたが私を助けてくれることを願っています!

クリス

4

1 に答える 1

4

私はpostgisでこのクエリを実行しました:

select round(CAST(ST_Distance_Sphere(ST_GeomFromText('POINT(49.794254 9.927489)',4326), ST_GeomFromText('POINT(50.084068 8.238381)',4326)) As numeric)/1000.0,2) as distance_km;
 distance_km 
-------------
      190.50

結果は実際には190.50なので、190kmの結果に問題はないようです。

この素晴らしいページと同じ結果で、この距離を計算する方法の簡単な説明があります。

1.713790 ...の結果は、sridの同じ単位であるように見えます。つまり、その数はメートルではありません。

編集 Ooohh私はあなたがlatとlonを置き忘れたあなたの問題を見ました。WKT形式では、経度が最初に来るので、実際のクエリは次のようになります。

select round(CAST(ST_Distance_Sphere(ST_GeomFromText('POINT(9.927489 49.794254)',4326), ST_GeomFromText('POINT(8.238381 50.084068)',4326)) As numeric)/1000.0,2) as distance_km;
 distance_km 
-------------
      125.10

したがって、ポイントは次のように作成する必要があります

POINT(9.927489 49.794254)
POINT(8.238381 50.084068)
于 2012-04-13T20:59:29.580 に答える