6 votos

Encuentra la esquina inferior izquierda de un polígono girado

Actualmente estoy luchando con un problema matemático y parece que no puede resolverlo.

Tengo un montón de girar polígonos rectangulares (solución también debe trabajar para no polígonos rectangulares) en diferentes shapefiles. Quiero (automáticamente) encontrar la esquina inferior izquierda de cada uno de los polígonos usando python (arcpy).

Primero traté de utilizar simplemente la medida, pero ya que son rotados, la medida traerá resultados falsos. Entonces, ¿cómo me acerco a esta? Busqué en google por horas y la única cosa que se me ocurrió, es de alguna manera calcular el centro de un polígono o de alguna manera temporairly girar a 180 grados y, a continuación, utilizar xmin y ymin. Aquí hay algunas fotos que pueden ayudar a distraer la atención de mi mal inglés (lo siento, por cierto)

enter image description here enter image description here

Yo no tenía problemas de exportación de las coordenadas de los polígonos mediante el uso de la característica de los vértices a los puntos de la herramienta. Hasta ahora he extraído de ellos de una vez en una lista de tupels y una vez en dos listas diferentes (uno para x-coordenadas y uno para y-coords)

así que aquí están algunas coordenadas para facilitar la prueba:

tupel-formato:

tupelList=[[1792398.680577231, 4782539.85121522],
 [1792173.0363913027, 4780368.293228334],
 [1788935.7990357098, 4780713.732859781],
 [1789162.9530321995, 4782885.332685629],
 [1792398.680577231, 4782539.85121522]]

x-lista/y-formato de lista:

xList= [1792398.680577231, 1792173.0363913027, 1788935.7990357098, 1789162.9530321995, 1792398.680577231]

yList=[4782539.85121522, 4780368.293228334, 4780713.732859781, 4782885.332685629, 4782539.85121522]

Actualmente estoy usando ArcGIS 10.3.1 ancho aliado de las extensiones y de una avanzada de la licencia. La versión de Python 2.7.algo

7voto

Örjan Jämte Puntos 3127

He aquí un enfoque muy simple que repercute en todo el procesamiento en el Tipo GP de la herramienta. Puesto que usted tiene acceso a una licencia Avanzada, la clasificación por la forma y el inicio en la esquina inferior izquierda da resultados rápidos.

import os, arcpy

arcpy.env.overwriteOutput = True

inFC = r'<path>'
outFC = r'<path>'

# create output FC to hold points and field to link OID
spatref = arcpy.Describe(inFC).spatialReference
arcpy.CreateFeatureclass_management(*os.path.split(outFC), geometry_type="POINT",
                                    spatial_reference=spatref)
arcpy.AddField_management(outFC, "ID", "LONG")


with arcpy.da.SearchCursor(inFC, ["OID@", "SHAPE@"]) as sCursor:
    with arcpy.da.InsertCursor(outFC, ["ID", "SHAPE@"]) as iCursor:
        for oid, poly in sCursor:

            # using Geometry objects is very quick and also has the added
            # benefit of returning lists of geometries
            # Since we are sorting the vertices by LL, the first one is the answer
            verts = arcpy.FeatureVerticesToPoints_management(poly, arcpy.Geometry())
            sort = arcpy.Sort_management(verts, arcpy.Geometry(),
                                         [["SHAPE", "ASCENDING"]], "LL")[0]
            iCursor.insertRow([oid, sort])

enter image description here

A partir de la explicación sobre la clasificación espacial, vemos que N/S tiene prioridad sobre E/W:

Tenga en cuenta que U obtiene prioridad sobre R. R se toma en consideración sólo cuando algunas de las características están en el mismo nivel horizontal.

4voto

aditya Puntos 11

Dados los ejemplos de los rectángulos y paralelogramos, y si estoy en la comprensión de su formulación de "abajo a la izquierda" (es decir, "la más al sur-oeste") correctamente, un ingenuo solución:

Puede ordenar los cuatro vértices en orden ascendente de latitud(es decir, el sur, el norte es el último). Si los dos son iguales en latitud, su secuencia no importa. Luego, entre los dos sur-la mayoría de los puntos, seleccione el que se encuentra más al oeste. Esto le daría el verde de puntos de las esquinas en esta ilustración:

enter image description here

El siguiente podría ser raras o inexistentes los casos, pero el de arriba se cae a pedazos con un cuadrilátero donde los dos vértices entre el sur y el norte-la mayoría son de igual latitud, tales como un "diamante" de la forma, o alguna deformación de la misma, o incluso cuando un rectángulo perfecto es girado tan:

enter image description here

Para lidiar con firmeza con estos casos, se podría utilizar un enfoque en el que se calcula el eje medial de la forma (https://en.wikipedia.org/wiki/Medial_axis), compara la pendiente del 45 y 135 grados, y determina la "parte inferior" y "superior" de la forma en comparación a eso. A continuación, el progreso como en el anterior, con la west-la mayoría de los dos "inferior" puntos siendo el punto a elegir. Que el trabajo en dos de las arriba ilustradas de los casos. Iba a fallar en el caso de un cuadrado perfecto en el "diamante" de la rotación - pero entonces no hay "naturales" de la esquina inferior izquierda de esa forma. Otra manera de lidiar con estos casos, donde los puntos 2 y 3 en la vertical de la secuencia están a la misma latitud es de tomar realmente el punto 1 del sur, el punto más; o el oeste-la mayoría entre 2 y 3.

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