Hace dos días, hice una pregunta sobre el orden de almacenamiento interno para los vértices de un polígono en los archivos de forma ESRI. Esa pregunta fue respondida ( ¿Los polígonos se almacenan en sentido horario o antihorario en un archivo de forma? ) Y también se respondió en una publicación anterior ( Creación de polígonos (rotación en sentido horario o no) )
Pero ahora mi pregunta es más general, y no sé si tiene una respuesta única. ¿Es el orden en el sentido de las agujas del reloj solo para los archivos de forma ESRI o para los formatos GIS generales? ¿Y qué hay de la representación interna de un software SIG? Por ejemplo, si uso QGIS y leo un * .shp que contiene polígonos, supongo que la representación interna del límite exterior es en el sentido de las agujas del reloj como en el archivo de forma original, pero ¿qué pasa con todos los formatos de archivo compatibles con QGIS? ¿Y para ArcGIS? Y en el caso de que exista un formato de archivo con polígonos almacenados en sentido antihorario, si estos archivos se cargan en QGIS, ArcGIS, etc., la orientación cambia internamente, por lo que si leo los datos usando PyQGIS, por ejemplo, los polígonos son en sentido horario ¿ordenado?
Mi propósito es escribir un complemento para QGIS, pero la fuente de datos puede ser archivos de forma ESRI u otros formatos. Como necesito verificar los ángulos entre lados consecutivos de polígonos usando sus acimutes, necesito saber si el orden es en el sentido de las agujas del reloj. Una solución es calcular el área de cada polígono y, si no recuerdo mal, si es positivo, el orden es en sentido horario y si es negativo, el orden es en sentido antihorario.
El cálculo del área no es una tarea intensiva, por lo que no ralentizará mucho mi complemento. Pero en el caso especial de QGIS, ¿alguien sabe si almacena los polígonos en sentido horario o antihorario, independientemente del orden en la fuente original? En este momento estoy trabajando con archivos de forma ESRI y las coordenadas en layer.getFeatures (). Geometry (). AsPolygon () se almacenan en sentido horario para el borde exterior y en sentido antihorario para los agujeros, es decir, como en el * .shp original.
fuente
Polygons are oriented correctly. (Exterior ring boundaries must be oriented counterclockwise, and interior ring boundaries must be oriented clockwise.)
que significa que Oracle está en sentido antihorario.Respuestas:
En la especificación OGC, que se puede descargar [aquí], ( http://www.opengeospatial.org/standards/sfs ) dicen:
En los documentos de Oracle , se establece claramente que los límites del anillo exterior están orientados en sentido antihorario, y los límites interiores del anillo, en sentido horario. Del mismo modo, en SQL Server Spatial, el tipo de datos de geografía sigue una regla en sentido antihorario para el anillo exterior y en sentido horario para los anillos interiores; consulte este blog de MicroSoft para obtener más detalles. Postgis parece permitirlo de cualquier manera, para geometrías, y tiene funciones que obligarán a la geometría de un polígono a seguir una regla de la mano derecha o izquierda, vea ST_ForceRHR y ForceLHR . JTS / Geos parecen haber seguido la regla de la mano derecha, es decir, una orientación en el sentido de las agujas del reloj del anillo exterior, por lo que en realidad no está nada claro.
En general, tiene sentido que un tipo de datos de geografía fuerce la orientación, ya que de lo contrario sería imposible saber si un pequeño polígono era solo eso o el anillo interior de un polígono mundial entero. Con un tipo de datos de geometría en una superficie plana, esta confusión no puede surgir, ya que el anillo exterior y el anillo interno siguen en orden, y si solo hay un anillo único, se encerrará (sin importar la orientación), a diferencia de un globo , que se envuelve.
De un comentario de @mxfh: el acceso a funciones simples OpenGIS de OGC (ISO 19125-1) especifica una dirección en sentido antihorario para los anillos exteriores a partir del documento de la versión 1.2.1 [OGC 06-103r4] 6.1.11.1/página 26 de opengeospatial.org / normas / sfa. El cambio se introdujo entre la versión 1.1.0 y 1.2.0 en la última versión de 2006. La nota al pie de la que está citando no se ha actualizado desde 2005
fuente
Se necesitan direcciones de anillo (límite) para evitar ambigüedades en los sistemas de coordenadas geográficas que cubren una superficie finita, ya que el límite definiría dos áreas, una a la izquierda y otra a la derecha del límite a lo largo de su dirección. Es posible determinar cuál de esas dos áreas es la más grande, pero aún deja la ambigüedad.
Aquí hay una descripción general de las direcciones del anillo exterior de los polígonos en varios formatos según sus especificaciones:
El Acceso a funciones simples (ISO 19125-1) también se usa en WKT / GML / KML y varias implementaciones de SQL:
En la mayoría de las implementaciones, el orden de los anillos en un POLYGON es importante (a diferencia de los archivos de forma)
Los anidamientos más profundos, también conocidos como island-in-a-lake-on-an-island -... deben representarse como MultiPolygons ( ver figura 2.10 (4) ), ya que solo puede haber un borde exterior y anidamientos más profundos que los anillos interiores No están definidos.
ESRI Shapefiles / SHP :
Dado que se permiten múltiples límites exteriores, las configuraciones isla-en-un-lago-en-una-isla son posibles con esta definición de polígono. Topológicamente, la isla en un lago sería solo otro anillo exterior en sentido horario. Efectivamente, esto hace que un polígono de archivos de forma ESRI sea una característica simple.
GeoJSON (RFC7946) :
TopoJSON : fuerza los anillos exteriores en sentido horario por defecto
Excursión:
El razonamiento matemático sobre por qué se alternan los órdenes de bobinado de los anillos anidados es que al calcular el área con la fórmula del cordón de zapato ( explicación visual ) se calculan las áreas firmadas dependiendo de la dirección del anillo.
En general, los anillos anidados (límites interiores) se consideran agujeros y tienen la dirección alternativa del anillo exterior. Su valor de área firmada contribuyente es negativo. Donde como anillos externos son positivos. El área total de todas las características del anillo es la suma de todas las áreas firmadas.
Según lo implementado por ESRI, vea esta entrada de la Base de conocimiento: ¿Qué algoritmo utiliza ArcGIS para determinar el área de un polígono?
Nemónica propuesta
Los extremos abiertos de las formas de letras interpretadas como flechas:
fuente
No sé si alguien podrá proporcionar una respuesta definitiva a su pregunta, ya que cada formato de archivo vectorial es diferente y cada SIG, en términos de cómo manejan internamente estos datos, también será diferente. Pero puedo decirle con certeza que el orden en el sentido de las agujas del reloj no es solo para los archivos de forma ESRI. Hay otros formatos que usan una designación similar de ordenamiento en sentido horario para anillos externos y en sentido antihorario para polígonos de orificios interiores. Por ejemplo, la estructura poligonal del vector JTS usa un formato similar. De hecho, se afirma aquí , que históricamente esto iba a ser similar al enfoque ESRI. También puedo decir definitivamente que no, no todos los formatos tienen este requisito. Por ejemplo, las especificaciones de formato GeoJSONno exija dicho requisito sobre el orden de los vértices en su formato poligonal La especificación KML en realidad dice:
Entonces, la gama completa de opciones existe y se implementa por ahí. ¡Es un mundo salvaje!
fuente