private static Polygon getBoundsBuffer(GeoPolygon polygon, GnomonicProjection projection, double distance, int pointsPerCircle, bool allowParallels) { Polygon temp = new Polygon(); List <Polygon> partialBuffers = new List <Polygon>(); GeographyCollection geographyCollection = new GeographyCollection(); ICollection <IGeometry> unionResult = null; int c = 0; foreach (GeoContour contour in polygon.Contours) { for (int i = 0; i < contour.Vertices.Count; i++) { GeoPoint p = contour.Vertices[i]; GeoPolygon tempPolygon = getPointBuffer(p, Math.Abs(distance), pointsPerCircle); geographyCollection.Clear(); geographyCollection.Add(tempPolygon); GeometryCollection gc = GeometrySpreader.GetGeometries(geographyCollection, projection); if (gc[0] is Polygon) { unionResult = temp.Union((Polygon)gc[0]); } if (unionResult.Count > 0) { temp = (Polygon)((GeometryCollection)unionResult)[0]; } c++; if (c == 3) { partialBuffers.Add(temp); temp = new Polygon(); c = 0; } } } if (temp.CoordinateCount > 0) { partialBuffers.Add(temp); } return(mergePartialBuffers(partialBuffers, allowParallels)); }
private static GeoPolygon getPolylineBuffer(GeoPolyline geoPolyline, double angleDistance, int pointsPerCircle, bool allowParallels) { geoPolyline = (GeoPolyline)geoPolyline.Clone(); double minAngle = Math.Sin(Math.Abs(angleDistance)) * Math.Sin(Math.PI / pointsPerCircle); geoPolyline.ReduceSegments(minAngle); geoPolyline.Densify(minAngle); GnomonicProjection projection; IGeometry geometry; projectGeography(geoPolyline, out projection, out geometry); Polyline planePolyline = (Polyline)geometry; GeographyCollection geographyCollection = new GeographyCollection(); Polygon temp = new Polygon(); List <Polygon> partialBuffers = new List <Polygon>(); ICollection <IGeometry> unionResult = null; int c = 0; foreach (GeoPath path in geoPolyline.Paths) { for (int i = 0; i < path.Vertices.Count - 1; i++) { GeoPoint p = path.Vertices[i]; GeoPolygon tempPolygon = getPointBuffer(p, angleDistance, pointsPerCircle); geographyCollection.Clear(); geographyCollection.Add(tempPolygon); GeometryCollection gc = GeometrySpreader.GetGeometries(geographyCollection, projection); if (gc[0] is Polygon) { unionResult = temp.Union((Polygon)gc[0]); } if (unionResult.Count > 0) { temp = (Polygon)((GeometryCollection)unionResult)[0]; } c++; if (c == 3) { partialBuffers.Add(temp); temp = new Polygon(); c = 0; } } } if (temp.CoordinateCount > 0) { partialBuffers.Add(temp); } Polygon planeBuffer = mergePartialBuffers(partialBuffers, allowParallels); GeometryCollection geometryCollection = new GeometryCollection(); geometryCollection.Add(planeBuffer); geographyCollection = GeometrySpreader.GetGeographies(geometryCollection, projection); foreach (IGeography g in geographyCollection) { if (g is GeoPolygon) { return((GeoPolygon)g); } } return(new GeoPolygon()); }
private static GeoPolygon getPolylineBuffer(GeoPolyline geoPolyline, double angleDistance, int pointsPerCircle, bool allowParallels) { geoPolyline = (GeoPolyline)geoPolyline.Clone(); double minAngle = Math.Sin(Math.Abs(angleDistance)) * Math.Sin(Math.PI / pointsPerCircle); geoPolyline.ReduceSegments(minAngle); geoPolyline.Densify(minAngle); GnomonicProjection projection; IGeometry geometry; projectGeography(geoPolyline, out projection, out geometry); Polyline planePolyline = (Polyline)geometry; GeographyCollection geographyCollection = new GeographyCollection(); Polygon temp = new Polygon(); List<Polygon> partialBuffers = new List<Polygon>(); ICollection<IGeometry> unionResult = null; int c = 0; foreach (GeoPath path in geoPolyline.Paths) { for (int i = 0; i < path.Vertices.Count - 1; i++) { GeoPoint p = path.Vertices[i]; GeoPolygon tempPolygon = getPointBuffer(p, angleDistance, pointsPerCircle); geographyCollection.Clear(); geographyCollection.Add(tempPolygon); GeometryCollection gc = GeometrySpreader.GetGeometries(geographyCollection, projection); if (gc[0] is Polygon) unionResult = temp.Union((Polygon)gc[0]); if (unionResult.Count > 0) temp = (Polygon)((GeometryCollection)unionResult)[0]; c++; if (c == 3) { partialBuffers.Add(temp); temp = new Polygon(); c = 0; } } } if (temp.CoordinateCount > 0) partialBuffers.Add(temp); Polygon planeBuffer = mergePartialBuffers(partialBuffers, allowParallels); GeometryCollection geometryCollection = new GeometryCollection(); geometryCollection.Add(planeBuffer); geographyCollection = GeometrySpreader.GetGeographies(geometryCollection, projection); foreach (IGeography g in geographyCollection) if (g is GeoPolygon) return (GeoPolygon)g; return new GeoPolygon(); }
private static Polygon getBoundsBuffer(GeoPolygon polygon, GnomonicProjection projection, double distance, int pointsPerCircle, bool allowParallels) { Polygon temp = new Polygon(); List<Polygon> partialBuffers = new List<Polygon>(); GeographyCollection geographyCollection = new GeographyCollection(); ICollection<IGeometry> unionResult = null; int c = 0; foreach (GeoContour contour in polygon.Contours) { for (int i = 0; i < contour.Vertices.Count; i++) { GeoPoint p = contour.Vertices[i]; GeoPolygon tempPolygon = getPointBuffer(p, Math.Abs(distance), pointsPerCircle); geographyCollection.Clear(); geographyCollection.Add(tempPolygon); GeometryCollection gc = GeometrySpreader.GetGeometries(geographyCollection, projection); if(gc[0] is Polygon) unionResult = temp.Union((Polygon)gc[0]); if (unionResult.Count > 0) temp = (Polygon)((GeometryCollection)unionResult)[0]; c++; if (c == 3) { partialBuffers.Add(temp); temp = new Polygon(); c = 0; } } } if (temp.CoordinateCount > 0) partialBuffers.Add(temp); return mergePartialBuffers(partialBuffers, allowParallels); }