7 votos

La eliminación de los polígonos más pequeños de cierta dimensión utilizando ArcGIS for Desktop?

He hecho un modelo en modelbuilder en Arcmap 10.3, lo que básicamente hace es crear polígonos a través de áreas como la granja de tierras de pastos y tierras, pantanos, etc, ya que tiene una pendiente baja.

Mi reto es que no quiero polígonos que son más pequeños que los de un área específica. digamos que en este ejemplo que el área no puede ser menor de 160m2. Esto es fácil mediante la creación de una expresión de la eliminación de polígonos con menos que eso. Pero estoy interesado en el tamaño real, tiene que ser al menos 40x40m. (diámetro de 40m, si es factible con un círculo vs cuadrado).

Examples

Figura 1 y 2 están bien, ya que ambos tienen un área dentro de la cual se 40x40m, pero la figura 3 no y por lo tanto debe ser eliminado o borrado. También se visualiza el problema de metros cuadrados, como el de la figura 3 tiene la misma área que en la figura 1.

Mientras el polígono tiene una superficie de al menos 40x40 el resto "ruido"o bombillas en el polígono no importa.

Espero que esto le expliqué mi problema es lo suficientemente bueno?

ACTUALIZACIÓN:

@FelixIP dio una solución en la primera respuesta en este post que casi workeds. Pero después de algunas pruebas he encontrado que hay algunos fallos en la salida después de la ejecución de los dos scripts. Solucionado mye problema ya que, por suerte, no hay errores ocurridos en mi análisis de la medida. Aquí hay dos imágenes que muestra a los dos errores que he encontrado:

error1 error2

Como se puede ver aquí, si nos habíamos mudado el punto de que el buffer se hizo, sería posible organizar, de manera que el búfer encajaría dentro del polígono de límites.

De todos modos gracias @FelixIP por el esfuerzo y la ayuda!

10voto

FelixIP Puntos 4035

Usar mi script aquí

para crear puntos en el interior de su polígonos. Cada punto es un centro de máximo círculo inscrito de la parcela. Por favor nota, la secuencia de comandos de prueba en archivos de forma única y no manejar polígonos con agujeros, es decir, donut como polígonos.

Mesa de centro punto contiene el campo theDist, que es el radio del círculo por encima de. enter image description here

Seleccionar todos los puntos con theDist=>20, y crear 20m búferes alrededor de ellos: enter image description here Uso Mínimo de Delimitación de la Geometría para crear rectángulos de búferes enter image description here Adjuntar esta secuencia de comandos para la herramienta sin parámetros. Es una herramienta para ejecutar desde mxd

import arcpy, traceback, os, sys,math
from math import radians,sin,cos

mxd = arcpy.mapping.MapDocument("CURRENT")
parent=arcpy.mapping.ListLayers(mxd,"parent")[0]
child=arcpy.mapping.ListLayers(mxd,"child")[0]

# NUMERIC ! common field
linkField="PAR_ID"
d=arcpy.Describe(parent)
SR=d.spatialReference
g=arcpy.Geometry()
gr=(math.sqrt(5)-1)/2

try:
    def showPyMessage():
        arcpy.AddMessage(str(time.ctime()) + " - " + message)

    #golden section to find minimum
    def gss(a,b,tol):
        c=b-gr*(b-a)
        d=a+gr*(b-a)
        while abs(c-d)>tol:       
            fc=f(c);fd=f(d)
            if fc<fd:
                b=d
                d=c
                c=b-gr*(b-a)
            else:
                a=c
                c=d
                d=a+gr*(b-a)
        return (b+a)/2

    # rotate polygon
    def ShapeMake(pGon,angle):
        ar=arcpy.Array()
        a=radians(angle)
        part=pGon.getPart(0)
        for p in part:
            x,y=p.X-pGon.centroid.X,p.Y-pGon.centroid.Y
            xN=cos(a)*x+sin(a)*y
            yN=-sin(a)*x+cos(a)*y
            pN=arcpy.Point(xN+pGon.centroid.X,yN+pGon.centroid.Y)
            ar.add(pN)
        pgonRotated=arcpy.Polygon(ar,SR)
        return pgonRotated

    #function to minimise
    def f(a):
        pgonRot=ShapeMake(square,a)
        intR=pgonRot.difference(bigPolygon)
        return intR.area

    result=arcpy.GetCount_management(child)
    nF=int(result.getOutput(0))
    initFidList=[]
    arcpy.SetProgressor("step", "", 0, nF,1)
    with arcpy.da.UpdateCursor(child, ("SHAPE@",linkField)) as rows:
        for row in rows:
            square=row[0]
            PID=row[1]
            quer='%s%s%s=%i'%('"',linkField,'"',PID)
            parent.definitionQuery=quer
            bigPolygon=arcpy.CopyFeatures_management(parent,g)[0]
            intR=square.difference(bigPolygon)

            # square fits inside parent without rotation
            if intR.area==0:initFidList.append(PID)
            # find minimum area outside parent at differenr rotations
            else:
                angle=gss(0.0,90,1e-3)
                # square fits if rotated
                if f(angle)==0:
                    row[0]=ShapeMake(square,angle)
                    rows.updateRow(row)
                    initFidList.append(PID)
            arcpy.SetProgressorPosition()

    quer='"FID" IN '+str(initFidList)
    quer='%s%s%s in %s'%('"',linkField,'"',str(tuple(initFidList)))
    parent.definitionQuery=""
    arcpy.SelectLayerByAttribute_management(child, "NEW_SELECTION", quer)


except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()

Script funciona en shapefiles y supone:

  1. que su original polígonos nombre de los PADRES
  2. que tu plazas polígonos nombrado HIJO
  3. Comunes campo numérico "PAR_ID"

Es hijo se ajusta por completo en original, el script agrega esta plaza a la selección. Si no intenta encajar por la rotación alrededor del centro de los puntos, y se añade a la selección en caso de éxito

enter image description here

3voto

John Kramlich Puntos 286

Interesante pregunta!

ACEPTAR el pensamiento en voz alta aquí y no probado así que no puede capturar todas las formas posibles. Parece que va a asignar un tamaño de celda de 10m y que su polígonos rectangulares son raster basados. La lógica que estoy sugiriendo es que sólo funciona si la original trama basada en los polígonos no se toquen entre sí. En @FelixIP respuesta ha polígonos compartir fronteras. Si este es realmente el caso, ¿cómo acerca de este enfoque?

  1. Convertir su polígonos a un binario de la cuadrícula donde una célula cubierto por su polígono se convierte en 1, todo lo demás un 0.
  2. Ejecutar la Focal herramienta de Estadísticas con una ventana circular de 2 píxeles con la SUMA como opción.
  3. Cualquier píxel rodeado de 4x4 1 se resumen a 16.
  4. Entonces, usted puede convertir los píxeles que son 16 en los puntos y las usan para seleccionar los polígonos como el mínimo requerido dimensión. Usted sólo necesita invertir la selección para encontrar los que no quieren.

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