private static bool FilterRecord(string[] Fields, string FeatureClassFilter, string CountryFilter, List<List<PointD>> AreaFilter) { if(FeatureClassFilter.IndexOf(Fields[6],StringComparison.Ordinal) == -1) return false; if (CountryFilter.IndexOf(Fields[8], StringComparison.Ordinal) == -1) return false; PointD LatLng = new PointD(double.Parse(Fields[4]), double.Parse(Fields[5])); foreach(var poly in AreaFilter) { if (!PointInPolyManifold(LatLng, poly)) return false; } return true; }
//copied from: http://stackoverflow.com/questions/10673740/how-to-check-if-a-point-x-y-is-inside-a-polygon-in-the-cartesian-coordinate-sy private static bool PointInPolyManifold(PointD Point, List<PointD> Poly) { double angle = 0; int size = Poly.Count; for (int i = 0; i < size; i++) { angle += Angle2D(Poly[i] - Point, Poly[(i + 1) % size] - Point); } return Math.Abs(angle) < Math.PI ? false : true; }
private static double Angle2D(PointD Point1, PointD Point2) { double theta1 = Math.Atan2(Point1.Y, Point1.X); double theta2 = Math.Atan2(Point2.Y, Point2.X); double delta = theta2 - theta1; if (delta > Math.PI) delta -= Math.PI + Math.PI; else if (delta < -Math.PI) delta += Math.PI + Math.PI; return delta; }