web-dev-qa-db-ja.com

Djangoで経度と緯度の値を保存するには、どのモデルフィールドを使用しますか?

現時点では、Googleマップから取得した経度と緯度を使用してユーザーの場所を保存したいのですが、GeoDangoといくつかのポイントを使用して、ポイント間の距離も計算します。

ただし、私の最初の混乱は、Django経度と緯度の値を格納するために使用する必要がありますか?取得する情報が矛盾しています。

公式ドキュメントではFloatFieldhttps://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models を使用しています。

lon = models.FloatField()
lat = models.FloatField()

Stackoverflowのほとんどすべての答えはDecimalFieldを示します

long = models.DecimalField(max_digits=8, decimal_places=3)
lat = models.DecimalField(max_digits=8, decimal_places=3)

それで、私は何を使うべきですか?

51
Prometheus

フロートは一般に近似値です。いくつかの簡単な例については、 here を参照してください。モデルをDecimalField(max_digits=9, decimal_places=6)のようなものに変更すると、非常に素晴らしい結果が得られます。座標では小数が非常に重要ですが、6を超える値を使用しても基本的に意味がありません。

74
mccc

PointFieldを使用して緯度経度を保存する

p = Point(85.3240, 27.7172,srid=4326)

Django:1.X:

https://docs.djangoproject.com/en/1.11/ref/contrib/gis/model-api/#pointfield

Django:2.X:

https://docs.djangoproject.com/en/2.2/ref/contrib/gis/model-api/#pointfield

17
Amulya Acharya

ここでDecimalField(max_digits=9, decimal_places=6)を使用するよう提案すると、Googleマップから場所を保存しようとしたときにエラーが発生しました。

最も一般的なユースケースが、Maps APIからポイントの場所を取得し、右クリックして「What's Here?」を選択したときにGoogle Mapsから典型的なURLを取得すると仮定した場合次のような結果が得られます。

https://www.google.com/maps/place/37°48'52.3"N+122°17'09.1"W/@37.814532,-122.2880467,17z

(ランダムな場所)

そのため、経度は小数の前後に15桁あるため、受け入れられた答えが機能しません。 「可能な限り短い」ことを検証する理由はなく、dbストレージは安価なので、私は以下を使用しています。

    max_digits=22,
    decimal_places=16)
2
shacker