Los SIG (como campo) no han funcionado demasiado cuando se trata de lidiar realmente con la superficie del globo.
Por ejemplo, su problema no está completamente definido. A diferencia de 2D, donde sabemos que los bordes de un polígono están compuestos de líneas rectas, ¿qué son en el globo? Los arcos de grandes círculos, que minimizan la distancia entre vértices, son una buena opción, pero no la única. Las líneas rectas (que viajan por debajo de la superficie del globo) son otra opción, por ejemplo. (Las líneas de rumbo también son una opción, pero potencialmente una tonta, especialmente cerca de los polos ...) Aquí hay un excelente enlace Problemas de interpretación de borde WRT: http://blog.opengeo.org/2010/08/10/shape-of -a-polígono /
Otro gran problema con el enfoque de proyecto a 2d y luego intersección, además de las singularidades que otros han mencionado, es que cualquier punto de intersección recién creado (donde se cruzan los bordes del polígono) estará fuera de lugar y dependerá de la proyección utilizada. (Creo que de aquí proviene la recomendación para la densificación: al agregar una tonelada de vértices intermedios, se obtiene un error reducido de la proyección del centro de los bordes del polígono).
Suponiendo que no desea hacer todos los compromisos y soluciones alternativas de proyección a 2D y está buscando pensar y codificar algo usted mismo, he hecho un poco de código prototipo (¡y solo prototipo!) Para un trato con un cliente con este.
Aquí hay un bosquejo del enfoque. Necesitará saber qué es un vector , así como el significado de los productos de punto y cruz . (Advertencia: Wikipedia es conveniente para enlaces rápidos, pero suficiente si es su primera introducción a los temas. Un buen tutorial de gráficos en 3D lo ayudará).
- Representar un punto en la esfera por una unidad vectorial cartesiana en 3D. El punto en la superficie de la tierra es donde, si extendieras el vector en un rayo infinitamente largo, se cruzaría con la superficie de la tierra.
- Representar grandes círculos por un plano a través del origen. (En 3D, un solo vector unitario es suficiente para definir un plano a través del origen; es lo normal al plano). El gran círculo es la intersección de todo el plano con la superficie de la tierra.
- Puede encontrar los puntos de intersección de dos grandes círculos intersectando sus dos planos.
- Defina un arco de un gran círculo por dos puntos. El vector que define el gran círculo normal es el producto cruzado de los vectores de los puntos inicial y final.
- Para determinar si un punto que sabemos que está en el gran círculo se encuentra dentro del arco, cree dos planos de manera que: sean perpendiculares al plano del gran círculo, uno contiene el punto de inicio y el otro contiene el punto final, y están orientados uno frente al otro. Entonces el punto está en el arco si se encuentra en el "interior" de ambos planos. (Para ayudar a visualizar: usted ha creado la sonrisa de pac-man mientras muerde el arco. Si el punto de prueba está entre sus mandíbulas, entonces yace en el arco, como ya sabemos que está en el gran círculo).
- Para determinar si dos arcos se cruzan: encuentre los dos puntos de intersección de sus grandes círculos correspondientes, luego pruebe cada punto para ver si se encuentra dentro de ambos arcos.
- Una definición menos ambigua: un polígono es una colección de puntos, cada uno de los cuales está conectado por aristas que consisten en arcos de grandes círculos. Los puntos están ordenados de tal manera que si caminas a lo largo de la superficie de la tierra a lo largo de los bordes del polígono, el "interior" del polígono estará a tu izquierda. Dejemos los polígonos complejos (islas, agujeros y auto-intersecciones) por ahora.
- Puede saber si un punto está en el lado derecho o izquierdo de un plano mediante el signo del producto escalar de sus vectores correspondientes. (Esto es equivalente a, a medida que viaja alrededor del gran círculo, si el punto en la superficie de la esfera se encuentra a su izquierda o derecha).
- Una prueba precisa para determinar si un punto está dentro de un polígono: ¿se encuentra en el lado izquierdo de todos los bordes?
- Ahora tenemos la capacidad de probar si un punto está dentro de un polígono y determinar los cruces de bordes: ¡los ingredientes para las intersecciones polígono-polígono! El margen de este comentario es demasiado pequeño para escribir un algoritmo completo, pero los pasos básicos son: (a) encontrar todas las intersecciones, luego (b) caminar bordes, alternando en qué polígono estás caminando cuando te encuentras con puntos de intersección.
- Una vez que todo lo anterior esté funcionando, comience a pensar en estrategias de indexación para hacerlo más rápido, ya que el contorno del punto en el polígono I es O (n) en el número de bordes, y la intersección del polígono O (m * n) en número de bordes
Pheew
Este enfoque tiene algunas grandes ventajas: todas las operaciones anteriores se reducen a solo multiplicaciones y sumas. (Después de convertir los datos a esta representación: p. Ej., Coordinado lat / long requiere algo de trigonometría para obtener un vector XYZ cartesiano). No hay singularidades en los polos o en el sistema de coordenadas, y no hay muchos casos especiales de los que preocuparse (ejemplo, caso especial : bordes superpuestos paralelos).
Al echar un vistazo al código, parece que el paquete Spheres que alguien más ha vinculado sigue algunos de estos enfoques, aunque también parece un poco cocido.
PostGIS también puede usar un enfoque similar sobre su tipo de datos de geografía , pero no he mirado debajo del capó. Sé que para la indexación espacial, al menos, usan un árbol R sobre cartesiano 3D.
(Nota: esta respuesta se hizo lo suficientemente larga como para que probablemente la edite en una publicación de blog ... ¡Comentarios / comentarios muy bienvenidos!)