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:
Y cambiamos el output_type
parámetro:
Obtenemos las líneas verdes como 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:
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.