usando bien: traduciendo entre polígonos y polígonos múltiples

12

[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.

BenjaminGolder
fuente
A esta pregunta le falta la información crucial sobre lo que usa para leer el Shapefile.
inc42
@ inc42 Estaba usando python para leer el archivo directamente.
BenjaminGolder
Ah, entonces el poco bien proporcionado es engañoso. Su problema real era descubrir cómo determinar el "tipo" de anillo en el formato Shapefile. :)
inc42

Respuestas:

10

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 ...

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

La geometría debe salir como sigue:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

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.

geographika
fuente
gracias, esto no es lo que estoy buscando, pero vi algunas aclaraciones más que podría hacer a mi pregunta. Para responder a sus preguntas: 1, porque las estoy ordenando para hacer toneladas de intersecciones en primer lugar. 2, nada, solo necesito uno que sea liviano y que pueda usar fácilmente desde python, y no he aprendido ogr. 3, no, no sería más fácil en este caso.
BenjaminGolder
1
¡Guauu! Gracias geographika! Ahora estoy 90% convencido de que ogr es la solución aquí. Me encontré con algunos problemas de instalación con ogr, pero parece que vale la pena resolverlos. Entonces, ¿ogr organiza los anillos en su salida wkt? ¿Y está bien con los archivos de formas 3D (uso muchos 3D)?
BenjaminGolder
Parece que las respuestas a mis preguntas son sí y sí. Y gracias por presentarme a rtree. OGR parece resolver mi problema por completo, siempre que pueda configurar la instalación correctamente esta vez.
BenjaminGolder
Reinstalación de OGR: recuerde que necesitará los binarios para Windows y los enlaces de Python correspondientes.
geographika
9

Primero, use ogr para abrir shapefile:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

convertir geometrías de archivos de formas en geometrías bien formadas

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

Para los polígonos en el multipolígono:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

Y ahora, puede usar todas las funciones de bien proporcionado ( bien proporcionado )

Constancio
fuente
1

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.

realquilar
fuente
Pido disculpas, mi pregunta fue un poco engañosa y la he editado. Tengo los anillos de polígono y sé cuándo tengo una lista de más de un anillo de polígono, pero aparte del orden de los puntos en sentido horario o antihorario, no sé si son anillos interiores o exteriores. Si son anillos interiores, no tengo forma de estar seguro de a qué anillo exterior pertenecen, aparte de medir su ubicación.
BenjaminGolder
Veo. También me alegra ver que has encontrado tu camino hacia ogr. ;)
relet
-2

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:

Un polígono puede contener múltiples anillos externos. El orden de vértices u orientación de un anillo indica qué lado del anillo es el interior del polígono.

PolyGeo
fuente
p.10 lo tiene "Un polígono puede contener múltiples anillos externos. El orden de vértices u orientación de un anillo indica qué lado del anillo es el interior del polígono".
inc42
@ inc42 se actualizó en consecuencia, aunque creo que el número de página debería ser 8 (o 12 de 34).
PolyGeo