0

I would like to be able to determine if a NMEA GPS position is within a boundary. Currently I am using the geojson .net library(https://github.com/GeoJSON-Net/GeoJSON.Net) for converting a geojson file to a polygon. the polygon object Airspace generates a list of latitudes and longitudes in airspace.coordinates[0].coordinates.


//This void will look for airspace files in /airspace directory.
        private static void _getAirspace()
        {
            string currentDirectory = Directory.GetCurrentDirectory();
            string path = System.IO.Path.Combine(@currentDirectory, "Airspace");
            string[] files = Directory.GetFiles(path, "*.geojson", SearchOption.AllDirectories);

            foreach (string filePath in files)
            {
                string fileContents = System.IO.File.ReadAllText(filePath);
                Polygon airspace = JsonConvert.DeserializeObject<Polygon>(fileContents);


                string json = "{\"coordinates\":[ 5.673479,52.429473 ],\"type\":\"Point\"}";
                Point point = JsonConvert.DeserializeObject<Point>(json);

                if (IsPointInPolygon(point,airspace)){

                }
                else
                {

                }

            }

        }

        public static bool IsPointInPolygon(Point p, Polygon polygon)
        {
            double minX = polygon.Coordinates[0].Coordinates[0].Longitude;
            double maxX = polygon.Coordinates[0].Coordinates[0].Longitude;
            double minY = polygon.Coordinates[0].Coordinates[0].Latitude;
            double maxY = polygon.Coordinates[0].Coordinates[0].Latitude;

            for (int i = 1; i < polygon.Coordinates.Count; i++)
            {               
                minX = Math.Min(polygon.Coordinates[0].Coordinates[i].Longitude, minX);
                maxX = Math.Max(polygon.Coordinates[0].Coordinates[i].Longitude, maxX);
                minY = Math.Min(polygon.Coordinates[0].Coordinates[i].Latitude, minY);
                maxY = Math.Max(polygon.Coordinates[0].Coordinates[i].Latitude, maxY);
            }



            bool inside = false;
            for (int i = 0, j = polygon.Coordinates.Count - 1; i < polygon.Coordinates.Count; j = i++)
            {
                if ((polygon.Coordinates[0].Coordinates[i].Latitude > p.Coordinates.Latitude) != (polygon.Coordinates[0].Coordinates[j].Latitude > p.Coordinates.Latitude) &&
                     p.Coordinates.Longitude < (polygon.Coordinates[0].Coordinates[j].Longitude - polygon.Coordinates[0].Coordinates[i].Longitude) * (p.Coordinates.Latitude - polygon.Coordinates[0].Coordinates[i].Latitude) / (polygon.Coordinates[0].Coordinates[j].Latitude - polygon.Coordinates[0].Coordinates[i].Latitude) + polygon.Coordinates[0].Coordinates[j].Longitude)
                {
                    inside = !inside;
                }
            }

            return inside;
        }

The IsPointInPolygon method always returns true in this case I expect the method to return true when the coordinates of the point is within the polygon.

Pure.Krome
  • 84,693
  • 113
  • 396
  • 647
Erwin Vorenhout
  • 181
  • 1
  • 5
  • 20
  • inside = !inside is not sensible. The canonical [is here](https://stackoverflow.com/questions/4243042/c-sharp-point-in-polygon). – Hans Passant Oct 14 '19 at 17:56
  • Thanks @HansPassant that's indeed a small mistake, but when I change the inside = !inside just by return true, the result is always false. – Erwin Vorenhout Oct 14 '19 at 18:03
  • That is not sensible either. You assume it is inside at first. When you find a condition while looping that proves it is not inside then you return false. Like the canonical answer does. – Hans Passant Oct 14 '19 at 18:11

0 Answers0