3 votos

Dividir polígonos por polilínea pero con el atributo especificado

Tengo una clase de característica de polígonos (ImportPoly), cada uno de ellos es intersecado por la línea de (ImportLine) y luego nuevos polígonos creados en la clase de característica (OutPoly) con todos los atributos guardados. Necesito cortar cada polígono con una sola línea que tenga el mismo [cut_field] que [cut_field] del polígono. Métodos descritos aquí y aquí no me funcionan realmente, porque cada poli debe ser dividido sólo con la línea correspondiente.

¿Hay alguna forma de escribir algo como "buscar el cursor en ImportPoly e ImportLine, si los campos de corte son iguales entonces usar la herramienta Feature to Polygon para ellos"? picture to illustrate

Edición: la solución de @Hornbydd funciona perfectamente en todos los sentidos menos en el tiempo. Cada iteración tomó aproximadamente 10 segundos, lo que sería una gran cantidad de tiempo para grandes conjuntos de datos.

4voto

John Kramlich Puntos 286

Así que para sus datos de línea tiene un campo llamado campo_de_corte que contiene un valor de identificación numérico y para su conjunto de datos de polígonos también tiene un campo llamado campo_de_corte que tiene una identificación correspondiente? El problema aquí es que sus polígonos se superponen y en algunos casos se superponen completamente 1 o más.

Para procesar un conjunto de datos de este tipo hay que procesar los polígonos de uno en uno, hacer el corte y supongo que fusionar todos los polígonos divididos de nuevo en un único conjunto de datos.

No dices cuántos polígonos quieres cortar, ¿unos cientos o miles de millones? Evidentemente, esto dicta el tipo de solución que va a obtener de la comunidad SIG. Voy a suponer que sólo unos pocos cientos, por lo que una solución de construcción de modelos será adecuada sin necesidad de código python.

Un modelo bastante sencillo, que depende de que tengas una licencia de nivel avanzado, puede conseguirlo.

Puedo convertir esto:

Inputs

en esto:

enter image description here

Utilizando el siguiente modelo:

Model

Un último paso opcional (no mostrado) es fusionar los resultados en una única clase de características.

El modelo está iterando sobre sus valores de campo_de_corte y usando esos para seleccionar una sola línea y un solo polígono. Como todas las herramientas de geoprocesamiento hacen honor a las selecciones, son sólo estas dos geometrías las que se introducen en la herramienta Feature to Polygon para realizar el corte. Por último, el modelo añade un nuevo campo y lo rellena con el ID de cut_field que sale del iterador para que tenga un enlace con los datos originales.

3voto

FelixIP Puntos 4035

Si 1500 clases es demasiado para fusionar, prueba esto:

import arcpy
aDict = {}
def splitMe(shp, BID):
    cutLine = aDict[BID]
    two = shp.cut(cutLine)
    if len(two)==2:return two
    return shp
with arcpy.da.SearchCursor("lines",("Shape@","ID")) as cursor:
    for line,idn in cursor:
        aDict[idn]=line
with arcpy.da.UpdateCursor("polygons",("Shape@","ID")) as cursor:
    for pgon,idn in cursor:
        twoParts = splitMe(pgon, idn)
        lArray = twoParts[0].getPart(0)
        newPgon = arcpy.Polygon(lArray)
        cursor.updateRow((newPgon,idn))

para obtener partes del polígono a la derecha de la línea de corte. Cambiar a dosPartes[ 1 ] para obtener las piezas de la izquierda. Trabajar en las copias del original, porque la escritura modifica las formas en el lugar.

El script utiliza el método de "corte" para el objeto geométrico:

enter image description here

Lamentablemente este método, así (¿mal?) como muchos otros, no funciona dentro de la expresión de la calculadora de campo. Es una pena porque, por encima de la secuencia de comandos puede ser reemplazado por la expresión significativamente más corto.

BTW: ¿qué tipo de superficie hay debajo?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X