現時点では、Googleマップから取得した経度と緯度を使用してユーザーの場所を保存したいのですが、GeoDangoといくつかのポイントを使用して、ポイント間の距離も計算します。
ただし、私の最初の混乱は、Django経度と緯度の値を格納するために使用する必要がありますか?取得する情報が矛盾しています。
公式ドキュメントではFloatField
https://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)
それで、私は何を使うべきですか?
フロートは一般に近似値です。いくつかの簡単な例については、 here を参照してください。モデルをDecimalField(max_digits=9, decimal_places=6)
のようなものに変更すると、非常に素晴らしい結果が得られます。座標では小数が非常に重要ですが、6を超える値を使用しても基本的に意味がありません。
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
ここで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)