Rileva se la geolocalizzazione è in poligono complesso o no

Attualmente stiamo utilizzando il seguente algoritmo per rilevare se un punto geografico si trova all’interno di un poligono complesso o meno. Funziona bene, tranne quando il poligono attraversa la linea di 180 ° di longitudine.

Ad esempio il punto (-170, 60) non viene rilevato nel poligono 160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0

Guarda la seguente immagine: [Img] http://tinypic.com/r/14x2xl1 [/ img] Voglio tutto nella casella rossa. Non la scatola gialla!

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; } 

Qualcuno ha un algoritmo migliore?

    Il sistema di coordinate sferiche ha delle stranezze

    Per evitarli utilizzare invece il sistema di coordinate cartesiane ortogonali / ortonormali 3D

    1. converti i tuoi vertici poligonali e la geolocalizzazione

      così (long,lat,alt) -> (x,y,z) . qui trovi come si fa. Non è necessario applicare la trasformazione locale solo la prima trasformazione da cartesiano sferica a 3D (punto n. 1).

    2. usa qualsiasi test poligonale interno …

      Di solito contiamo il numero di intersezioni tra il lancio di linee dalla geolocalizzazione a qualsiasi direzione e linee di contorno di poligoni.

      • se è strano, allora il punto è dentro
      • se è anche allora il punto è all’esterno
      • se il punto si trova su una qualsiasi linea di poligono, allora è all’interno
      • se la tua linea casted colpisce qualsiasi vertice, o prendi in considerazione (non contare più colpi in questo vertice) o cambia la direzione un po ‘e riprova

      è il punto all'interno del poligono?

    [Gli appunti]

    Non dimenticare di gestire tutti come vettori 3D non 2D !!!