Ordem dos vértices poligonais em geral GIS: no sentido horário ou anti-horário

23

Há dois dias, fiz uma pergunta sobre a ordem interna de armazenamento dos vértices de um polígono nos shapefiles da ESRI. Essa pergunta foi respondida (os polígonos são armazenados no sentido horário ou anti-horário em um shapefile? ) E também foi respondida em um post antigo ( criação de polígono (rotação no sentido horário ou não) )

Mas agora minha pergunta é mais geral e não sei se ela tem uma resposta única. A ordem dos ponteiros do relógio é apenas para shapefiles da ESRI ou para formatos GIS gerais? E a representação interna de um software GIS? Por exemplo, se eu usar o QGIS e ler um * .shp contendo polígonos, suponho que a representação interna do limite externo esteja no sentido horário como no shapefile original, mas e para todos os formatos de arquivo suportados pelo QGIS? E para ArcGIS? E, no caso de existir um formato de arquivo com polígonos armazenados no sentido anti-horário, se esses arquivos forem carregados no QGIS, ArcGIS etc., a orientação será alterada internamente; portanto, se eu ler os dados usando PyQGIS, por exemplo, os polígonos serão no sentido horário ordenou?

Meu objetivo é escrever um plugin para o QGIS, mas a fonte de dados pode ser shapefiles da ESRI ou outros formatos. Como preciso verificar os ângulos entre lados consecutivos dos polígonos usando seus azimutes, preciso saber se a ordem é no sentido horário. Uma solução é calcular a área de cada polígono e, se bem me lembro, se for positivo, o pedido será no sentido horário e, se negativo, o pedido será no sentido anti-horário.

O cálculo da área não é uma tarefa intensiva, por isso não diminuirá tanto o meu plug-in. Mas, no caso especial do QGIS, alguém sabe se ele armazena os polígonos no sentido horário ou anti-horário, independentemente da ordem na fonte original? No momento, estou trabalhando com os shapefiles da ESRI e as coordenadas em layer.getFeatures (). Geometry (). AsPolygon () são armazenadas no sentido horário para a borda externa e no sentido anti-horário para os furos, ou seja, no * .shp original.

jgpallero
fonte
Depende de como os dados são armazenados. O Oracle é anti-horário gis.stackexchange.com/questions/20817/…
Mapperz
@ Mapperz, seu link leva a docs.oracle.com/cd/B10501_01/appdev.920/a96630/…, que indica claramente o Polygons are oriented correctly. (Exterior ring boundaries must be oriented counterclockwise, and interior ring boundaries must be oriented clockwise.)que significa que o Oracle é anti-horário.
user30184

Respostas:

27

Na especificação do OGC, que pode ser baixada [aqui], ( http://www.opengeospatial.org/standards/sfs ), eles declaram:

"A rotação do polígono não é definida por este padrão; a rotação real do polígono pode estar no sentido horário ou anti-horário."

Nos documentos da Oracle , é claramente afirmado que os limites externos do anel são orientados no sentido anti-horário e os limites internos do anel no sentido horário. Da mesma forma, no SQL Server Spatial, o tipo de dados geográfico segue uma regra no sentido anti-horário para o anel externo e no sentido horário para os anéis internos - consulte este blog da MicroSoft para obter mais detalhes. O Postgis parece permitir isso de qualquer maneira, para geometrias, e possui funções que forçam a geometria de um polígono a seguir uma regra da mão direita ou esquerda, consulte ST_ForceRHR e ForceLHR . O JTS / Geos parece ter seguido a regra da mão direita, ou seja, uma orientação no sentido horário do anel externo, por isso é tudo um pouco incerto, na verdade.

Em geral, faz sentido que um tipo de dados geográfico force a orientação; caso contrário, seria impossível dizer se um pequeno polígono era apenas isso ou o anel interno de um polígono do mundo inteiro. Com um tipo de dados de geometria em uma superfície plana, essa confusão não pode surgir, pois o anel externo e o anel interno seguem em ordem e, se houver apenas um anel, ele será fechado (independentemente da orientação), diferentemente de um globo , que envolve.


De um comentário de @mxfh: O OpenGIS Simple Features Access da OGC (ISO 19125-1) especifica uma direção no sentido anti-horário para anéis externos a partir do documento da versão 1.2.1 [OGC 06-103r4] 6.1.11.1/página 26 de opengeospatial.org / normas / sfa. A alteração foi introduzida entre a versão 1.1.0 e 1.2.0 em 2006, mais recente. A nota de rodapé que você está citando não é atualizada desde 2005

John Powell
fonte
Boa resposta, John. Não tenho certeza de que o uso de uma ordem de nós para identificar anéis internos x externos seja a única maneira de um formato de dados vetoriais conseguir isso. Eu concordo com você, porém, que algum mecanismo precisa estar em vigor. Com o GeoJSON, por exemplo, a primeira lista de nós é designada como externa e todas as listas subseqüentes são orifícios internos. Isso funciona como (se não mais) efetivamente.
WhiteboxDev
Sim, isso também se aplica à WKT para geometrias. Para geografias, isso importa muito mais.
John Powell
Isso é muito verdadeiro;)
WhiteboxDev
@WhiteboxDev, a razão pela qual as ordens de enrolamento dos anéis aninhados se alternam é que o cálculo da área com o Método Shoelace calcula as áreas assinadas, dependendo da direção do anel. Em geral, os anéis aninhados de primeira ordem são considerados orifícios e têm a direção alternativa do anel externo. O valor da área de contribuição é negativo. Onde o anel externo é positivo; assim como anéis aninhados de ordem par. Portanto, a área total de todos os recursos do anel é a soma de todas as áreas assinadas.
Mxfh
1
@mxfh: a rigor, "ordens de enrolamento de anéis aninhados" é discutível para os polígonos OCG (e muitos outros) .... pois não é permitido. A maneira de representar um polígono aninhado dentro do "orifício" de outro seria usar um MultiPolygon ... nesse caso, cada polígono constituinte segue as regras originais de enrolamento. OK, OK: isso equivale a alternar o enrolamento de "LinearRings aninhados" ... mas apenas apontando que não é o polígono - por si só - que permite isso, mas a definição do MultiPolygon.
Dan H
23

As direções do anel (limite) são necessárias para evitar ambiguidades nos sistemas de coordenadas geográficas que cobrem uma superfície finita, pois o limite definiria duas áreas, uma esquerda e uma direita do limite ao longo de sua direção. Determinar qual dessas duas áreas é a maior é possível, mas ainda deixa a ambiguidade.

Aqui está uma visão geral das direções dos anéis externos dos polígonos em vários formatos, de acordo com suas especificações:

Ilustração da ordem sinuosa de Shapefiles e recursos simples

  • O Simple Feature Access (ISO 19125-1) também é usado no WKT / GML / KML e em várias implementações SQL:

    • anéis externos: anti-horário
    • anéis internos (orifícios): sentido horário.

    Um polígono é uma superfície plana definida por 1 limite externo e 0 ou mais limites internos. Cada limite interno define um furo no polígono. [...]

    O limite externo LinearRing define o "topo" da superfície, que é o lado da superfície a partir do qual o limite externo parece atravessar o limite no sentido anti-horário . Os interiores LinearRings terá a orientação oposta, e aparecem como no sentido horário quando visto de “top” ... simples possuem especificações de acesso

    Na maioria das implementações, a ordem dos anéis em um POLYGON é importante (em oposição aos shapefiles)

    Para um polígono com orifícios, seu primeiro subelemento é seu anel externo, seu segundo subelemento é seu primeiro anel interno, seu terceiro subelemento é seu segundo anel interno e assim por diante. Oracle Spatial

    Aninhamentos mais profundos, também conhecidos como ilha-em-um-lago-em-uma-ilha -..., devem ser representados como multipolígonos ( veja a figura 2.10 (4) ), pois só pode haver uma borda externa e aninhamentos mais profundos do que os anéis internos não estão definidos.

  • Arquivos de forma ESRI / SHP :

    • anéis externos: sentido horário
    • anéis internos: anti-horário

    Um polígono consiste em um ou mais anéis. Um anel é uma sequência conectada de quatro ou mais pontos que formam um loop fechado e sem auto-interseção. Um polígono pode conter vários anéis externos . A ordem dos vértices ou orientação de um anel indica qual lado do anel é o interior do polígono. A vizinhança à direita de um observador andando ao longo do anel em ordem de vértice é a vizinhança dentro do polígono. Os vértices dos anéis que definem os orifícios nos polígonos estão no sentido anti - horário . Os vértices para um único polígono com anel são, portanto, sempre no sentido horário . [...]

    A ordem dos anéis na matriz de pontos não é significativa. White paper da ESRI

    Como várias fronteiras externas são permitidas, as configurações de ilha-em-um-lago-em-uma-ilha são possíveis com esta definição de polígono. Topologicamente a ilha em um lago seria apenas outro anel externo no sentido horário. Efetivamente, isso torna um polígono de shapefile da ESRI um recurso simples MultiPolygon

    Se você não solicitar os pontos corretamente, terá polígonos sobrepostos. pyshp

  • GeoJSON (RFC7946) :

    NOTA: As especificações originais do GeoJSON 2008 não tinham ordem de enrolamento imposta

    • ordem do enrolamento: o anel externo é no sentido anti-horário (regra da mão direita)
    • anéis internos são no sentido horário
    • ordem dos anéis é importante:

      Para polígonos com vários anéis, o primeiro deve ser o anel externo e os demais devem ser anéis ou orifícios internos. Especificação GeoJSON

  • TopoJSON : força os anéis externos no sentido horário por padrão

Ilustração da ordem sinuosa de Shapefiles e recursos simples

Excursão:

O raciocínio matemático sobre por que as ordens de enrolamento dos anéis aninhados se alternam é que o cálculo da área com a fórmula do cadarço ( explicação visual ) calcula as áreas assinadas, dependendo da direção do anel.

Em geral, os anéis aninhados (limites internos) são considerados orifícios e têm a direção alternativa do anel externo. O valor da área assinada que eles contribuem é negativo. Onde os anéis externos são positivos. A área total de todos os recursos de toque é a soma de todas as áreas assinadas.

Conforme implementado pela ESRI, consulte esta entrada da Base de Conhecimento: Qual algoritmo é usado pelo ArcGIS para determinar a área de um polígono?

Mnemônico proposto

Extremidades abertas de formas de letra interpretadas como setas:

  • S hapefile: S → ᔑ → ↻
  • F simples e atur e s: e → ᘓ (enrolamento para fora cc-sábio) → ↺
  • GeoJSON: G (haste de G é seta) → ↺
mxfh
fonte
4

Não sei se alguém será capaz de fornecer uma resposta definitiva para sua pergunta, pois cada formato de arquivo vetorial é diferente e cada GIS, em termos de como eles lidam internamente com esses dados, também será diferente. Mas posso garantir que o pedido no sentido horário não é apenas para os Shapefiles da ESRI. Existem outros formatos que usam uma designação semelhante de pedido no sentido horário para anéis externos e no sentido anti-horário para polígonos de furos internos. Por exemplo, a estrutura de polígono do vetor JTS usa um formato semelhante. De fato, afirma-se aqui que, historicamente, isso seria semelhante à abordagem ESRI. Também posso dizer definitivamente que não, nem todos os formatos têm esse requisito. Por exemplo, as especificações de formato GeoJSONnão exige nenhum requisito sobre a ordem dos vértices em seu formato de polígono. A especificação KML realmente declara:

Os polígonos devem ser especificados no sentido anti-horário. Os polígonos seguem a "regra da mão direita", que afirma que, se você colocar os dedos da mão direita na direção em que as coordenadas são especificadas, o polegar apontará na direção geral da normal geométrica para o polígono.

Portanto, toda a gama de opções existe e é implementada por aí. É um mundo selvagem!

WhiteboxDev
fonte
1
Observe que a "regra da mão direita" do KML é o que tem sido convencionalmente chamado de "regra da mão esquerda" (quando você caminha no perímetro com os braços estendidos, sua mão esquerda fica dentro da figura). O Esri possui várias abordagens, pois os shapefiles são o único formato que usa a regra do lado direito (os bancos de dados corporativos usam a regra do lado esquerdo internamente, mas a API 'C' permite que você solicite em qualquer ordem). O GML exige apenas que os anéis internos estejam na ordem oposta aos anéis externos e que o primeiro anel seja externo.
Vince
@Vince eu não sabia disso. Isso não é louco? Obrigado por me avisar. Eu acho que gosto mais da abordagem da GML; não importa a ordem, desde que sejam opostas. Isso faz muito sentido.
WhiteboxDev