Mais

Encontre o canto esquerdo inferior de um polígono girado


No momento, estou lutando com um problema matemático e não consigo resolvê-lo.

Eu tenho um monte de polígonos retangulares girados (a solução também deve funcionar para polígonos não retangulares) em shapefiles diferentes. Eu quero (automaticamente) encontrar o canto esquerdo inferior de cada um dos polígonos usando python (arcpy).

Primeiro tentei simplesmente usar a extensão, mas como eles são rotacionados, a extensão trará resultados falsos. Então, como faço para abordar isso? Pesquisei por horas no Google e a única coisa que consegui descobrir é calcular de alguma forma o centro do polígono ou girá-lo temporariamente em 180 graus e usar xmin e ymin. Aqui estão algumas fotos que podem ajudar a desviar a atenção do meu péssimo inglês (desculpe por isso)

Não tive problemas ao exportar as coordenadas dos polígonos usando a ferramenta de recurso vértices para pontos. Até agora, extraí-os uma vez em uma lista de tupels e uma vez em duas listas diferentes (uma para x-coords e outra para y-coords)

então, aqui estão algumas coordenadas para facilitar o teste:

formato tupel:

tupelList = [[1792398.680577231, 4782539.85121522], [1792173.0363913027, 4780368.293228334], [1788935.7990357098, 4780713.732859781], [1789162.9530321995, 478281529823823823865125236852368528532 56681], [1789162.9530321995, 47828225236823823686 5823685 5823685, 58236856882368523688236852856882368823685 5823685 582368823685 582368568823685 582368568823685685685 582 568 53688 5368823685 889165.9530321995.

formato de lista x / lista y:

xList = [1792398.680577231, 1792173.0363913027, 1788935.7990357098, 1789162.9530321995, 1792398.680577231] yList = [4782539.85121522, 4780368.293228334, 4780713.73285929781]

Atualmente, estou usando as extensões de largura do ArcGIS 10.3.1 e uma licença avançada. A versão do Python é 2.7. Algo


Aqui está uma abordagem muito simples que descarrega todo o processamento na ferramenta Sort GP. Como você tem acesso a uma licença avançada, classificar por forma e começar no canto esquerdo inferior oferece resultados rápidos.

import os, arcpy arcpy.env.overwriteOutput = True inFC = r ''outFC = r''# criar saída FC para manter pontos e campo para 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") com arcpy.da.SearchCursor (inFC, ["OID @", "SHAPE @"]) como sCursor: with arcpy.da.InsertCursor (outFC, ["ID", " SHAPE @ "]) as iCursor: para oid, poly em sCursor: # usar objetos Geometry é muito rápido e também tem o benefício adicional de retornar listas de geometrias # Como estamos classificando os vértices por LL, o primeiro é a resposta verts = arcpy.FeatureVerticesToPoints_management (poly, arcpy.Geometry ()) sort = arcpy.Sort_management (verts, arcpy.Geometry (), [["SHAPE", "ASCENDING"]], "LL") [0] iCursor.insertRow ([oid, classificar])

A partir da explicação sobre classificação espacial, vemos que N / S tem precedência sobre E / W:

Observe que U tem prioridade sobre R. R é levado em consideração apenas quando alguns recursos estão no mesmo nível horizontal.


Dados os exemplos de retângulos e paralelogramos, e se estou entendendo sua formulação de "inferior esquerdo" (ou seja, "o mais ao sudoeste") corretamente, uma solução ingênua:

Você pode classificar os quatro vértices em ordem de latitude ascendente (ou seja, o mais ao sul é o primeiro, o mais ao norte é o último). Se dois são iguais em latitude, sua sequência não importa. Em seguida, entre os dois pontos mais ao sul, selecione aquele que está mais a oeste. Isso forneceria os cantos pontilhados em verde nesta ilustração:

Os seguintes casos podem ser raros ou inexistentes, mas o acima se desfaz com um quadrilátero onde os dois vértices entre o extremo sul e o extremo norte são de latitude igual, como uma forma de "diamante" ou alguma deformação dela , ou mesmo quando um retângulo perfeito é girado apenas para:

Para lidar de forma robusta com esses casos, você poderia usar uma abordagem que calcula o eixo medial da forma (https://en.wikipedia.org/wiki/Medial_axis), compara sua inclinação a 45 e 135 graus e determina o "fundo "e" topo "da forma em comparação com isso. Em seguida, avance como acima, com o ponto mais a oeste dos dois pontos "inferiores" sendo o ponto a ser escolhido. Isso funcionaria em dois dos casos ilustrados acima. Ele ainda falharia no caso de um quadrado perfeito na rotação do "diamante" - mas não há um canto inferior esquerdo "natural" nessa forma. Outra maneira de lidar com esses casos em que os pontos 2 e 3 na sequência vertical estão na mesma latitude é pegar o ponto 1, o ponto mais ao sul; ou o ponto mais a oeste entre 2 e 3.


Assista o vídeo: Número de diagonais de um polígono e polígonos regulares. (Outubro 2021).