8 votos

getPart() método devuelve incorrecto geometría de búfer en ArcGIS

He creado 4 la mayoría de los polígonos básicos:

Sample data

Y encontré este script:

import arcpy
infc = r'D:\Scratch\POLYGONS.shp'
d=arcpy.Describe(infc)
SR=d.spatialReference
with arcpy.da.SearchCursor(infc, ("SHAPE@","LABEL")) as rows:
    for shp,label in rows:
        buf=shp.buffer(5)
        n=buf.partCount
        for i in xrange (n):
            prt=buf.getPart(i)
            pgon=arcpy.Polygon(prt,SR)
            arcpy.AddMessage((int(buf.area),int(pgon.area),label))

SALIDA:

[68735, 68707, u'RECTANGLE']
[29892, 29846, u'TRIANGLE']
[47832, 47832, u'CIRCLE']
[55126, 55060, u"'COMPLEX'"]

Alguien podría ayudarme a entender el resultado.

ACTUALIZACIÓN:

He modificado el código:

import arcpy
infc = r'....POLYGONS.shp'
outBuffer=r'...OUT_BUFFER.shp'
outPart=r'...SCRARCH\OUT_PART.shp'
d=arcpy.Describe(infc)
SR=d.spatialReference
with arcpy.da.SearchCursor(infc, ("SHAPE@","LABEL")) as rows:
    for shp,label in rows:
        buf=shp.buffer(5)
        arcpy.CopyFeatures_management(buf, outBuffer)
        n=buf.partCount
        for i in xrange (n):
            prt=buf.getPart(i)
            pgon=arcpy.Polygon(prt,SR)
            arcpy.CopyFeatures_management(pgon, outPart)
            break

para comprobar real de las formas. Cuando se trabaja con geometrías sería de esperar que la primera parte de una sola parte polígono sería idéntica a la del polígono de sí mismo.

Esta es una superposición de entrada y salida, y se puede ver de donde no coincide ocurrido - en las esquinas:

enter image description here

Algo muy siniestro es acontecimiento dentro de arcpy.Polígono, se simplifica la forma de usar algún tipo de "lógica". El manejo de la verdadera curvas(?). ¿Por qué el resultado es tan feo?

NOTA:

  • mismo resultado obtenido con la exportación a la geodatabase
  • ambas salidas se vino arriba con la entrada de referencia espacial del

Este búfer problema es una parte de un trabajo muy grande, donde tengo que lidiar con posibles por parte de varios polígonos. La solución que estoy usando es la explosión de búfer para piezas individuales, el uso de arcgis herramienta (!). Funciona, pero ridículamente lento debido a que el número de iteraciones. ¿Por qué en la tierra el abc de la geometría de la manipulación no está funcionando?

Si sabes solución diferente de la de mi solución, me voy premio de 200 puntos a su respuesta.

Bien, sucede que, después de la publicación me di cuenta de que no debe ser molestado con partes de la memoria, porque la etiqueta punto de polígono se coloca en el interior de la mayor parte de los polígonos.

10voto

John Kramlich Puntos 286

Esto no es una respuesta, sino algo más de info para esta pregunta. El siniestro comportamiento no se produce a arcpy.Polygon según lo sugerido por @FelixIP, se está produciendo en el getPart() poco de código. He ajustado el código y funcionó en un conjunto de datos con solo un triángulo. Me había puesto el sistema de coordenadas a ser Británica National Grid cuando yo había creado.

import arcpy
arcpy.env.addOutputsToMap = True
infc = "tri"
outBuffer=r'c:\scratch\OUT_BUFFER.shp'
outPart=r'c:\scratch\OUT_PART.shp'
d=arcpy.Describe(infc)
SR=d.spatialReference
with arcpy.da.SearchCursor(infc, ("SHAPE@","LABEL")) as rows:
    for shp,label in rows:
        buf=shp.buffer(5)
        arcpy.CopyFeatures_management(buf, outBuffer)
        n=buf.partCount
        for i in xrange (n):
            prt=buf.getPart(i)
            # Print out sequence of XY points
            print(prt)
            for p in prt:
                print str(p.X ) + "," + str(p.Y)
            pgon=arcpy.Polygon(prt,SR)
            arcpy.CopyFeatures_management(pgon, outPart)
            break

Zoom en una esquina de la zona de el triángulo en el modo de edición podemos ver muchos de los vértices:

Vertices of buffer

De hecho, hay 42 vértices para el conjunto de la geometría. Mi ajustado de lectura de código de la salida de la getPart() devuelve sólo el 11.

Clipped part

Por lo que el error se produzca cuando el getPart() es llamada para devolver la Matriz de Puntos.

7voto

Örjan Jämte Puntos 3127

En lugar de utilizar getPart(), puede utilizar WKT en el búfer polígono sí mismo. No es la forma exacta de la memoria intermedia (debido a la aproximación de las 3 true curvas en el triángulo con 15 vértices de cada uno), pero es muy cerca. De la ayuda:

Cualquier verdadero curvas en el de la geometría densificada en aproximadas curvas en el WKT cadena.

import json
from pandas import DataFrame
import arcpy


header = ("type", "area", "vertices")
sr = arcpy.SpatialReference(3857) #WMAS
coords = [(-10136090, 3460507),
          (-10135313, 3461773),
          (-10134909, 3460488),
          (-10136090, 3460507)]
poly = arcpy.Polygon(arcpy.Array(arcpy.Point(x,y) for x,y in coords), sr)

buffer = poly.buffer(5)
part = arcpy.Polygon(buffer.getPart(0), sr)
wkt = arcpy.FromWKT(buffer.WKT, sr)
wkb = arcpy.FromWKB(buffer.WKB)
densify = arcpy.Polygon(buffer.densify("DISTANCE", 1, .00001).getPart(0), sr)
esriJSON = arcpy.AsShape(json.loads(buffer.JSON), True)

print(DataFrame([("buffer", buffer.area, buffer.pointCount)], columns=header))
df = DataFrame([("getPart", part.area, part.pointCount),
                ("WKT", wkt.area, wkt.pointCount),
                ("WKB", wkb.area, wkb.pointCount),
                ("densify", densify.area, densify.pointCount),
                ("JSON", esriJSON.area, esriJSON.pointCount)],
                 columns=header)
df["delta"] = [v - buffer.area for v in df["area"]]

print(df.sort(columns='delta',ascending=False))

Y aquí está el resultado:

     type            area  vertices
0   buffer  775085.643363         9
      type           area  vertices         delta
4     JSON  775085.643363         9  1.641456e-08
3  densify  775085.633439      4235 -9.923947e-03
1      WKT  775085.297882        43 -3.454809e-01
0  getPart  775041.921399         9 -4.372196e+01
2      WKB  775041.921399         9 -4.372196e+01

Basado en el comentario de abajo de @faith_dur, el camino a seguir es esri JSON!

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