public static Collection <AreaBaseShape> GetSplitResult(this AreaBaseShape polygon, Collection <LineShape> lines) { SqlGeometry polygonGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(polygon.GetWellKnownBinary()), 0); if (!polygonGeom.STIsValid()) { polygonGeom = polygonGeom.MakeValid(); } //GeometryLibrary library = BaseShape.GeometryLibrary; //BaseShape.GeometryLibrary = GeometryLibrary.Unmanaged; foreach (var item in lines) { //MultipolygonShape multipolygon = item.Buffer(0.2, 8, BufferCapType.Square, GeographyUnit.DecimalDegree, DistanceUnit.Meter); MultipolygonShape multipolygon = SqlTypesGeometryHelper.Buffer(item, 0.2, 8, BufferCapType.Square, GeographyUnit.DecimalDegree, DistanceUnit.Meter); SqlGeometry multipolygonGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(multipolygon.GetWellKnownBinary()), 0); if (!multipolygonGeom.STIsValid()) { multipolygonGeom = multipolygonGeom.MakeValid(); } polygonGeom = polygonGeom.STDifference(multipolygonGeom); } //BaseShape.GeometryLibrary = library; byte[] bytes = polygonGeom.STAsBinary().Value; BaseShape shape = BaseShape.CreateShapeFromWellKnownData(bytes) as AreaBaseShape; MultipolygonShape splittedMultipolygonShape = shape as MultipolygonShape; PolygonShape splittedPolygonShape = shape as PolygonShape; if (splittedMultipolygonShape == null && splittedPolygonShape != null) { splittedMultipolygonShape = new MultipolygonShape(); splittedMultipolygonShape.Polygons.Add(splittedPolygonShape); shape = splittedMultipolygonShape; } Collection <AreaBaseShape> shapes = new Collection <AreaBaseShape>(); if (splittedMultipolygonShape != null) { CloseSplittedPolygons(polygon, splittedMultipolygonShape, lines[0], GeographyUnit.DecimalDegree, DistanceUnit.Meter, .3); FillShapes(shapes, shape); } return(shapes); }
private void btnDifference_Click(object sender, RoutedEventArgs e) { InMemoryFeatureLayer inMemoryLayer = (InMemoryFeatureLayer)mapView.FindFeatureLayer("InMemoryFeatureLayer"); if (inMemoryLayer.InternalFeatures.Count > 1) { AreaBaseShape sourceShape = (AreaBaseShape)inMemoryLayer.InternalFeatures["AreaShape2"].GetShape(); AreaBaseShape targetShape = (AreaBaseShape)inMemoryLayer.InternalFeatures["AreaShape1"].GetShape(); AreaBaseShape resultShape = sourceShape.GetDifference(targetShape); inMemoryLayer.InternalFeatures.Clear(); inMemoryLayer.InternalFeatures.Add("ResultFeature", new Feature(resultShape.GetWellKnownBinary(), "ResultFeature")); inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillBrush = new GeoSolidBrush(GeoColor.FromArgb(100, GeoColors.Blue)); mapView.Overlays["InmemoryOverlay"].Refresh(); } }
private void DifferenceButtonClick(object sender, EventArgs e) { LayerOverlay inMemoryOverlay = (LayerOverlay)androidMap.Overlays["InMemoryOverlay"]; InMemoryFeatureLayer inMemoryLayer = (InMemoryFeatureLayer)inMemoryOverlay.Layers["InMemoryFeatureLayer"]; if (inMemoryLayer.InternalFeatures.Count > 1) { AreaBaseShape sourceShape = (AreaBaseShape)inMemoryLayer.InternalFeatures["AreaShape2"].GetShape(); AreaBaseShape targetShape = (AreaBaseShape)inMemoryLayer.InternalFeatures["AreaShape1"].GetShape(); AreaBaseShape resultShape = sourceShape.GetDifference(targetShape); inMemoryLayer.InternalFeatures.Clear(); inMemoryLayer.InternalFeatures.Add("ResultFeature", new Feature(resultShape.GetWellKnownBinary(), "ResultFeature")); inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush.Color = GeoColor.FromArgb(100, GeoColor.StandardColors.Blue); androidMap.Overlays["InMemoryOverlay"].Refresh(); } }
public static MultilineShape GetDifference(this LineShape masterLine, AreaBaseShape clippingArea) { MultilineShape resultMultiLineShape = new MultilineShape(); var masterGeoLine = SqlGeometry.STGeomFromWKB(new SqlBytes(masterLine.GetWellKnownBinary()), 0); var clippingGeoArea = SqlGeometry.STGeomFromWKB(new SqlBytes(clippingArea.GetWellKnownBinary()), 0); var resultWkb = masterGeoLine.STSymDifference(clippingGeoArea).MakeValid().STAsBinary().Value; var resultFeature = new Feature(resultWkb); var resultShape = resultFeature.GetShape(); if (resultShape is GeometryCollectionShape) { foreach (var line in ((GeometryCollectionShape)resultFeature.GetShape()).Shapes.OfType <LineShape>()) { resultMultiLineShape.Lines.Add(line); } } else if (resultShape is MultilineShape) { foreach (var item in ((MultilineShape)resultShape).Lines) { resultMultiLineShape.Lines.Add(item); } } else if (resultShape is LineShape) { resultMultiLineShape.Lines.Add((LineShape)resultShape); } return(resultMultiLineShape); }