mappinggis - Punto en Polígono con geoJSON en Python
geojson tutorial (3)
Tengo una base de datos geoJSON con muchos polígonos (secciones censales específicamente) y tengo muchos puntos largos y largos.
Espero que exista un código de Python eficiente para identificar en qué tramo de censo se encuentra una coordenada dada, sin embargo, hasta ahora mi búsqueda en Google no ha revelado nada.
¡Gracias!
Encontré un article interesante que describe cómo hacer exactamente lo que estás buscando hacer.
TL; DR: Use Shapely
Encontrará este código al final del artículo:
import json
from shapely.geometry import shape, Point
# depending on your version, use: from shapely.geometry import shape, Point
# load GeoJSON file containing sectors
with open(''sectors.json'') as f:
js = json.load(f)
# construct point based on lon/lat returned by geocoder
point = Point(-122.7924463, 45.4519896)
# check each polygon to see if it contains the point
for feature in js[''features'']:
polygon = shape(feature[''geometry''])
if polygon.contains(point):
print ''Found containing polygon:'', feature
Una gran opción para trabajar con estos tipos de datos es PostGIS , un extensor de PostgreSQL datos espacial para PostgreSQL . Personalmente, guardo todos mis datos geográficos en una base de datos de PostGIS y luego los psycopg2
referencia en python usando psycopg2
. Sé que no es python puro, pero tiene increíbles beneficios de rendimiento (que se analizan a continuación) sobre python puro.
PostGIS tiene una funcionalidad integrada para determinar si un punto o forma está dentro de otra forma. La buena documentación sobre la función ST_Within amplía este simple ejemplo:
SELECT
ST_WITHIN({YOUR_POINT},boundary)
FROM census;
-- returns true or false for each of your tracts
El beneficio que obtendrá de PostGIS que probablemente no logrará en otra parte es la indexación, que puede mejorar su velocidad 1,000x [1], lo que lo hace mejor que incluso el programa C mejor escrito (a menos que el programa C también cree un índice para tu información). La base de datos, cuando se configura correctamente, almacenará en caché la información sobre sus tratados, y cuando pregunte si un punto está dentro de un tramo, no tendrá que buscar todo ... puede aprovechar su índice.
Obtener datos dentro y fuera de PostGRES es bastante simple. Aquí puede encontrar un excelente tutorial que lo guiará a través de los conceptos básicos de PostGIS con conjuntos de datos de muestra que no son muy diferentes a los suyos. Es razonablemente largo, pero si eres nuevo en PostGIS (como lo fui), estarás muy entretenido y emocionado todo el tiempo:
http://workshops.boundlessgeo.com/postgis-intro/
[1] La indexación disminuyó la búsqueda de un vecino más cercano en una de mis enormes bases de datos (20 m de 53 segundos a 8.2 milisegundos).
Uno no puede tener un código geométrico realmente rápido en Python. En cambio, el enfoque habitual es usar una biblioteca rápida de C / C ++ con envoltorios de Python.
Por ejemplo, puede comenzar con CGAL, una biblioteca geométrica de C ++ muy completa. Tiene enlaces de Python para la mayoría de sus rutinas, consulte el enlace http://code.google.com/p/cgal-bindings/ .