Detecta si la geolocalización está en un polígono complejo o no

Actualmente estamos usando el siguiente algoritmo para detectar si un punto geográfico está dentro de un polígono complejo o no. Esto funciona bien, excepto cuando el polígono cruza la línea de longitud de 180 °.

Por ejemplo, el punto (-170, 60) no se detecta en el polígono 160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0

Mire la siguiente imagen: [Img] http://tinypic.com/r/14x2xl1 [/ img] Quiero todo en el recuadro rojo. ¡No la caja amarilla!

public static bool IsCoordinateInPolygon(IList polygon, KMLCoordinate testPoint) { bool result = false; int j = polygon.Count - 1; for (int i = 0; i < polygon.Count; i++) { if (polygon[i].Latitude = testPoint.Latitude || polygon[j].Latitude = testPoint.Latitude) { if (polygon[i].Longitude + (testPoint.Latitude - polygon[i].Latitude) / (polygon[j].Latitude - polygon[i].Latitude) * (polygon[j].Longitude - polygon[i].Longitude) < testPoint.Longitude) { result = !result; } } j = i; } return result; } 

¿Alguien tiene un mejor algoritmo?

El sistema de coordenadas Spheric tiene peculiaridades

Para evitarlos, utilice un sistema de coordenadas cartesianas ortogonales / ortonormales tridimensionales en su lugar

  1. convierte tus vértices de polígono y geolocalización

    entonces (long,lat,alt) -> (x,y,z) . Aquí encontrará cómo hacerlo. No es necesario aplicar la transformación local solo la primera transformación cartesiana esférica a 3D (viñeta n.º 1).

  2. usa cualquier prueba dentro del polígono …

    Normalmente cuento el número de intersecciones entre el lanzamiento de línea desde su geolocalización a cualquier dirección y líneas de límite de polígono.

    • si es impar, entonces el punto está adentro
    • si es incluso entonces, el punto está afuera
    • si el punto se encuentra en cualquier línea de polígono, entonces está dentro
    • si su línea fundida golpea cualquier vértice, tenga en cuenta (no cuente múltiples golpes en este vértice) o cambie la dirección un poco y vuelva a intentarlo

    es el punto dentro del polígono?

[Notas]

¡¡No te olvides de manejar todos los vectores en 3D, no en 2D !!!