2015-06-08 13 views
29

Desidero memorizzare la posizione dei miei utenti utilizzando longitudine e latitudine, al momento proviene da Google Maps, ma userò GeoDango e alcuni punti per calcolare anche le distanze tra i punti.Quale campo modello utilizzare in Django per memorizzare i valori di longitudine e latitudine?

Tuttavia, la mia prima confusione è quale campo in Django I dovrebbe utilizzare per memorizzare i valori di longitudine e latitudine? Le informazioni che sto ottenendo sono contrastanti.

La documentazione ufficiale utilizza un FloatField https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models

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

dove quasi ogni risposta su StackOverflow mostra un DecimalField

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

Allora cosa dovrei usare?

+0

userei un FloatField. – Brandon

+3

Se si dispone di un backend spaziale, è possibile memorizzare tali posizioni in un PointField, rendendo le query spaziali molto più semplici. https://docs.djangoproject.com/en/1.8/ref/contrib/gis/model-api/#pointfield – yellowcap

risposta

46

Float è generalmente un'approssimazione, vedere here per alcuni semplici esempi. Puoi ottenere risultati molto interessanti modificando il tuo modello con qualcosa come DecimalField(max_digits=9, decimal_places=6), poiché i decimali sono molto importanti nelle coordinate, ma l'utilizzo di più di 6 è fondamentalmente privo di significato.

+0

This. E semplicemente usa abbastanza cifre decimali per ottenere la precisione che ti serve. I numeri in virgola mobile sono buoni quando è necessario supportare un ampio intervallo di ordine di grandezza. Si paga per questo con un comportamento di arrotondamento, ecc. A volte sorprendente quando si combinano più valori insieme. –

+6

[Vedi qui per la lunghezza massima delle coordinate.] (Http://stackoverflow.com/questions/15965166/questo-è-la-massima-di-lattezza-e-lunghezza) raccomando 'DecimalField (max_digits = 9 , decimal_places = 6) 'perché" Ogni differenza 000001 nel grado decimale delle coordinate è di circa 10 cm di lunghezza. " e dubito che userete più precisione di quella;) – grokpot

+0

@grokpot super interessante, grazie! – mccc

Problemi correlati