6 votos

¿cómo comparar geometrías (contains, within) en arcpy?

Estoy intentando utilizar 2 objetos de geometría para comprobar si una línea está dentro de un polígono (bastante complejo). La comprobación de la geometría siempre falla, aunque la línea esté claramente dentro del polígono. Utilizo el siguiente código:

#get the polygon
sC = arcpy.SearchCursor(polygon)
for row in sC:
    polygonshape = row.Shape
del sC

#creation of the polyline(s):

feature_info = [[[p1.x, p1.y], [x, y]], [[p2.x, p2.y], [x, y]], [[p3.x, p3.y], [x, y]]]
features = []
for feature in feature_info:
    array = arcpy.Array()
    for point in feature:
        P = arcpy.Point()
        P.X = point[0]
        P.Y = point[1]
        array.add(P)
    features.append(arcpy.Polyline(array))

#the actual check:
for item in features:
    in_poly = polygonshape.contains(item) #this is always false

¿Alguna idea de por qué falla esto? He considerado que una de las capas (polígono) tiene un sistema de coordenadas, mientras que la otra no, pero según otra respuesta aquí (que no puedo encontrar ahora mismo) los sistemas de coordenadas son supuestamente ignorados para este tipo de comprobaciones. ¿Podría ser el tamaño/complejidad del polígono un problema?

Si creo una Feature Class de la línea y hago una selección espacial (dentro) después, funciona como se espera. Además: este comportamiento devuelve resultados inesperados tanto para contains como para within.

segment in polygon the whole polygon

4 votos

¿"Los sistemas de coordenadas son supuestamente ignorados para este tipo de comprobaciones"? Dudo mucho que eso sea correcto

1 votos

Sólo una observación rápida, pero creo que deberías desentrañar features.append(arcpy.Polyline(array))

0 votos

@radouxju gracias, tienes razón. Ha sido un error de formato al copiar en SE.

3voto

Tedy Puntos 46

Mi metodología para llevar a cabo esta tarea siempre ha sido utilizar las herramientas de selección de ArcGIS en las capas de características.

Algo así:

arcpy.MakeFeatureLayer_management (polygon, "lyr")

#The check
for item in features:
    arcpy.SelectLayerByLocation_management ("lyr", "CONTAINS", item)
    #Check for selection, i.e. item is contained within polygon
    if arcpy.Describe ("lyr").FIDSet:

item puede no ser una entrada válida para un SelectLayerByLocation select_feature, pero si no la conversión a feature class servirá.

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