python - pointfield - ¿Qué campo modelo usar en Django para almacenar valores de longitud y latitud?
install geodjango (3)
Quiero almacenar la ubicación de mis usuarios usando longitud y latitud, en este momento proviene de Google Maps, pero usaré GeoDango y algún punto para calcular las distancias entre puntos también.
Sin embargo, mi primera confusión es qué campo en Django debería usar para almacenar los valores de longitud y latitud. La información que obtengo es contradictoria.
La documentación oficial utiliza un
FloatField
https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models
lon = models.FloatField()
lat = models.FloatField()
Donde casi todas las respuestas en stackoverflow muestran un
DecimalField
long = models.DecimalField(max_digits=8, decimal_places=3)
lat = models.DecimalField(max_digits=8, decimal_places=3)
Entonces, ¿qué debo usar?
El flotador es generalmente una aproximación, vea
here
algunos ejemplos simples.
Podría obtener resultados muy agradables modificando su modelo a algo como
DecimalField(max_digits=9, decimal_places=6)
, ya que los decimales son muy importantes en las coordenadas, pero usar más de 6 no tiene sentido.
La sugerencia aquí de usar
DecimalField(max_digits=9, decimal_places=6)
provocó errores al intentar guardar ubicaciones de Google Maps.
Si suponemos que el caso de uso más común es recuperar ubicaciones de puntos de la API de Maps y una URL típica de Google Maps al hacer clic derecho y seleccionar "¿Qué hay aquí?" produce algo como:
https://www.google.com/maps/place/37°48''52.3"N+122°17''09.1"W/@37.814532,-122.2880467,17z
(lugar al azar)
Entonces la longitud tiene 15 lugares antes y después del decimal, por lo que la respuesta aceptada no funciona. Como no hay ninguna razón para validar "lo más corto posible" y el almacenamiento de db es barato, estoy usando:
max_digits=22,
decimal_places=16)
Use PointField para almacenar lat largo
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