Saltar al contenido

Crear líneas a partir de bordes de polígonos con polígono attributes utilizando ArcGIS/ArcPy?

Siéntete libre de compartir nuestros tutoriales y códigos en tus redes, ayúdanos a hacer crecer esta comunidad.

Solución:

Puede hacer esto con la herramienta Intersecar. Normalmente, realizar una intersección con polígonos solo devolverá el área superpuesta. Pero si cambias el output_type desde INPUT a LINE, entonces puede obtener solo los bordes colineales entre los polígonos.

Si esta es nuestra entrada:

Polígonos de entrada

Y cambiamos el output_type parámetro:

Parámetros

Obtenemos las líneas verdes como salida:

Líneas de salida

La salida contiene dos entidades de línea para cada segmento de borde. Para colapsar esto a una característica por segmento de borde, querrá ejecutar Disolver con el multi_part parámetro establecido en SINGLE_PART. Luego, ejecute una unión espacial con sus líneas disueltas como el target_features, las rectas intersecadas como join_features, tu field_mapping configuración con dos campos para cada campo de entrada (uno usando el FIRST fusionar tipo y el otro usando el LAST tipo de fusión) y el match_option ajustado a ARE_IDENTICAL_TO. tu salida attribute la tabla se verá como la siguiente:

tabla de atributos

Puede hacer esto con python si tiene al menos ArcGIS 10.1. Si tiene ArcInfo, puede usar la herramienta De entidad a línea. De lo contrario, puede usar este sencillo script. Este script no es compatible true aunque curvas. Las líneas resultantes, si son topológicamente correctas, deben superponerse, entonces puede ejecutar una intersección de esta línea fc sobre sí misma para encontrar los límites que se superponen, es decir, las líneas de borde.

import arcpy
import os
arcpy.env.overwriteOutput = True

def polys_to_lines(fc, new_fc):

    path, name = os.path.split(new_fc)
    sm = 'SAME_AS_TEMPLATE'
    arcpy.CreateFeatureclass_management(path, name, 'POLYLINE', fc, sm, sm, fc)

    fields = [f.name for f in arcpy.ListFields(new_fc)
              if f.type not in ('OID', 'Geometry')]

    # get attributes
    with arcpy.da.SearchCursor(fc, ['[email protected]'] + fields) as rows:
        values = [(r[0].boundary(),) + tuple(r[1:]) for r in rows]

    # insert rows
    with arcpy.da.InsertCursor(new_fc, ['[email protected]'] + fields) as irows:
        for vals in values:
            irows.insertRow(vals)
    print 'Created: "0"'.format(name)
    return new_fc

if __name__ == '__main__':

    fc = r'C:TEMPparcel_test.shp'
    new = r'C:TEMPparcel_Linetest2.shp'
    polys_to_lines(fc, new)

Aquí puedes ver las reseñas y valoraciones de los lectores

Tienes la opción de confirmar nuestro trabajo exponiendo un comentario y valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *