python - gdal_library_path - geodjango query
¿Cómo convierto kilómetros a grados en Geodjango/GEOS? (4)
Estoy usando el método "buffer" de la API de GEOS para crear un círculo basado en un punto y un radio en GeoDjango, de acuerdo con esta respuesta: GeoDjango: Cómo crear un círculo basado en punto y radio
Como señaló un comentarista, tendrás que convertir el radio en km a grados ... ¿pero cómo? Supongo que es una fórmula rápida pero es griego para mí. Estaría agradecido por cualquier punteros.
1 grado lat es aproximadamente 110.567 km en el ecuador a 111.699 km en los polos.
Este link
puede ser de su interés. La conversión se basa en la circunferencia de la división de tierra en 360 grados.
1 grado de largo también es aproximadamente 111 km en el ecuador y -> 0 cuando vas a los polos.
La respuesta puede depender de la ubicación en la tierra. Cerca del ecuador, 1 km equivaldrá aproximadamente a 0.008 grados (1 km / 40,000 km * 360 grados) de latitud y longitud, pero cerca de los polos, 1 km equivaldrá aproximadamente a 0.008 grados de latitud, pero podría tener muchos grados de longitud. (Si se encuentra a 1 km del polo, 1 km de recorrido "al oeste" le daría aproximadamente 57 grados de longitud al oeste).
Pero, si la API solo quiere grados a lo largo de un gran círculo como medida, tal vez sería suficiente usar (n km / 40,000 km * 360 grados). Al menos, 40,000km es "lo suficientemente bueno para mí" :) hay números más precisos disponibles .
distancia = grado * PI * diámetro / 360
Usando una estimación aproximada del radio de la tierra: 6378 km
1 grado @ en el Ecuador o en la longitud es: 111.317 km
1 Grado a lo largo de una latitud en x grado latutide es: (grados * PI * diámetro / 360) * cos (latitud)
Entonces @ 60 latitud: 55 659 m en la dirección de longitud.
El buffer en la API django de GEOS creará un búfer usando cualquier unidad que use su sistema de coordenadas actual.
Si está almacenando todo en 4326 (en lat / long degrees), tendrá que encontrar alguna forma complicada de convertir KM en grados. Pero ahora su buffer se distorsionará severamente cuanto más al norte vaya.
Una mejor solución es volver a proyectar su geometría en una proyección que mantenga el área, y con frecuencia ese tipo de proyección puede rastrear unidades en metros.
Por ejemplo, si está creando áreas con búfer en América del Norte, puede usar esta proyección que usa metros http://spatialreference.org/ref/sr-org/7314/
Aquí hay un ejemplo de cómo hacer eso usando la API Django GEOS:
from django.contrib.gis.geos import Point
# Defines a point in lat/long
p = Point(-70, 50)
# This projection defines lat/long coordinate system
p.srid = 4326
# Transform into the 7314 projection using the OGC WKT format to define that projection
p.transform(''PROJCS["NA Lambert Azimuthal Equal Area",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["false_easting",0.0],PARAMETER["false_northing",0.0],PARAMETER["longitude_of_center",-100.0],PARAMETER["latitude_of_center",45.0],UNIT["meter",1.0]]'')
# Creates a buffered polygon of 1000 meters in radius
poly = p.buffer(1000)