[EDITAR: la solución a esto fue simplemente usar OGR para leer archivos de forma. Ver el ejemplo de geographika.]
En un archivo de forma ESRI, no hay distinción entre Polígonos y MultiPolygons. Además, no existe una distinción explícita entre los agujeros interiores y los anillos exteriores (además de la "mano" de un polígono dado).
Entonces, después de leer un archivo de forma, tengo una lista de secuencias de coordenadas que describen los anillos, pero sin un procesamiento más intenso, no puedo distinguir cuáles de estos anillos son anillos exteriores, agujeros interiores o polígonos adicionales.
Parece que para bien formada 's constructores polígono y MultiPolygon, tiene que haber una clara distinción entre el exterior y los anillos interiores, así que ¿cómo debería pasar de una lista clara de los anillos de un conjunto ordenado de polígonos separados, con un interior claramente designada y los anillos exteriores ?
Para resumir: si tengo una lista de anillos de polígonos, pero no sé qué anillos son agujeros en el interior o son polígonos separados, ¿cómo debo clasificarlos mejor en polígonos separados con agujeros interiores designados?
Estoy buscando una solución algorítmica simple que pueda implementar en python, que pueda usarse para procesar cientos de polígonos en ~ un minuto o menos, y lo estoy haciendo para realizar una gran cantidad de intersecciones.
Respuestas:
Además de la respuesta de relet sobre cómo obtener polígonos individuales, puede ejecutar una intersección en todos los polígonos para crear los agujeros. Si su conjunto de datos contiene polígonos superpuestos, aunque no tenga suerte.
Explique nuevamente qué está mal con los lectores de archivos de forma existentes.
¿No sería más fácil exportar ID de entidades y valores M desde el archivo de forma y luego volver a unirlos a los polígonos después de usar un lector de archivos de forma existente?
Para los multiparches, puede usar la misma técnica de asignar ID de polígono a un "ID de parche" y luego agregar este atributo nuevamente a las características.
Editar: Mientras dices que no quieres usar OGR, en caso de que cambies de opinión ...
La geometría debe salir como sigue:
El primer soporte contiene los cordones del anillo exterior, los soportes posteriores los cordones de los anillos interiores. Si tiene valores Z, los puntos deben tener el formato 79285 57742 10 (donde el último coord es una altura).
De lo contrario, podría usar las funciones Shapely Contains y Within para evaluar cada polígono entre sí y aplicar un índice espacial de antemano: http://pypi.python.org/pypi/Rtree/ para acelerar el procesamiento.
fuente
Primero, use ogr para abrir shapefile:
convertir geometrías de archivos de formas en geometrías bien formadas
Para los polígonos en el multipolígono:
Y ahora, puede usar todas las funciones de bien proporcionado ( bien proporcionado )
fuente
No estoy muy familiarizado con la forma en que los polígonos se almacenan realmente en archivos de formas, pero ¿no debería un anillo poligonal ser un bucle cerrado si y solo si se repite la coordenada de inicio? Entonces, si compara cada coordenada subsiguiente con la coordenada inicial, encontrará el primer punto donde se cierra un polígono. Si esa es la última coordenada del polígono, es un polígono simple; de lo contrario, es un multipolígono y requiere procesar los otros bucles.
Ese podría ser el 'procesamiento más intensivo' que desea evitar, pero en realidad es solo una iteración a través de las coordenadas que viene de forma gratuita cuando tiene que leerlas de todos modos.
fuente
Como lo indica @ inc42 , en la página 8 del ESRI Shapefile Descripción técnica: un documento técnico de ESRI - Julio de 1998 (página 12 de 34 en el PDF) hay una discusión sobre el contenido del registro de polígonos que puede ser lo que busca:
fuente