Construct a SpatialReference - from a well-known ID
// Use a builder convenience method or use a builder constructor.// Builder convenience methods don't need to run on the MCT.SpatialReferencesr3857= SpatialReferenceBuilder.CreateSpatialReference(3857);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(SpatialReferenceBuildersrBuilder=new SpatialReferenceBuilder(3857)){// do something with the buildersr3857= srBuilder.ToSpatialReference();}});
Construct a SpatialReference - from a string
// Use a builder convenience method or use a builder constructor.stringwkt="GEOGCS[\"MyGCS84\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Radian\",1.0]]";// Builder convenience methods don't need to run on the MCT.SpatialReferencesr= SpatialReferenceBuilder.CreateSpatialReference(wkt);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(SpatialReferenceBuilderbuilder=new SpatialReferenceBuilder(wkt)){// do something with the builderSpatialReferenceanotherSR= builder.ToSpatialReference();}});
Construct a SpatialReference with a vertical coordinate system - from well-known IDs
// Use a builder convenience method or use a builder constructor.// see a list of vertical coordinate systems at http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/Vertical_coordinate_systems/02r3000000rn000000/// Builder convenience methods don't need to run on the MCT.// 4326 = GCS_WGS_1984// 115700 = vertical WGS_1984SpatialReferencesr4326_115700= SpatialReferenceBuilder.CreateSpatialReference(4326,115700);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(SpatialReferenceBuildersb=new SpatialReferenceBuilder(4326,115700)){// spatialReferenceBuilder properties// sb.wkid = 4326// sb.Wkt = "GEOGCS["MyGCS84",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT[\"Radian\",1.0]]"// sb.name = GCS_WGS_1984// sb.vcsWkid = 115700// sb.VcsWkt = "VERTCS["WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PARAMETER["Vertical_Shift",0.0],PARAMETER["Direction",1.0],UNIT["Meter",1.0]]// do something with the buildersr4326_115700= sb.ToSpatialReference();}});
Construct a SpatialReference with a vertical coordinate system - from a string
// Use a builder convenience method or use a builder constructor.// custom VCS - use vertical shift of -1.23 instead of 0stringcustom_vWkt=@"VERTCS[""SHD_height"",VDATUM[""Singapore_Height_Datum""],PARAMETER[""Vertical_Shift"",-1.23],PARAMETER[""Direction"",-1.0],UNIT[""Meter"",1.0]]";// Builder convenience methods don't need to run on the MCT.SpatialReferencesr4326_customVertical= SpatialReferenceBuilder.CreateSpatialReference(4326, custom_vWkt);// sr4326_customVertical.wkid = 4326// sr4326_customVertical.vert_wkid = 0// sr4326_customVertical.vert_wkt = custom_vWkt// sr4326_customVertical.hasVcs = true// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(SpatialReferenceBuildersb=new SpatialReferenceBuilder(4326, custom_vWkt)){// do something with the buildersr4326_customVertical= sb.ToSpatialReference();}});
Construct a SpatialReference with a custom PCS - from a string
// Use a builder convenience method or use a builder constructor.// Custom PCS, Predefined GCSstringcustomWkt="PROJCS[\"WebMercatorMile\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Mercator_Auxiliary_Sphere\"],PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",0.0],PARAMETER[\"Standard_Parallel_1\",0.0],PARAMETER[\"Auxiliary_Sphere_Type\",0.0],UNIT[\"Mile\",1609.344000614692]]";// Builder convenience methods don't need to run on the MCT.SpatialReferencespatialReference= SpatialReferenceBuilder.CreateSpatialReference(customWkt);// spatialReference.Wkt = customWkt// spatialReference.Wkid = 0// spatialReference.VcsWkid = 0// spatialReference.GcsWkid = 4326SpatialReferencegcs= spatialReference.Gcs;// gcs.Wkid = 4326// gcs.IsGeographic = true// sr.GcsWkt = gcs.Wkt// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(SpatialReferenceBuildersb=new SpatialReferenceBuilder(customWkt)){// do something with the builderspatialReference= sb.ToSpatialReference();}});
SpatialReference Properties
// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// use the builder constructorusing(SpatialReferenceBuildersrBuilder=new SpatialReferenceBuilder(3857)){// spatial reference builder propertiesintbuilderWkid= srBuilder.Wkid;stringbuilderWkt= srBuilder.Wkt;stringbuilderName= srBuilder.Name;doublexyScale= srBuilder.XYScale;doublexyTolerance= srBuilder.XYTolerance;doublexyResolution= srBuilder.XYResolution;Unitunit= srBuilder.Unit;doublezScale= srBuilder.ZScale;doublezTolerance= srBuilder.ZTolerance;UnitzUnit= srBuilder.ZUnit;doublemScale= srBuilder.MScale;doublemTolerance= srBuilder.MTolerance;doublefalseX= srBuilder.FalseX;doublefalseY= srBuilder.FalseY;doublefalseZ= srBuilder.FalseZ;doublefalseM= srBuilder.FalseM;// get the spatial referenceSpatialReferencesr3857= srBuilder.ToSpatialReference();// spatial reference propertiesintsrWkid= sr3857.Wkid;stringsrWkt= sr3857.Wkt;stringsrName= sr3857.Name;xyScale= sr3857.XYScale;xyTolerance= sr3857.XYTolerance;xyResolution= sr3857.XYResolution;unit= sr3857.Unit;zScale= sr3857.ZScale;zTolerance= sr3857.ZTolerance;zUnit= sr3857.ZUnit;mScale= sr3857.MScale;mTolerance= sr3857.MTolerance;falseX= sr3857.FalseX;falseY= sr3857.FalseY;falseZ= sr3857.FalseZ;falseM= sr3857.FalseM;boolhasVcs= sr3857.HasVcs;}});
varcimMapDefinition= MapView.Active.Map.GetDefinition();// use if map's sr does not have a vertical coordinate systemvardatumTransformations= cimMapDefinition.DatumTransforms;// use if map's sr has a vertical coordinate systemvarhvDatumTransformations= cimMapDefinition.HVDatumTransforms;
// list of pointsList<MapPoint>points=newList<MapPoint>{
MapPointBuilder.CreateMapPoint(0,0,2,3,1),
MapPointBuilder.CreateMapPoint(1,1,5,6),
MapPointBuilder.CreateMapPoint(2,1,6),
MapPointBuilder.CreateMapPoint(0,0)};// will have attributes because it is created with convenience methodPolylinepolylineWithAttrs= PolylineBuilder.CreatePolyline(points);boolhasZ= polylineWithAttrs.HasZ;// hasZ = trueboolhasM= polylineWithAttrs.HasM;// hasM = trueboolhasID= polylineWithAttrs.HasID;// hasID = true// will have attributes because it is created with convenience methodPolygonpolygonWithAttrs= PolygonBuilder.CreatePolygon(points);hasZ= polygonWithAttrs.HasZ;// hasZ = truehasM= polygonWithAttrs.HasM;// hasM = truehasID= polygonWithAttrs.HasID;// hasID = true// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// will not have attributes because it is passed something other than an attributed polylineusing(PolylineBuilderpolylineB=new PolylineBuilder(points)){hasZ= polylineB.HasZ;// hasZ = falsehasM= polylineB.HasM;// hasM = falsehasID= polylineB.HasID;// hasID = false}// will have attributes because it is passed an attributed polylineusing(PolylineBuilderpolylineB=new PolylineBuilder(polylineWithAttrs)){hasZ= polylineB.HasZ;// hasZ = truehasM= polylineB.HasM;// hasM = truehasID= polylineB.HasID;// hasID = true}// will not have attributes because it is passed something other than an attributed polygonusing(PolygonBuilderpolygonB=new PolygonBuilder(points)){hasZ= polygonB.HasZ;// hasZ = falsehasM= polygonB.HasM;// hasM = falsehasID= polygonB.HasID;// hasID = false}// will have attributes because it is passed an attributed polygonusing(PolygonBuilderpolygonB=new PolygonBuilder(polygonWithAttrs)){hasZ= polygonB.HasZ;// hasZ = truehasM= polygonB.HasM;// hasM = truehasID= polygonB.HasID;// hasID = true}});
MapPoint
Construct a MapPoint
// Use a builder convenience method or use a builder constructor.// Builder convenience methods don't need to run on the MCT.// create a 3d point with MMapPointpt= MapPointBuilder.CreateMapPoint(1.0,2.0,3.0,4.0);MapPointptWithM=null;// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(MapPointBuildermb=new MapPointBuilder(1.0,2.0,3.0,4.0)){// do something with the builderptWithM= mb.ToGeometry();}});MapPointclone= ptWithM.Clone()as MapPoint;MapPointanotherM= MapPointBuilder.CreateMapPoint(ptWithM);// builderEx constructors don't need to run on the MCT.MapPointBuilderExbuilderEx=new MapPointBuilderEx(1.0,2.0,3.0);
builderEx.HasM =true;
builderEx.M =4.0;pt= builderEx.ToGeometry()as MapPoint;// or another alternative with builderEx constructorbuilderEx=new MapPointBuilderEx(1.0,2.0,true,3.0,true,4.0,false,0);pt= builderEx.ToGeometry()as MapPoint;
MapPoint Builder Properties
// Use a builder convenience method or use a builder constructor.MapPointpoint1=null;MapPointpoint2=null;// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(MapPointBuildermb=new MapPointBuilder(1.0,2.0,3.0)){boolbhasZ= mb.HasZ;// hasZ = trueboolbhasM= mb.HasM;// hasM = falseboolbhasID= mb.HasID;// hasID = false// do something with the builderpoint1= mb.ToGeometry();// change some of the builder properties mb.X =11; mb.Y =22; mb.HasZ =false; mb.HasM =true; mb.M =44;// create another pointpoint2= mb.ToGeometry();}});doublex= point1.X;// x = 1.0doubley= point1.Y;// y = 2.0doublez= point1.Z;// z = 3.0doublem= point1.M;// m = NanintID= point1.ID;// ID = 0boolhasZ= point1.HasZ;// hasZ = trueboolhasM= point1.HasM;// hasM = falseboolhasID= point1.HasID;// hasID = falseboolisEmpty= point1.IsEmpty;// isEmpty = falseboolisEqual= point1.IsEqual(point2);// isEqual = false// Builder convenience methods don't need to run on the MCT.MapPointpoint3= MapPointBuilder.CreateMapPoint(point1);x= point3.X;// x = 1.0y= point3.Y;// y = 2.0z= point3.Z;// z = 3.0m= point3.M;// m = NanID= point3.ID;// ID = 0hasZ= point3.HasZ;// hasZ = truehasM= point3.HasM;// hasM = falsehasID= point3.HasID;// hasID = false// builderEx constructors don't need to run on the MCT.MapPointBuilderExbuilderEx=new MapPointBuilderEx(point1);x= builderEx.X;// x = 1.0y= builderEx.Y;// y = 2.0z= builderEx.Z;// z = 3.0m= builderEx.M;// m = NanID= builderEx.ID;// ID = 0hasZ= builderEx.HasZ;// hasZ = truehasM= builderEx.HasM;// hasM = falsehasID= builderEx.HasID;// hasID = falseisEmpty= builderEx.IsEmpty;// isEmpty = falseMapPointpoint4= builderEx.ToGeometry()as MapPoint;
MapPoint IsEqual
MapPointpt1= MapPointBuilder.CreateMapPoint(1,2,3,4,5);intID= pt1.ID;// ID = 5boolhasID= pt1.HasID;// hasID = trueMapPointpt2= MapPointBuilder.CreateMapPoint(1,2,3,4,0);ID= pt2.ID;// ID = 0hasID= pt2.HasID;// hasID = trueMapPointpt3= MapPointBuilder.CreateMapPoint(1,2,3,4);ID= pt3.ID;// ID = 0hasID= pt3.HasID;// hasID = falseMapPointpt4= MapPointBuilder.CreateMapPoint(1,2,3,44);ID= pt4.ID;// ID = 0hasID= pt4.HasID;// hasID = falseboolhasM= pt4.HasM;// hasM = trueMapPointpt5= MapPointBuilder.CreateMapPoint(1,2,3);ID= pt5.ID;// ID = 0hasID= pt5.HasID;// hasID = falsehasM= pt5.HasM;// hasM = falseboolisEqual= pt1.IsEqual(pt2);// isEqual = false, different IDsisEqual= pt2.IsEqual(pt3);// isEqual = false, HasId is differentisEqual= pt4.IsEqual(pt3);// isEqual = false, different MsisEqual= pt1.IsEqual(pt5);// isEqual = false, pt has M, id but pt5 does not.
Zoom to a specified point
//Create a pointvarpt= MapPointBuilder.CreateMapPoint(x, y, SpatialReferenceBuilder.CreateSpatialReference(4326));//Buffer it - for purpose of zoomvarpoly= GeometryEngine.Instance.Buffer(pt, buffer_size);//do we need to project the buffer polygon?if(!MapView.Active.Map.SpatialReference.IsEqual(poly.SpatialReference)){//project the polygonpoly= GeometryEngine.Instance.Project(poly, MapView.Active.Map.SpatialReference);}// Must run on MCT.
QueuedTask.Run(()=>{//Zoom - add in a delay for animation effect MapView.Active.ZoomTo(poly,new TimeSpan(0,0,0,3));});
Polyline
Construct a Polyline - from an enumeration of MapPoints
// Use a builder convenience method or use a builder constructor.MapPointstartPt= MapPointBuilder.CreateMapPoint(1.0,1.0);MapPointendPt= MapPointBuilder.CreateMapPoint(2.0,1.0);List<MapPoint>list=newList<MapPoint>();
list.Add(startPt);
list.Add(endPt);// Builder convenience methods don't need to run on the MCT.Polylinepolyline= PolylineBuilder.CreatePolyline(list, SpatialReferences.WGS84);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(PolylineBuilderpb=new PolylineBuilder(list)){ pb.SpatialReference = SpatialReferences.WGS84;Polylinepolyline2= pb.ToGeometry();}});
Get the points of a Polyline
// get the points as a readonly CollectionReadOnlyPointCollectionpts= polyline.Points;intnumPts= polyline.PointCount;// OR get an enumeration of the pointsIEnumerator<MapPoint>enumPts= polyline.Points.GetEnumerator();// OR get the point coordinates as a readonly list of Coordinate2DIReadOnlyList<Coordinate2D>coordinates= polyline.Copy2DCoordinatesToList();// OR get the point coordinates as a readonly list of Coordinate3DIReadOnlyList<Coordinate3D>coordinates3D= polyline.Copy3DCoordinatesToList();// OR get a subset of the collection as Coordinate2D using preallocated memoryIList<Coordinate2D>coordinate2Ds=newList<Coordinate2D>(10);// allocate some spaceICollection<Coordinate2D>subsetCoordinates2D= coordinate2Ds;// assign
pts.Copy2DCoordinatesToList(1,2,ref subsetCoordinates2D);// copy 2 elements from index 1 into the allocated list// coordinate2Ds.Count = 2// do something with the coordinate2Ds// without allocating more space, obtain a different set of coordinates
pts.Copy2DCoordinatesToList(5,9,ref subsetCoordinates2D);// copy 9 elements from index 5 into the allocated list// coordinate2Ds.Count = 9// OR get a subset of the collection as Coordinate3D using preallocated memoryIList<Coordinate3D>coordinate3Ds=newList<Coordinate3D>(15);// allocate some spaceICollection<Coordinate3D>subsetCoordinates3D= coordinate3Ds;// assign
pts.Copy3DCoordinatesToList(3,5,ref subsetCoordinates3D);// copy 5 elements from index 3 into the allocated list// coordinate3Ds.Count = 5// OR get a subset of the collection as MapPoint using preallocated memoryIList<MapPoint>mapPoints=newList<MapPoint>(7);// allocate some spaceICollection<MapPoint>subsetMapPoint= mapPoints;// assign
pts.CopyPointsToList(1,4,ref subsetMapPoint);// copy 4 elements from index 1 into the allocated list// mapPoints.Count = 4
Get the parts of a Polyline
intnumParts= polyline.PartCount;// get the parts as a readonly collectionReadOnlyPartCollectionparts= polyline.Parts;
Enumerate the parts of a Polyline
ReadOnlyPartCollectionpolylineParts= polyline.Parts;// enumerate the segments to get the lengthdoublelen=0;IEnumerator<ReadOnlySegmentCollection>segments= polylineParts.GetEnumerator();while(segments.MoveNext()){ReadOnlySegmentCollectionseg= segments.Current;foreach(Segment s in seg){len+= s.Length;// perhaps do something specific per segment typeswitch(s.SegmentType){case SegmentType.Line:break;case SegmentType.Bezier:break;case SegmentType.EllipticArc:break;}}}// or use foreach patternforeach(var part in polyline.Parts){foreach(var segment in part){len+= segment.Length;// perhaps do something specific per segment typeswitch(segment.SegmentType){case SegmentType.Line:break;case SegmentType.Bezier:break;case SegmentType.EllipticArc:break;}}}
Reverse the order of points in a Polyline
// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(PolylineBuilderpolylineBuilder=new PolylineBuilder(polyline)){ polylineBuilder.ReverseOrientation();PolylinereversedPolyline= polylineBuilder.ToGeometry();}});
Get the segments of a Polyline
ICollection<Segment>collection=newList<Segment>();
polyline.GetAllSegments(ref collection);intnumSegments= collection.Count;// = 10IList<Segment>iList= collection asIList<Segment>;for(inti=0;i<numSegments;i++){// do something with iList[i]}// use the segments to build another polylinePolylinepolylineFromSegments= PolylineBuilder.CreatePolyline(collection);
Build a multi-part Polyline
List<MapPoint>firstPoints=newList<MapPoint>();
firstPoints.Add(MapPointBuilder.CreateMapPoint(1.0,1.0));
firstPoints.Add(MapPointBuilder.CreateMapPoint(1.0,2.0));
firstPoints.Add(MapPointBuilder.CreateMapPoint(2.0,2.0));
firstPoints.Add(MapPointBuilder.CreateMapPoint(2.0,1.0));List<MapPoint>nextPoints=newList<MapPoint>();
nextPoints.Add(MapPointBuilder.CreateMapPoint(11.0,1.0));
nextPoints.Add(MapPointBuilder.CreateMapPoint(11.0,2.0));
nextPoints.Add(MapPointBuilder.CreateMapPoint(12.0,2.0));
nextPoints.Add(MapPointBuilder.CreateMapPoint(12.0,1.0));// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(PolylineBuilderpBuilder=new PolylineBuilder(firstPoints)){ pBuilder.AddPart(nextPoints);Polylinepolyline= pBuilder.ToGeometry();// polyline p has 2 parts pBuilder.RemovePart(0);polyline= pBuilder.ToGeometry();// polyline p has 1 part}});
StartPoint of a Polyline
//Method 1: Get the start point of the polyline by converting the polyline into a collection of points and getting the first point//sketchGeometry is a Polyline//get the sketch as a point collectionvarpointCol=((Multipart)sketchGeometry).Points;//Get the start point of the linevarfirstPoint= pointCol[0];//Method 2: Convert polyline into a collection of linesegments and getting the "StartPoint" of the first line segment.varpolylineGeom= sketchGeometry as ArcGIS.Core.Geometry.Polyline;varpolyLineParts= polylineGeom.Parts;ReadOnlySegmentCollectionpolylineSegments= polyLineParts.First();//get the first segment as a LineSegmentvarfirsLineSegment= polylineSegments.First()as LineSegment;//Now get the start PointvarstartPoint= firsLineSegment.StartPoint;
// create list of pointsMapPointstartPt= MapPointBuilder.CreateMapPoint(1.0,1.0);MapPointendPt= MapPointBuilder.CreateMapPoint(2.0,1.0);List<MapPoint>list=newList<MapPoint>();
list.Add(startPt);
list.Add(endPt);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// use the PolylineBuilder as we wish to manipulate the geometryusing(PolylineBuilderpolylineBuilder=new PolylineBuilder(list)){// split at a distance 0.75 polylineBuilder.SplitAtDistance(0.75,false);// get the polylinePolylinep= polylineBuilder.ToGeometry();// polyline p should have 3 points (1,1), (1.75, 1), (2,1)// add another pathMapPointp1= MapPointBuilder.CreateMapPoint(4.0,1.0);MapPointp2= MapPointBuilder.CreateMapPoint(6.0,1.0);MapPointp3= MapPointBuilder.CreateMapPoint(7.0,1.0);List<MapPoint>pts=newList<MapPoint>(); pts.Add(p1); pts.Add(p2); pts.Add(p3); polylineBuilder.AddPart(pts);p= polylineBuilder.ToGeometry();// polyline p has 2 parts. Each part has 3 points// split the 2nd path half way - dont create a new path polylineBuilder.SplitPartAtDistance(1,0.5,true,false);p= polylineBuilder.ToGeometry();// polyline p still has 2 parts; but now has 7 points }});
Polygon
Construct a Polygon - from an enumeration of MapPoints
// Use a builder convenience method or use a builder constructor.MapPointpt1= MapPointBuilder.CreateMapPoint(1.0,1.0);MapPointpt2= MapPointBuilder.CreateMapPoint(1.0,2.0);MapPointpt3= MapPointBuilder.CreateMapPoint(2.0,2.0);MapPointpt4= MapPointBuilder.CreateMapPoint(2.0,1.0);List<MapPoint>list=newList<MapPoint>(){ pt1, pt2, pt3, pt4 };// Builder convenience methods don't need to run on the MCT.Polygonpolygon= PolygonBuilder.CreatePolygon(list, SpatialReferences.WGS84);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(PolygonBuilderpolygonBuilder=new PolygonBuilder(list)){ polygonBuilder.SpatialReference = SpatialReferences.WGS84;polygon= polygonBuilder.ToGeometry();}});
Construct a Polygon - from an Envelope
// Use a builder convenience method or use a builder constructor.MapPointminPt= MapPointBuilder.CreateMapPoint(1.0,1.0);MapPointmaxPt= MapPointBuilder.CreateMapPoint(2.0,2.0);// Create an envelopeEnvelopeenv= EnvelopeBuilder.CreateEnvelope(minPt, maxPt);// Builder convenience methods don't need to run on the MCT.PolygonpolygonFromEnv= PolygonBuilder.CreatePolygon(env);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(PolygonBuilderpolygonBuilder=new PolygonBuilder(env)){ polygonBuilder.SpatialReference = SpatialReferences.WGS84;polygonFromEnv= polygonBuilder.ToGeometry();}});
Get the points of a Polygon
// get the points as a readonly CollectionReadOnlyPointCollectionpts= polygon.Points;// get an enumeration of the pointsIEnumerator<MapPoint>enumPts= polygon.Points.GetEnumerator();// get the point coordinates as a readonly list of Coordinate2DIReadOnlyList<Coordinate2D>coordinates= polygon.Copy2DCoordinatesToList();// get the point coordinates as a readonly list of Coordinate3DIReadOnlyList<Coordinate3D>coordinates3D= polygon.Copy3DCoordinatesToList();
Get the parts of a Polygon
// get the parts as a readonly collectionReadOnlyPartCollectionparts= polygon.Parts;
Enumerate the parts of a Polygon
intnumSegments=0;IEnumerator<ReadOnlySegmentCollection>segments= polygon.Parts.GetEnumerator();while(segments.MoveNext()){ReadOnlySegmentCollectionseg= segments.Current;numSegments+= seg.Count;foreach(Segment s in seg){// do something with the segment}}
Get the segments of a Polygon
List<Segment>segmentList=newList<Segment>(30);ICollection<Segment>collection= segmentList;
polygon.GetAllSegments(ref collection);// segmentList.Count = 4// segmentList.Capacity = 30// use the segments to build another polygonPolygonpolygonFromSegments= PolygonBuilder.CreatePolygon(collection);
Build a donut polygon
List<Coordinate2D>outerCoordinates=newList<Coordinate2D>();
outerCoordinates.Add(new Coordinate2D(10.0,10.0));
outerCoordinates.Add(new Coordinate2D(10.0,20.0));
outerCoordinates.Add(new Coordinate2D(20.0,20.0));
outerCoordinates.Add(new Coordinate2D(20.0,10.0));// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// use the PolygonBuilder as we wish to manipulate the partsusing(PolygonBuilderpb=new PolygonBuilder(outerCoordinates)){Polygondonut= pb.ToGeometry();doublearea= donut.Area;// area = 100// define the inner polygon as anti-clockwiseList<Coordinate2D>innerCoordinates=newList<Coordinate2D>(); innerCoordinates.Add(new Coordinate2D(13.0,13.0)); innerCoordinates.Add(new Coordinate2D(17.0,13.0)); innerCoordinates.Add(new Coordinate2D(17.0,17.0)); innerCoordinates.Add(new Coordinate2D(13.0,17.0)); pb.AddPart(innerCoordinates);donut= pb.ToGeometry();area= donut.Area;// area = 84.0area= GeometryEngine.Instance.Area(donut);// area = 84.0}});
Create an N-sided regular polygon
// <summary>// Create an N-sided regular polygon. A regular sided polygon is a polygon that is equiangular (all angles are equal in measure) // and equilateral (all sides are equal in length). See https://en.wikipedia.org/wiki/Regular_polygon// </summary>// <param name="numSides">The number of sides in the polygon.</param>// <param name="center">The center of the polygon.</param>// <param name="radius">The distance from the center of the polygon to a vertex.</param>// <param name="rotation">The rotation angle in radians of the start point of the polygon. The start point will be// rotated counterclockwise from the positive x-axis.</param>// <returns>N-sided regular polygon.</returns>// <exception cref="ArgumentException">Number of sides is less than 3.</exception>public Polygon CreateRegularPolygon(intnumSides,Coordinate2Dcenter,doubleradius,doublerotation){if(numSides<3)thrownew ArgumentException();
Coordinate2D[]coords=new Coordinate2D[numSides+1];doublecenterX= center.X;doublecenterY= center.Y;doublex=radius* Math.Cos(rotation)+centerX;doubley=radius* Math.Sin(rotation)+centerY;Coordinate2Dstart=new Coordinate2D(x, y);
coords[0]=start;doubleda=2* Math.PI /numSides;for(inti=1;i<numSides;i++){x=radius* Math.Cos(i*da+rotation)+centerX;y=radius* Math.Sin(i*da+rotation)+centerY;
coords[i]=new Coordinate2D(x, y);}
coords[numSides]=start;return PolygonBuilder.CreatePolygon(coords);}
Get the exterior rings of a polygon - polygon.GetExteriorRing
publicvoidGetExteriorRings(PolygoninputPolygon){if(inputPolygon==null|| inputPolygon.IsEmpty)return;// polygon part countintpartCount= inputPolygon.PartCount;// polygon exterior ring countintnumExtRings= inputPolygon.ExteriorRingCount;// get set of exterior rings for the polygonIList<Polygon>extRings= inputPolygon.GetExteriorRings();// test each part for "exterior ring"for(intidx=0;idx<partCount;idx++){boolisExteriorRing= inputPolygon.IsExteriorRing(idx);}}
Envelope
Construct an Envelope
// Use a builder convenience method or use a builder constructor.MapPointminPt= MapPointBuilder.CreateMapPoint(1.0,1.0);MapPointmaxPt= MapPointBuilder.CreateMapPoint(2.0,2.0);// Builder convenience methods don't need to run on the MCT.Envelopeenvelope= EnvelopeBuilder.CreateEnvelope(minPt, maxPt);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EnvelopeBuilderbuilder=new EnvelopeBuilder(minPt, maxPt)){// do something with the builderenvelope= builder.ToGeometry();}});// builderEx constructors don't need to run on the MCT.EnvelopeBuilderExbuilderEx=new EnvelopeBuilderEx(minPt, maxPt);envelope= builderEx.ToGeometry()as Envelope;
// use the convenience builders - don't need to run on the MCT.Envelopeenv1= EnvelopeBuilder.CreateEnvelope(0,0,1,1, SpatialReferences.WGS84);Envelopeenv2= EnvelopeBuilder.CreateEnvelope(0.5,0.5,1.5,1.5, SpatialReferences.WGS84);Envelopeenv3= env1.Union(env2);doublearea= env3.Area;doubledepth= env3.Depth;doubleheight= env3.Height;doublewidth= env3.Width;doublelen= env3.Length;MapPointcenterPt= env3.Center;Coordinate2Dcoord= env3.CenterCoordinate;boolisEmpty= env3.IsEmpty;intpointCount= env3.PointCount;// coordinates//env3.XMin, env3.XMax, env3.YMin, env3.YMax//env3.ZMin, env3.ZMax, env3.MMin, env3.MMaxboolisEqual= env1.IsEqual(env2);// false// or use the builder constructor - need to run on the MCT.using(varbuilder=new EnvelopeBuilder(0,0,1,1, SpatialReferences.WGS84)){env3= builder.Union(env2);// builder is updated to the resultdepth= builder.Depth;height= builder.Height;width= builder.Width;centerPt= builder.Center;coord= builder.CenterCoordinate;isEmpty= builder.IsEmpty;}// or use the builderEx constructors = don't need to run on the MCT.EnvelopeBuilderExbuilderEx=new EnvelopeBuilderEx(0,0,1,1, SpatialReferences.WGS84);
builderEx.Union(env2);// builder is updated to the resultdepth= builderEx.Depth;height= builderEx.Height;width= builderEx.Width;centerPt= builderEx.Center;coord= builderEx.CenterCoordinate;isEmpty= builderEx.IsEmpty;env3= builderEx.ToGeometry()as Envelope;
Intersect two Envelopes
// use the convenience builders - don't need to run on the MCT.Envelopeenv1= EnvelopeBuilder.CreateEnvelope(0,0,1,1, SpatialReferences.WGS84);Envelopeenv2= EnvelopeBuilder.CreateEnvelope(0.5,0.5,1.5,1.5, SpatialReferences.WGS84);boolintersects= env1.Intersects(env2);// trueEnvelopeenv3= env1.Intersection(env2);// or use the builder constructor - need to run on the MCT.using(varbuilder=new EnvelopeBuilder(0,0,1,1, SpatialReferences.WGS84)){intersects= builder.Intersects(env2);// trueenv3= builder.Intersection(env2);}// or use the builderEx constructors = don't need to run on the MCT.EnvelopeBuilderExbuilderEx=new EnvelopeBuilderEx(0,0,1,1, SpatialReferences.WGS84);intersects= builderEx.Intersects(env2);
builderEx.Intersection(env2);// note this sets the builder to the intersectionenv3= builderEx.ToGeometry()as Envelope;
Expand an Envelope
// Use a builder convenience method or use a builder constructor.// Builder convenience methods don't need to run on the MCT.Envelopeenvelope= EnvelopeBuilder.CreateEnvelope(100.0,100.0,500.0,500.0);// shrink the envelope by 50%Enveloperesult= envelope.Expand(0.5,0.5,true);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EnvelopeBuildereBuilder=new EnvelopeBuilder(100.0,100.0,500.0,500.0)){// shrink by 50% eBuilder.Expand(0.5,0.5,true);result= eBuilder.ToGeometry();}});// builderEx constructors don't need to run on the MCT.EnvelopeBuilderExbuilderEx=new EnvelopeBuilderEx(100.0,100.0,500.0,500.0);
builderEx.Expand(0.5,0.5,true);envelope= builderEx.ToGeometry()as Envelope;
Construct a Multipoint - from an enumeration of MapPoints
// Use a builder convenience method or use a builder constructor.List<MapPoint>list=newList<MapPoint>();
list.Add(MapPointBuilder.CreateMapPoint(1.0,1.0));
list.Add(MapPointBuilder.CreateMapPoint(1.0,2.0));
list.Add(MapPointBuilder.CreateMapPoint(2.0,2.0));
list.Add(MapPointBuilder.CreateMapPoint(2.0,1.0));// Builder convenience methods don't need to run on the MCT.MultipointmultiPoint= MultipointBuilder.CreateMultipoint(list);intptCount= multiPoint.PointCount;// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(MultipointBuildermpb=new MultipointBuilder(list)){// do something with the builderMultipointmPt= mpb.ToGeometry();ptCount= mpb.PointCount;}});// or use the builderEx constructors = don't need to run on the MCT.MultipointBuilderExbuilderEx=new MultipointBuilderEx(list);multiPoint= builderEx.ToGeometry()as Multipoint;ptCount= builderEx.PointCount;
Modify the points of a Multipoint
// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// assume a multiPoint has been built from 4 points// the modified multiPoint will have the first point removed and the last point movedusing(MultipointBuildermpb=new MultipointBuilder(multipoint)){// remove the first point mpb.RemovePoint(0);// modify the coordinates of the last pointMapPointpt= mpb.GetMapPoint(mpb.PointCount -1); mpb.RemovePoint(mpb.PointCount -1);MapPointnewPt= MapPointBuilder.CreateMapPoint(pt.X +1.0, pt.Y +2.0); mpb.Add(newPt);MultipointmodifiedMultiPoint= mpb.ToGeometry();}});// or use the builderEx constructors = don't need to run on the MCT.MultipointBuilderExbuilderEx=new MultipointBuilderEx(multipoint);// remove the first point
builderEx.RemovePoint(0);// modify the coordinates of the last pointvarptEx= builderEx.GetPoint(builderEx.PointCount -1);
builderEx.RemovePoint(builderEx.PointCount -1);varnewPtEx= MapPointBuilder.CreateMapPoint(ptEx.X +1.0, ptEx.Y +2.0);
builderEx.AddPoint(newPtEx);MultipointmodifiedMultiPointEx= builderEx.ToGeometry()as Multipoint;
Retrieve Points, 2D Coordinates, 3D Coordinates from a multipoint
// Use a builder convenience method or use a builder constructor.MapPointstartPt= MapPointBuilder.CreateMapPoint(1.0,1.0);MapPointendPt= MapPointBuilder.CreateMapPoint(2.0,1.0);// Builder convenience methods don't need to run on the MCT.LineSegmentlineFromMapPoint= LineBuilder.CreateLineSegment(startPt, endPt);// coordinate2DCoordinate2Dstart2d=(Coordinate2D)startPt;Coordinate2Dend2d=(Coordinate2D)endPt;LineSegmentlineFromCoordinate2D= LineBuilder.CreateLineSegment(start2d, end2d);// coordinate3DCoordinate3Dstart3d=(Coordinate3D)startPt;Coordinate3Dend3d=(Coordinate3D)endPt;LineSegmentlineFromCoordinate3D= LineBuilder.CreateLineSegment(start3d, end3d);// lineSegmentLineSegmentanotherLineFromLineSegment= LineBuilder.CreateLineSegment(lineFromCoordinate3D);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(LineBuilderlb=new LineBuilder(startPt, endPt)){// do something with the builderlineFromMapPoint= lb.ToSegment();}using(LineBuilderlb=new LineBuilder(start2d, end2d)){// do something with the builderlineFromCoordinate2D= lb.ToSegment();}using(LineBuilderlb=new LineBuilder(start3d, end3d)){// do something with the builderlineFromCoordinate3D= lb.ToSegment();}using(LineBuilderlb=new LineBuilder(lineFromCoordinate3D)){// do something with the builderLineSegmentlineFromLineSegment= lb.ToSegment();}});
Alter LineSegment Coordinates
// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// use the builder constructorusing(LineBuilderlb=new LineBuilder(lineSegment)){// find the existing coordinates lb.QueryCoords(out startPt,out endPt);// or use //startPt = lb.StartPoint;//endPt = lb.EndPoint;// update the coordinates lb.SetCoords(GeometryEngine.Instance.Move(startPt,10,10)as MapPoint, GeometryEngine.Instance.Move(endPt,-10,-10)as MapPoint);// or use //lb.StartPoint = GeometryEngine.Instance.Move(startPt, 10, 10) as MapPoint;//lb.EndPoint = GeometryEngine.Instance.Move(endPt, -10, -10) as MapPoint;LineSegmentanotherLineSegment= lb.ToSegment();}});
Cubic Bezier
Construct a Cubic Bezier - from Coordinates
// Use a builder convenience method or a builder constructor.MapPointstartPt= MapPointBuilder.CreateMapPoint(1.0,1.0,3.0);MapPointendPt= MapPointBuilder.CreateMapPoint(2.0,2.0,3.0);Coordinate2Dctrl1Pt=new Coordinate2D(1.0,2.0);Coordinate2Dctrl2Pt=new Coordinate2D(2.0,1.0);// Builder convenience methods don't need to run on the MCTCubicBezierSegmentbezier= CubicBezierBuilder.CreateCubicBezierSegment(startPt, ctrl1Pt, ctrl2Pt, endPt, SpatialReferences.WGS84);// Builder constructors need to run on the MCT
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(CubicBezierBuildercbb=new CubicBezierBuilder(startPt, ctrl1Pt, ctrl2Pt, endPt)){// do something with the builderCubicBezierSegmentanotherBezier= cbb.ToSegment();}});
Construct a Cubic Bezier - from MapPoints
// Use a builder convenience method or a builder constructor.MapPointstartPt= MapPointBuilder.CreateMapPoint(1.0,1.0, SpatialReferences.WGS84);MapPointendPt= MapPointBuilder.CreateMapPoint(2.0,2.0, SpatialReferences.WGS84);MapPointctrl1Pt= MapPointBuilder.CreateMapPoint(1.0,2.0, SpatialReferences.WGS84);MapPointctrl2Pt= MapPointBuilder.CreateMapPoint(2.0,1.0, SpatialReferences.WGS84);// Builder convenience methods don't need to run on the MCTCubicBezierSegmentanotherBezier= CubicBezierBuilder.CreateCubicBezierSegment(startPt, ctrl1Pt, ctrl2Pt, endPt);// Builder constructors need to run on the MCT
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(CubicBezierBuildercbb=new CubicBezierBuilder(startPt, ctrl1Pt, ctrl2Pt, endPt)){// do something with the builderCubicBezierSegmentbezier= cbb.ToSegment();}});
Construct a Cubic Bezier - from an enumeration of MapPoints
// Use a builder convenience method or use a builder constructor.MapPointstartPt= MapPointBuilder.CreateMapPoint(1.0,1.0, SpatialReferences.WGS84);MapPointendPt= MapPointBuilder.CreateMapPoint(2.0,2.0, SpatialReferences.WGS84);MapPointctrl1Pt= MapPointBuilder.CreateMapPoint(1.0,2.0, SpatialReferences.WGS84);MapPointctrl2Pt= MapPointBuilder.CreateMapPoint(2.0,1.0, SpatialReferences.WGS84);List<MapPoint>listMapPoints=newList<MapPoint>();
listMapPoints.Add(startPt);
listMapPoints.Add(ctrl1Pt);
listMapPoints.Add(ctrl2Pt);
listMapPoints.Add(endPt);// Builder convenience methods don't need to run on the MCTCubicBezierSegmentbezier= CubicBezierBuilder.CreateCubicBezierSegment(listMapPoints);// Builder constructors need to run on the MCT
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(CubicBezierBuildercbb=new CubicBezierBuilder(listMapPoints)){// do something with the builderbezier= cbb.ToSegment();}});
Cubic Bezier Builder Properties
// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// retrieve the bezier curve's control pointsusing(CubicBezierBuildercbb=new CubicBezierBuilder(bezierSegment)){MapPointstartPt= cbb.StartPoint;Coordinate2DctrlPt1= cbb.ControlPoint1;Coordinate2DctrlPt2= cbb.ControlPoint2;MapPointendPt= cbb.EndPoint;// or use the QueryCoords method cbb.QueryCoords(out startPt,out ctrlPt1,out ctrlPt2,out endPt);}});
Cubic Bezier Properties
// retrieve the bezier curve's control pointsCubicBezierSegmentcb= CubicBezierBuilder.CreateCubicBezierSegment(bezierSegment);MapPointstartPt= cb.StartPoint;Coordinate2DctrlPt1= cb.ControlPoint1;Coordinate2DctrlPt2= cb.ControlPoint2;MapPointendPt= cb.EndPoint;boolisCurve= cb.IsCurve;doublelen= cb.Length;
Construct a Circular Arc - using an interior point
// Construct a circular arc from (2, 1) to (1, 2) with interior pt (1 + sqrt(2)/2, 1 + sqrt(2)/2).// Use a builder convenience method or use a builder constructor.MapPointfromPt= MapPointBuilder.CreateMapPoint(2,1);MapPointtoPt= MapPointBuilder.CreateMapPoint(1,2);Coordinate2DinteriorPt=new Coordinate2D(1+ Math.Sqrt(2)/2,1+ Math.Sqrt(2)/2);// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentcircularArc= EllipticArcBuilder.CreateEllipticArcSegment(fromPt, toPt, interiorPt);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuildercab=new EllipticArcBuilder(fromPt, toPt, interiorPt)){// do something with the builderEllipticArcSegmentanotherCircularArc= cab.ToSegment();}});
Construct a Circular Arc - using a chord length and bearing
// Construct a circular arc counterclockwise from (2, 1) to (1, 2) such that the embedded // circle has center point at (1, 1) and radius = 1.// Use a builder convenience method or use a builder constructor.MapPointfromPt= MapPointBuilder.CreateMapPoint(2,1, SpatialReferences.WGS84);doublechordLength= Math.Sqrt(2);doublechordBearing=3* Math.PI /4;doubleradius=1;esriArcOrientationorientation= esriArcOrientation.esriArcCounterClockwise;MinorOrMajorminorOrMajor= MinorOrMajor.Minor;// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentcircularArc= EllipticArcBuilder.CreateEllipticArcSegment(fromPt, chordLength, chordBearing, radius, orientation, minorOrMajor);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuildercab=new EllipticArcBuilder(fromPt, chordLength, chordBearing, radius, orientation, minorOrMajor)){// do something with the builderEllipticArcSegmentanotherCircularArc= cab.ToSegment();}});
Construct a Circular Arc - using a center point, angle and radius
// Construct a circular arc with center point at (0, 0), from angle = 0, // central angle = pi/2, radius = 1.// Use a builder convenience method or use a builder constructor.SpatialReferencesr4326= SpatialReferences.WGS84;Coordinate2DcenterPt=new Coordinate2D(0,0);doublefromAngle=0;doublecentralAngle= Math.PI /2;doubleradius=1;// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentcircularArc= EllipticArcBuilder.CreateEllipticArcSegment(fromAngle, centralAngle, centerPt, radius, sr4326);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuildercab=new EllipticArcBuilder(fromAngle, centralAngle, centerPt, radius, sr4326)){// do something with the builderEllipticArcSegmentotherCircularArc= cab.ToSegment();}});
Construct a Circular Arc - using a center point and rotation angle
// Construct an elliptic arc centered at (1,1), startAngle = 0, centralAngle = PI/2, // rotationAngle = 0, semiMajorAxis = 1, minorMajorRatio = 0.5.// Use a builder convenience method or use a builder constructor.Coordinate2DcenterPt=new Coordinate2D(1,1);// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentcircularArc= EllipticArcBuilder.CreateEllipticArcSegment(centerPt,0, Math.PI /2,0,1,0.5);doublesemiMajor;doublesemiMinor;
circularArc.GetAxes(out semiMajor,out semiMinor);// semiMajor = 1, semiMinor = 0.5// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuildercab=new EllipticArcBuilder(centerPt,0, Math.PI /2,0,1,0.5)){// do something with the builderEllipticArcSegmentotherCircularArc= cab.ToSegment();}});
Construct a Circular Arc - using a center point and orientation
// Construct a circular arc from (2, 1) to (1, 2) // with center point at (1, 1) and orientation counterclockwise.// Use a builder convenience method or use a builder constructor.MapPointtoPt= MapPointBuilder.CreateMapPoint(1,2);MapPointfromPt= MapPointBuilder.CreateMapPoint(2,1);Coordinate2DcenterPtCoord=new Coordinate2D(1,1);// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentcircularArc= EllipticArcBuilder.CreateEllipticArcSegment(fromPt, toPt, centerPtCoord, esriArcOrientation.esriArcCounterClockwise);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuildercab=new EllipticArcBuilder(fromPt, toPt, centerPtCoord, esriArcOrientation.esriArcCounterClockwise)){// do something with the builderEllipticArcSegmentotherCircularArc= cab.ToSegment();}});
Construct a Circular Arc - using two segments and radius
// Construct a segment from (100, 100) to (50, 50) and another segment from (100, 100) to (150, 50).// Use a builder convenience method or use a builder constructor.LineSegmentsegment1= LineBuilder.CreateLineSegment(new Coordinate2D(100,100),new Coordinate2D(50,50));LineSegmentsegment2= LineBuilder.CreateLineSegment(new Coordinate2D(100,100),new Coordinate2D(150,50));// Construct the hint point to determine where the arc will be constructed.Coordinate2DhintPoint=new Coordinate2D(100,75);// Call QueryFilletRadius to get the minimum and maximum radii that can be used with these segments.varminMaxRadii= EllipticArcBuilder.QueryFilletRadiusRange(segment1, segment2, hintPoint);// Use the maximum radius to create the arc.doublemaxRadius= minMaxRadii.Item2;// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentcircularArc= EllipticArcBuilder.CreateEllipticArcSegment(segment1, segment2, maxRadius, hintPoint);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuildercab=new EllipticArcBuilder(segment1, segment2, maxRadius, hintPoint)){// do something with the builderEllipticArcSegmentotherCircularArc= cab.ToSegment();}});
Construct a Circle
// Construct a circle with center at (-1,-1), radius = 2, and oriented clockwise.// Use a builder convenience method or use a builder constructor.Coordinate2DcenterPtCoord=new Coordinate2D(-1,-1);// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentcircle= EllipticArcBuilder.CreateEllipticArcSegment(centerPtCoord,2, esriArcOrientation.esriArcClockwise);// circle.IsCircular = true// circle.IsCounterClockwise = false// circle.IsMinor = falsedoublestartAngle,rotationAngle,centralAngle,semiMajor,semiMinor;Coordinate2DactualCenterPt;
circle.QueryCoords(out actualCenterPt,out startAngle,out centralAngle,out rotationAngle,out semiMajor,out semiMinor);// semiMajor = 2.0// semiMinor = 2.0// startAngle = PI/2// centralAngle = -2*PI// rotationAngle = 0// endAngle = PI/2// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuilderbuilder=new EllipticArcBuilder(centerPtCoord,2, esriArcOrientation.esriArcClockwise)){// do something with the builderEllipticArcSegmentotherCircle= builder.ToSegment();}});
Construct an Ellipse
// Construct an ellipse centered at (1, 2) with rotationAngle = -pi/6, // semiMajorAxis = 5, minorMajorRatio = 0.2, oriented clockwise.// Use a builder convenience method or use a builder constructor.Coordinate2DcenterPt=new Coordinate2D(1,2);// Builder convenience methods don't need to run on the MCT.EllipticArcSegmentellipse= EllipticArcBuilder.CreateEllipticArcSegment(centerPt,-1* Math.PI /6,5,0.2, esriArcOrientation.esriArcClockwise);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuilderbuilder=new EllipticArcBuilder(centerPt,-1* Math.PI /6,5,0.2, esriArcOrientation.esriArcClockwise)){// do something with the builderEllipticArcSegmentanotherEllipse= builder.ToSegment();}});
Elliptic Arc Builder Properties
// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{// retrieve the curve's control pointsusing(EllipticArcBuilderbuilder=new EllipticArcBuilder(arcSegment)){MapPointstartPt= builder.StartPoint;MapPointendPt= builder.EndPoint;Coordinate2DcenterPt= builder.CenterPoint;boolisCircular= builder.IsCircular;boolisMinor= builder.IsMinor;doublestartAngle= builder.StartAngle;doubleendAngle= builder.EndAngle;doublecentralAngle= builder.CentralAngle;doublerotationAngle= builder.RotationAngle;esriArcOrientationorientation= builder.Orientation;}});
Elliptic Arc Properties
// retrieve the curve's control pointsEllipticArcSegmentarc= EllipticArcBuilder.CreateEllipticArcSegment(arcSegment);MapPointstartPt= arc.StartPoint;MapPointendPt= arc.EndPoint;Coordinate2DcenterPt= arc.CenterPoint;boolisCircular= arc.IsCircular;boolisMinor= arc.IsMinor;boolisCounterClockwise= arc.IsCounterClockwise;boolisCurve= arc.IsCurve;doublelen= arc.Length;doubleratio= arc.MinorMajorRatio;doublesemiMajorAxis,semiMinorAxis;// get the axes
arc.GetAxes(out semiMajorAxis,out semiMinorAxis);// or use the properties// semiMajorAxis = arc.SemiMajorAxis;// semiMinorAxis = arc.SemiMinorAxis;doublestartAngle,centralAngle,rotationAngle;// or use QueryCoords to get complete information
arc.QueryCoords(out centerPt,out startAngle,out centralAngle,out rotationAngle,out semiMajorAxis,out semiMinorAxis);// use properties to get angle information//double endAngle = arc.EndAngle;//centralAngle = arc.CentralAngle;//rotationAngle = arc.RotationAngle;//startAngle = arc.StartAngle;
GeometryBag
Construct GeometryBag
// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(GeometryBagBuilderbuilder=new GeometryBagBuilder(SpatialReferences.WGS84)){GeometryBagemptyBag= builder.ToGeometry();// emptyBag.IsEmpty = trueMapPointpoint= MapPointBuilder.CreateMapPoint(1,2, SpatialReferences.WebMercator); builder.AddGeometry(point);// builder.CountGeometries = 1GeometryBaggeometryBag= builder.ToGeometry();// geometryBag.PartCount = 1// geometryBag.PointCount = 1// geometryBag.IsEmpty = falseIReadOnlyList<Geometry>geometries= geometryBag.Geometries;// geometries.Count = 1// geometries[0] is MapPoint with a sr of WGS84boolisEqual= geometryBag.IsEqual(emptyBag);// isEqual = falseList<Coordinate2D>coords2D=newList<Coordinate2D>(){new Coordinate2D(0,0),new Coordinate2D(0,1),new Coordinate2D(1,1),new Coordinate2D(1,0)};Multipointmultipoint= MultipointBuilder.CreateMultipoint(coords2D, SpatialReferences.WGS84); builder.InsertGeometry(0, multipoint);geometryBag= builder.ToGeometry();// geometryBag.PartCount = 2geometries= geometryBag.Geometries;// geometries.Count = 2// geometries[0] is Multipoint// geometries[1] is MapPointPolylinepolyline= PolylineBuilder.CreatePolyline(coords2D, SpatialReferences.WebMercator); builder.AddGeometry(polyline); builder.RemoveGeometry(1);geometryBag= builder.ToGeometry();// geometryBag.PartCount = 2geometries= geometryBag.Geometries;// geometries.Count = 2// geometries[0] is Multipoint// geometries[1] is Polyline }});
Construct GeometryBag - from an enumeration of geometries
// Use a builder convenience method or use a builder constructor.MapPointpoint= MapPointBuilder.CreateMapPoint(10,20);List<Coordinate2D>coords=newList<Coordinate2D>(){new Coordinate2D(50,60),new Coordinate2D(-120,-70),new Coordinate2D(40,60)};Multipointmultipoint= MultipointBuilder.CreateMultipoint(coords, SpatialReferences.WebMercator);Polylinepolyline= PolylineBuilder.CreatePolyline(coords);stringjson="{\"rings\":[[[0,0],[0,1],[1,1],[1,0],[0,0]],[[3,0],[3,1],[4,1],[4,0],[3,0]]]}";Polygonpolygon= PolygonBuilder.FromJson(json);vargeometries=newList<Geometry>(){ point, multipoint, polyline, polygon };// Builder convenience methods don't need to run on the MCT.GeometryBagbag= GeometryBagBuilder.CreateGeometryBag(geometries, SpatialReferences.WGS84);// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(varbuilder=new GeometryBagBuilder(geometries, SpatialReferences.WGS84)){// builder.CountGeometries = 4// do something with the builderbag= builder.ToGeometry();// bag.PartCount = 4// bag.PointCount = 17}});
Construct GeometryBag - adding or inserting an enumeration of geometries
MapPointpoint= MapPointBuilder.CreateMapPoint(10,20);List<Coordinate2D>coords=newList<Coordinate2D>(){new Coordinate2D(50,60),new Coordinate2D(-120,-70),new Coordinate2D(40,60)};Multipointmultipoint= MultipointBuilder.CreateMultipoint(coords, SpatialReferences.WebMercator);Polylinepolyline= PolylineBuilder.CreatePolyline(coords);stringjson="{\"rings\":[[[0,0],[0,1],[1,1],[1,0],[0,0]],[[3,0],[3,1],[4,1],[4,0],[3,0]]]}";Polygonpolygon= PolygonBuilder.FromJson(json);vargeometries=newList<Geometry>(){ point, multipoint, polyline, polygon };// Builder constructors need to run on the MCT.
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(varbuilder=new GeometryBagBuilder(SpatialReferences.WGS84)){// builder.CountGeometries = 0 builder.AddGeometries(geometries);// builder.CountGeometries = 4GeometryBaggeomBag= builder.ToGeometry();// bag.PartCount = 4 (point, multipoint, polyline, polygon)geometries=newList<Geometry>(){ point, polyline }; builder.InsertGeometries(1, geometries);// builder.CountGeometries = 6geomBag= builder.ToGeometry();// bag.PartCount = 6 (point, point, polyline, multipoint, polyline, polygon)}});
Multipatch
Construct Multipatch via Extrusion of Polygon or Polyline
// build a polygonstringjson="{\"hasZ\":true,\"rings\":[[[0,0,0],[0,1,0],[1,1,0],[1,0,0],[0,0,0]]],\"spatialReference\":{\"wkid\":4326}}";Polygonpolygon= PolygonBuilder.FromJson(json);// extrude the polygon by an offset to create a multipatchMultipatchmultipatch= GeometryEngine.Instance.ConstructMultipatchExtrude(polygon,2);// a different polygonjson="{\"hasZ\":true,\"rings\":[[[0,0,1],[0,1,2],[1,1,3],[1,0,4],[0,0,1]]],\"spatialReference\":{\"wkid\":4326}}";polygon= PolygonBuilder.FromJson(json);// extrude between z values to create a multipatchmultipatch= GeometryEngine.Instance.ConstructMultipatchExtrudeFromToZ(polygon,-10,20);// extrude along the axis defined by the coordinate to create a multipatchCoordinate3Dcoord=new Coordinate3D(10,18,-10);multipatch= GeometryEngine.Instance.ConstructMultipatchExtrudeAlongVector3D(polygon, coord);// build a polylinejson="{\"hasZ\":true,\"paths\":[[[400,800,1000],[800,1400,1500],[1200,800,2000],[1800,1800,2500],[2200,800,3000]]],\"spatialReference\":{\"wkid\":3857}}";Polylinepolyline= PolylineBuilder.FromJson(json);// extrude to a specific z value to create a multipatchmultipatch= GeometryEngine.Instance.ConstructMultipatchExtrudeToZ(polyline,500);Coordinate3DfromCoord=new Coordinate3D(50,50,-500);Coordinate3DtoCoord=new Coordinate3D(200,50,1000);// extrude between two coordinates to create a multipatchmultipatch= GeometryEngine.Instance.ConstructMultipatchExtrudeAlongLine(polyline, fromCoord, toCoord);
Multipatch Properties
// standard geometry propertiesboolhasZ= multipatch.HasZ;boolhasM= multipatch.HasM;boolhasID= multipatch.HasID;boolisEmpty= multipatch.IsEmpty;varsr= multipatch.SpatialReference;// number of patches (parts)intpatchCount= multiPatch.PartCount;// number of pointsintpointCount= multiPatch.PointCount;// retrieve the points as MapPointsReadOnlyPointCollectionpoints= multipatch.Points;// or as 3D CoordinatesIReadOnlyList<Coordinate3D>coordinates= multipatch.Copy3DCoordinatesToList();// multipatch materialsboolhasMaterials= multiPatch.HasMaterials;intmaterialCount= multiPatch.MaterialCount;// multipatch texturesboolhasTextures= multiPatch.HasTextures;inttextureVertexCount= multiPatch.TextureVertexCount;// normalsboolhasNormals= multiPatch.HasNormals;// properties for an individual patch (if multipatch.PartCount > 0)intpatchPriority= multiPatch.GetPatchPriority(patchIndex);esriPatchTypepatchType= multiPatch.GetPatchType(patchIndex);// patch pointsintpatchPointCount= multiPatch.GetPatchPointCount(patchIndex);intpointStartIndex= multiPatch.GetPatchStartPointIndex(patchIndex);// the patch Points are then the points in multipatch.Points from pointStartIndex to pointStartIndex + patchPointCount // if the multipatch has materials if(hasMaterials){// does the patch have a material? // materialIndex = -1 if the patch does not have a material; // 0 <= materialIndex < materialCount if the patch does have materialsintmaterialIndex= multipatch.GetPatchMaterialIndex(patchIndex);// properties for an individual material (if multipatch.MaterialCount > 0)varcolor= multipatch.GetMaterialColor(materialIndex);varedgeColor= multipatch.GetMaterialEdgeColor(materialIndex);varedgeWidth= multipatch.GetMaterialEdgeWidth(materialIndex);varshiness= multipatch.GetMaterialShininess(materialIndex);varpercent= multipatch.GetMaterialTransparencyPercent(materialIndex);varcullBackFace= multipatch.IsMaterialCullBackface(materialIndex);// texture propertiesboolisTextured= multipatch.IsMaterialTextured(materialIndex);if(isTextured){intcolumnCount= multipatch.GetMaterialTextureColumnCount(materialIndex);introwCount= multipatch.GetMaterialTextureRowCount(materialIndex);intbpp= multipatch.GetMaterialTextureBytesPerPixel(materialIndex);esriTextureCompressionTypecompressionType= multipatch.GetMaterialTextureCompressionType(materialIndex);vartexture= multipatch.GetMaterialTexture(materialIndex);}}// texture coordinates (if multipatch.HasTextures = true)if(hasTextures){intnumPatchTexturePoints= multiPatch.GetPatchTextureVertexCount(patchIndex);varcoordinate2D= multiPatch.GetPatchTextureCoordinate(patchIndex,0);ICollection<Coordinate2D>textureCoordinates=newList<Coordinate2D>(numPatchTexturePoints);
multiPatch.GetPatchTextureCoordinates(patchIndex,ref textureCoordinates);}// patch normals (if multipatch.HasNormals = true)if(hasNormals){// number of normal coordinates = multipatch.GetPatchPointCount(patchIndex)Coordinate3DpatchNormal= multipatch.GetPatchNormal(patchIndex,0);ICollection<Coordinate3D>normalCoordinates=newList<Coordinate3D>(patchPointCount);
multipatch.GetPatchNormals(patchIndex,ref normalCoordinates);}
Construct Multipatch
// export to binary xmlstringbinaryXml= multiPatch.ToBinaryXML();// import from binaryXML - methods need to run on the MCTMultipatchbinaryMultipatch= MultipatchBuilder.FromBinaryXML(binaryXml);// xml export / importstringxml= multiPatch.ToXML();MultipatchxmlMultipatch= MultipatchBuilder.FromXML(xml);// esriShape export/importbyte[]buffer= multiPatch.ToEsriShape();MultipatchesriPatch= MultipatchBuilder.FromEsriShape(buffer);// or use GeometryEngineMultipatchpatchImport= GeometryEngine.Instance.ImportFromEsriShape(EsriShapeImportFlags.esriShapeImportDefaults, buffer, multiPatch.SpatialReference)as Multipatch;
Construct Multipatch via MultipatchBuilderEx
varcoords_face1=newList<Coordinate3D>(){new Coordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),new Coordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),new Coordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),new Coordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),new Coordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),new Coordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),};varcoords_face2=newList<Coordinate3D>(){new Coordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),new Coordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),new Coordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),new Coordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),new Coordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),new Coordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),};varcoords_face3=newList<Coordinate3D>(){new Coordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),new Coordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),new Coordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),new Coordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),new Coordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),new Coordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),};varcoords_face4=newList<Coordinate3D>(){new Coordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),new Coordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),new Coordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),new Coordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),new Coordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),new Coordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),};varcoords_face5=newList<Coordinate3D>(){new Coordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),new Coordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),new Coordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),new Coordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),new Coordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),new Coordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),};varcoords_face6=newList<Coordinate3D>(){new Coordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),new Coordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),new Coordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),new Coordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),new Coordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),new Coordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),};// materialsvarmaterialRed=new BasicMaterial();
materialRed.Color = System.Windows.Media.Colors.Red;varmaterialTransparent=new BasicMaterial();
materialTransparent.Color = System.Windows.Media.Colors.White;
materialTransparent.TransparencyPercent =80;varblueTransparent=new BasicMaterial(materialTransparent);
blueTransparent.Color = System.Windows.Media.Colors.SkyBlue;// create a list of patch objectsvarpatches=newList<Patch>();// create the multipatchBuilderEx objectvarmpb=new ArcGIS.Core.Geometry.MultipatchBuilderEx();// make each patch using the appropriate coordinates and add to the patch listvarpatch= mpb.MakePatch(esriPatchType.Triangles);
patch.Coords =coords_face1;
patches.Add(patch);patch= mpb.MakePatch(esriPatchType.Triangles);
patch.Coords =coords_face2;
patches.Add(patch);patch= mpb.MakePatch(esriPatchType.Triangles);
patch.Coords =coords_face3;
patches.Add(patch);patch= mpb.MakePatch(esriPatchType.Triangles);
patch.Coords =coords_face4;
patches.Add(patch);patch= mpb.MakePatch(esriPatchType.Triangles);
patch.Coords =coords_face5;
patches.Add(patch);patch= mpb.MakePatch(esriPatchType.Triangles);
patch.Coords =coords_face6;
patches.Add(patch);
patches[0].Material =materialRed;
patches[1].Material =materialTransparent;
patches[2].Material =materialRed;
patches[3].Material =materialRed;
patches[4].Material =materialRed;
patches[5].Material =blueTransparent;// assign the patches to the multipatchBuilder
mpb.Patches =patches;// check which patches currently contain the materialvarred= mpb.QueryPatchIndicesWithMaterial(materialRed);// red should be [0, 2, 3, 4]// call ToGeometry to get the multipatchmultipatch= mpb.ToGeometry()as Multipatch;
Construct Multipatch from another Multipatch
// create the multipatchBuilderEx objectvarbuilder=new ArcGIS.Core.Geometry.MultipatchBuilderEx(multipatch);// check some propertiesboolhasM= builder.HasM;boolhasZ= builder.HasZ;boolhasID= builder.HasID;boolisEmpty= builder.IsEmpty;boolhasNormals= builder.HasNormals;varpatches= builder.Patches;intpatchCount= patches.Count;// if there's some patchesif(patchCount>0){intpointCount= builder.GetPatchPointCount(0);// replace the first point in the first patchif(pointCount>0){// get the first pointvarpt= builder.GetPoint(0,0);
builder.SetPoint(0,0, newPoint);}// check which patches currently contain the texturevartexture= builder.QueryPatchIndicesWithTexture(brickTextureResource);// assign a texture material
patches[0].Material =brickMaterialTexture;}// update the builder for M awareness
builder.HasM =true;// synchronize the patch attributes to match the builder attributes// in this instance because we just set HasM to true on the builder, each patch will now get a default M value for it's set of coordinates
builder.SynchronizeAttributeAwareness();// call ToGeometry to get the multipatchmultipatch= builder.ToGeometry()as Multipatch;// multipatch.HasM will be true
Construct Multipoint from a 3D model file
try{varmodel= ArcGIS.Core.Geometry.MultipatchBuilderEx.From3DModelFile(@"c:\Temp\My3dModelFile.dae");boolisEMpty= model.IsEmpty;}catch(FileNotFoundException){// file not found}catch(ArgumentException){// File extension is unsupported or cannot read the file}
// read the jpeg into a buffer
System.Drawing.Image image= System.Drawing.Image.FromFile(@"C:\temp\myImageFile.jpg");MemoryStreammemoryStream=new MemoryStream();
System.Drawing.Imaging.ImageFormat format= System.Drawing.Imaging.ImageFormat.Jpeg;
image.Save(memoryStream, format);byte[]imageBuffer= memoryStream.ToArray();varjpgTexture=new JPEGTexture(imageBuffer);// texture propertiesintbpp= jpgTexture.BytesPerPixel;intcolumnCount= jpgTexture.ColumnCount;introwCount= jpgTexture.RowCount;// build the textureResource and the materialBasicMaterialmaterial=new BasicMaterial();
material.TextureResource =new TextureResource(jpgTexture);
Create BasicMaterial with Uncompressed texture
UncompressedTextureuncompressedTexture1=new UncompressedTexture(newbyte[10*12*3],10,12,3);// texture propertiesintbpp= uncompressedTexture1.BytesPerPixel;intcolumnCount= uncompressedTexture1.ColumnCount;introwCount= uncompressedTexture1.RowCount;// build the textureResource and the materialTextureResourcetr=new TextureResource(uncompressedTexture1);BasicMaterialmaterial=new BasicMaterial();
material.TextureResource =tr;
Get the texture image of a multipatch
// <summary>// This method gets the material texture image of a multipatch.// This method must be called on the MCT. Use QueuedTask.Run.// </summary>// <param name="multipatch">The input multipatch.</param>// <param name="patchIndex">The index of the patch (part) for which to get the material texture.</param>publicvoidGetMultipatchTextureImage(Multipatchmultipatch,intpatchIndex){intmaterialIndex= multipatch.GetPatchMaterialIndex(patchIndex);if(!multipatch.IsMaterialTextured(materialIndex))return;esriTextureCompressionTypecompressionType= multipatch.GetMaterialTextureCompressionType(materialIndex);stringext=compressionType== esriTextureCompressionType.CompressionJPEG ?".jpg":".dat";byte[]textureBuffer= multipatch.GetMaterialTexture(materialIndex);StreamimageStream=new MemoryStream(textureBuffer);
System.Drawing.Image image= System.Drawing.Image.FromStream(imageStream);
image.Save(@"C:\temp\myImage"+ext);}
Get the normal coordinate of a multipatch
// <summary>// This method gets the normal coordinate of a multipatch and does something with it.// This method must be called on the MCT. Use QueuedTask.Run.// </summary>// <param name="multipatch">The input multipatch.</param>// <param name="patchIndex">The index of the patch (part) for which to get the normal.</param>publicvoidDoSomethingWithNormalCoordinate(Multipatchmultipatch,intpatchIndex){if(multipatch.HasNormals){// If the multipatch has normals, then the number of normals is equal to the number of points.intnumNormals= multipatch.GetPatchPointCount(patchIndex);for(intpointIndex=0;pointIndex<numNormals;pointIndex++){Coordinate3Dnormal= multipatch.GetPatchNormal(patchIndex, pointIndex);// Do something with the normal coordinate.}}}
Get the normals of a multipatch
// <summary>// This method gets the normal coordinate of a multipatch and does something with it.// This method must be called on the MCT. Use QueuedTask.Run.// </summary>// <param name="multipatch">The input multipatch.</param>publicvoidDoSomethingWithNormalCoordinates(Multipatchmultipatch){if(multipatch.HasNormals){// Allocate the list only onceintnumPoints= multipatch.PointCount;ICollection<Coordinate3D>normals=newList<Coordinate3D>(numPoints);// The parts of a multipatch are also called patchesintnumPatches= multipatch.PartCount;for(intpatchIndex=0;patchIndex<numPatches;patchIndex++){
multipatch.GetPatchNormals(patchIndex,ref normals);// Do something with the normals for this patch.}}}
Get the material properties of a multipatch
publicvoidGetMaterialProperties(Multipatchmultipatch,intpatchIndex){if(multipatch.HasMaterials){// Get the material index for the specified patch.intmaterialIndex= multipatch.GetPatchMaterialIndex(patchIndex);
System.Windows.Media.Color color= multipatch.GetMaterialColor(materialIndex);inttranparencyPercent= multipatch.GetMaterialTransparencyPercent(materialIndex);boolisBackCulled= multipatch.IsMaterialCullBackface(materialIndex);if(multipatch.IsMaterialTextured(materialIndex)){intbpp= multipatch.GetMaterialTextureBytesPerPixel(materialIndex);intcolumnCount= multipatch.GetMaterialTextureColumnCount(materialIndex);introwCount= multipatch.GetMaterialTextureRowCount(materialIndex);}}}
Multiparts
Get the individual parts of a multipart feature
publicIEnumerable<Geometry>MultipartToSinglePart(GeometryinputGeometry){// list holding the part(s) of the input geometryList<Geometry>singleParts=newList<Geometry>();// check if the input is a null pointer or if the geometry is emptyif(inputGeometry==null|| inputGeometry.IsEmpty)returnsingleParts;// based on the type of geometry, take the parts/points and add them individually into a listswitch(inputGeometry.GeometryType){case GeometryType.Envelope:
singleParts.Add(inputGeometry.Clone()as Envelope);break;case GeometryType.Multipatch:
singleParts.Add(inputGeometry.Clone()as Multipatch);break;case GeometryType.Multipoint:varmultiPoint= inputGeometry as Multipoint;foreach(var point in multiPoint.Points){// add each point of collection as a standalone point into the list
singleParts.Add(point);}break;case GeometryType.Point:
singleParts.Add(inputGeometry.Clone()as MapPoint);break;case GeometryType.Polygon:varpolygon= inputGeometry as Polygon;foreach(var polygonPart in polygon.Parts){// use the PolygonBuilder turning the segments into a standalone // polygon instance
singleParts.Add(PolygonBuilder.CreatePolygon(polygonPart));}break;case GeometryType.Polyline:varpolyline= inputGeometry as Polyline;foreach(var polylinePart in polyline.Parts){// use the PolylineBuilder turning the segments into a standalone// polyline instance
singleParts.Add(PolylineBuilder.CreatePolyline(polylinePart));}break;case GeometryType.Unknown:break;default:break;}returnsingleParts;}
Get the outermost rings of a polygon
public Polygon GetOutermostRings(PolygoninputPolygon){if(inputPolygon==null|| inputPolygon.IsEmpty)returnnull;List<Polygon>internalRings=newList<Polygon>();// explode the parts of the polygon into a list of individual geometries// see the "Get the individual parts of a multipart feature" snippet for MultipartToSinglePart method defintionvarparts= MultipartToSinglePart(inputPolygon);// get an enumeration of clockwise geometries (area > 0) ordered by the areavarclockwiseParts= parts.Where(geom =>((Polygon)geom).Area >0).OrderByDescending(geom =>((Polygon)geom).Area);// for each of the exterior ringsforeach(var part in clockwiseParts){// add the first (the largest) ring into the internal collectionif(internalRings.Count ==0)
internalRings.Add(part as Polygon);// use flag to indicate if current part is within the already selection polygonsboolisWithin=false;foreach(var item in internalRings){if(GeometryEngine.Instance.Within(part, item))isWithin=true;}// if the current polygon is not within any polygon of the internal collection// then it is disjoint and needs to be added to if(isWithin==false)
internalRings.Add(part as Polygon);}using(PolygonBuilderouterRings=new PolygonBuilder()){// now assemble a new polygon geometry based on the internal polygon collectionforeach(var ring in internalRings){
outerRings.AddParts(ring.Parts);}// return the final geometry of the outer ringsreturn outerRings.ToGeometry();}}
Retrieve Geometry from Geodatabase
Retrieve Geometry from Geodatabase
// methods need to run on the MCT
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{try{// open a gdbusing(ArcGIS.Core.Data.Geodatabase gdb=new ArcGIS.Core.Data.Geodatabase(new FileGeodatabaseConnectionPath(new Uri(@"c:\Temp\MyDatabase.gdb")))){//Open a featureClass using(ArcGIS.Core.Data.FeatureClass featureClass= gdb.OpenDataset<ArcGIS.Core.Data.FeatureClass>("Polygon")){// find a field ArcGIS.Core.Data.FeatureClassDefinition featureClassDefinition= featureClass.GetDefinition();intfldIndex= featureClassDefinition.FindField("SomeField");if(fldIndex==-1){return;} ArcGIS.Core.Data.QueryFilter filter=new ArcGIS.Core.Data.QueryFilter{WhereClause="OBJECTID = 6"};// get the rowusing(ArcGIS.Core.Data.RowCursor rowCursor= featureClass.Search(filter,false)){while(rowCursor.MoveNext()){using(varrow= rowCursor.Current){longoid= row.GetObjectID();// get the shape from the row ArcGIS.Core.Data.Feature feature= row as ArcGIS.Core.Data.Feature;Polygonpolygon= feature.GetShape()as Polygon;// get the attribute from the row (assume it's a double field)doublevalue=(double)row.GetOriginalValue(fldIndex);// do something here}}}}}}catch(Exceptionex){// error - handle appropriately}});
Import, Export Geometries
Import and Export Geometries to well-known Text
// create a point with z, mMapPointpoint= MapPointBuilder.CreateMapPoint(100,200,300,400, SpatialReferences.WebMercator);// set the flagsWKTExportFlagswktExportFlags= WKTExportFlags.wktExportDefaults;WKTImportFlagswktImportFlags= WKTImportFlags.wktImportDefaults;// export and importstringwktString= GeometryEngine.Instance.ExportToWKT(wktExportFlags, point);MapPointimportPoint= GeometryEngine.Instance.ImportFromWKT(wktImportFlags, wktString, SpatialReferences.WebMercator)as MapPoint;doublex= importPoint.X;// x = 100doubley= importPoint.Y;// y = 200boolhasZ= importPoint.HasZ;// hasZ = truedoublez= importPoint.Z;// z = 300boolhasM= importPoint.HasM;// hasM = truedoublem= importPoint.M;// m = 400// export without zWKTExportFlagsexportFlagsNoZ= WKTExportFlags.wktExportStripZs;wktString= GeometryEngine.Instance.ExportToWKT(exportFlagsNoZ, point);importPoint= GeometryEngine.Instance.ImportFromWKT(wktImportFlags, wktString, SpatialReferences.WebMercator)as MapPoint;x= importPoint.X;// x = 100y= importPoint.Y;// y = 200hasZ= importPoint.HasZ;// hasZ = falsez= importPoint.Z;// z = 0hasM= importPoint.HasM;// hasM = truem= importPoint.M;// m = 400// export without mWKTExportFlagsexportFlagsNoM= WKTExportFlags.wktExportStripMs;wktString= GeometryEngine.Instance.ExportToWKT(exportFlagsNoM, point);importPoint= GeometryEngine.Instance.ImportFromWKT(wktImportFlags, wktString, SpatialReferences.WebMercator)as MapPoint;x= importPoint.X;// x = 100y= importPoint.Y;// y = 200hasZ= importPoint.HasZ;// hasZ = truez= importPoint.Z;// z = 300hasM= importPoint.HasM;// hasM = falsem= importPoint.M;// m = Nan// export without z, mwktString= GeometryEngine.Instance.ExportToWKT(exportFlagsNoZ|exportFlagsNoM, point);importPoint= GeometryEngine.Instance.ImportFromWKT(wktImportFlags, wktString, SpatialReferences.WebMercator)as MapPoint;x= importPoint.X;// x = 100y= importPoint.Y;// y = 200hasZ= importPoint.HasZ;// hasZ = falsez= importPoint.Z;// z = 0hasM= importPoint.HasM;// hasM = falsem= importPoint.M;// m = Nan
Import and Export Geometries to well-known Binary
// create a polylineList<Coordinate2D>coords=newList<Coordinate2D>{new Coordinate2D(0,0),new Coordinate2D(0,1),new Coordinate2D(1,1),new Coordinate2D(1,0)};Polylinepolyline= PolylineBuilder.CreatePolyline(coords, SpatialReferences.WGS84);WKBExportFlagswkbExportFlags= WKBExportFlags.wkbExportDefaults;WKBImportFlagswkbImportFlags= WKBImportFlags.wkbImportDefaults;// export and importbyte[]buffer= GeometryEngine.Instance.ExportToWKB(wkbExportFlags, polyline);Geometrygeometry= GeometryEngine.Instance.ImportFromWKB(wkbImportFlags, buffer, SpatialReferences.WGS84);PolylineimportPolyline= geometry as Polyline;// alternatively, determine the size for the bufferintbufferSize= GeometryEngine.Instance.GetWKBSize(wkbExportFlags, polyline);buffer=newbyte[bufferSize];// exportbufferSize= GeometryEngine.Instance.ExportToWKB(wkbExportFlags, polyline,ref buffer);// importimportPolyline= GeometryEngine.Instance.ImportFromWKB(wkbImportFlags, buffer, SpatialReferences.WGS84)as Polyline;
Import and Export Geometries to EsriShape
// create an envelopeList<MapPoint>coordsZM=newList<MapPoint>{
MapPointBuilder.CreateMapPoint(1001,1002,1003,1004),
MapPointBuilder.CreateMapPoint(2001,2002, Double.NaN,2004),
MapPointBuilder.CreateMapPoint(3001,-3002,3003,3004),
MapPointBuilder.CreateMapPoint(1001,-4002,4003,4004)};Envelopeenvelope= EnvelopeBuilder.CreateEnvelope(coordsZM[0], coordsZM[2], SpatialReferences.WGS84);// export and importEsriShapeExportFlagsexportFlags= EsriShapeExportFlags.esriShapeExportDefaults;EsriShapeImportFlagsimportFlags= EsriShapeImportFlags.esriShapeImportDefaults;byte[]buffer= GeometryEngine.Instance.ExportToEsriShape(exportFlags, envelope);PolygonimportedPolygon= GeometryEngine.Instance.ImportFromEsriShape(importFlags, buffer, envelope.SpatialReference)as Polygon;EnvelopeimportedEnvelope= importedPolygon.Extent;// export without z,mbuffer= GeometryEngine.Instance.ExportToEsriShape(EsriShapeExportFlags.esriShapeExportStripZs | EsriShapeExportFlags.esriShapeExportStripMs, envelope);importedPolygon= GeometryEngine.Instance.ImportFromEsriShape(importFlags, buffer, SpatialReferences.WGS84)as Polygon;importedEnvelope= importedPolygon.Extent;boolhasZ= importedEnvelope.HasZ;// hasZ = falseboolhasM= importedEnvelope.HasM;// hasM = false// export with shapeSizeintbufferSize= GeometryEngine.Instance.GetEsriShapeSize(exportFlags, envelope);buffer=newbyte[bufferSize];bufferSize= GeometryEngine.Instance.ExportToEsriShape(exportFlags, envelope,ref buffer);importedPolygon= GeometryEngine.Instance.ImportFromEsriShape(importFlags, buffer, envelope.SpatialReference)as Polygon;importedEnvelope= importedPolygon.Extent;// or use the envelope and envelopeBuilder classesbuffer= envelope.ToEsriShape();// buffer represents a polygon as there is not an envelope Esri shape buffer// EnvelopeBuilder.FromEsriShape takes a polygon Esri shape buffer and returns the extent of the polygon.importedEnvelope= EnvelopeBuilder.FromEsriShape(buffer);
Import and Export Geometries to JSON
// MapPointstringinputString="{\"x\":1,\"y\":2,\"spatialReference\":{\"wkid\":4326,\"latestWkid\":4326}}";Geometrygeometry= GeometryEngine.Instance.ImportFromJSON(JSONImportFlags.jsonImportDefaults, inputString);MapPointimportPoint= geometry as MapPoint;// importPoint = 1, 2// importPoint.SpatialReference.WKid = 4326// use the MapPointBuilder convenience methodMapPointimportPoint2= MapPointBuilder.FromJson(inputString);// importPoint2 = 1, 2// impointPoint2.SpatialReference.Wkid = 4326stringoutputString= GeometryEngine.Instance.ExportToJSON(JSONExportFlags.jsonExportDefaults, importPoint);// outputString = "{\"x\":1,\"y\":2,\"spatialReference\":{\"wkid\":4326,\"latestWkid\":4326}}"stringoutputString2= importPoint.ToJson();inputString="{\"spatialReference\":{\"wkid\":4326},\"z\":3,\"m\":4,\"x\":1,\"y\":2}";importPoint= GeometryEngine.Instance.ImportFromJSON(JSONImportFlags.jsonImportDefaults, inputString)as MapPoint;// importPoint.HasM = true// importPoint.HasZ = true// importPoint.X = 1// importPoint.Y = 2// importPoint.M = 4// importPoint.Z = 3importPoint2= MapPointBuilder.FromJson(inputString);// export to json - skip spatial referenceoutputString= GeometryEngine.Instance.ExportToJSON(JSONExportFlags.jsonExportSkipCRS, importPoint);// outputString = "{\"x\":1,\"y\":2,\"z\":3,\"m\":4}"// export from mappoint, skipping the sr - same as GeometryEngine.Instance.ExportToJSON w JSONExportFlags.jsonExportSkipCRSoutputString2= importPoint.ToJson(true);//// Multipoint//List<Coordinate2D>coords=newList<Coordinate2D>(){new Coordinate2D(100,200),new Coordinate2D(201,300),new Coordinate2D(301,400),new Coordinate2D(401,500)};Multipointmultipoint= MultipointBuilder.CreateMultipoint(coords, SpatialReferences.WebMercator);inputString="{\"points\":[[100,200],[201,300],[301,400],[401,500]],\"spatialReference\":{\"wkid\":3857}}";MultipointimportMultipoint= GeometryEngine.Instance.ImportFromJSON(JSONImportFlags.jsonImportDefaults, inputString)as Multipoint;// importMultipoint.IsEqual(multipoint) = trueReadOnlyPointCollectionpoints= importMultipoint.Points;// points.Count = 4// points[0] = 100, 200// points[1] = 201, 300// points[2] = 301, 400// points[3] = 401, 500// use the Multipointbuilder convenience methodMultipointimportMultipoint2= MultipointBuilder.FromJson(inputString);// importMultipoint2.IsEqual(multipoint) = true// export to jsonoutputString= GeometryEngine.Instance.ExportToJSON(JSONExportFlags.jsonExportDefaults, multipoint);// outputString = inputString// or use the multipoint itselfoutputString2= multipoint.ToJson();//// Polyline//Polylinepolyline= PolylineBuilder.CreatePolyline(coords, SpatialReferences.WebMercator);// export without the spatial referenceoutputString= GeometryEngine.Instance.ExportToJSON(JSONExportFlags.jsonExportSkipCRS, polyline);// importgeometry= GeometryEngine.Instance.ImportFromJSON(JSONImportFlags.jsonImportDefaults, outputString);PolylineimportPolyline= geometry as Polyline;// importPolyline.SpatialReference = nullpoints= importPolyline.Points;// points.Count = 4// points[0] = 100, 200// points[1] = 201, 300// points[2] = 301, 400// points[3] = 401, 500// use the polylineBuilder convenience method PolylineimportPolyline2= PolylineBuilder.FromJson(outputString);// importPolyline2 = importPolylineoutputString2= importPolyline2.ToJson();// outputString2 = outputString//// Polygon//Polygonpolygon= PolygonBuilder.CreatePolygon(coords, SpatialReferences.WebMercator);// export without the spatial referenceoutputString= GeometryEngine.Instance.ExportToJSON(JSONExportFlags.jsonExportSkipCRS, polygon);// importgeometry= GeometryEngine.Instance.ImportFromJSON(JSONImportFlags.jsonImportDefaults, outputString);PolygonimportPolygon= geometry as Polygon;// importPolygon.SpatialReference = nullpoints= importPolygon.Points;// points.Count = 5// polygonBuilder convenience methodPolygonimportPolyon2= PolygonBuilder.FromJson(outputString);// importPolygon2 = importPolygon// export from the polygonoutputString2= importPolyon2.ToJson(true);// Empty polygonpolygon= PolygonBuilder.CreatePolygon(SpatialReferences.WebMercator);outputString= GeometryEngine.Instance.ExportToJSON(JSONExportFlags.jsonExportDefaults, polygon);importPolygon= GeometryEngine.Instance.ImportFromJSON(JSONImportFlags.jsonImportDefaults, outputString)as Polygon;// importPolygon.IsEmpty = true// importPolygon.SpatialReference.Wkid = 3857
// create from wkidGeographicTransformationgt1478= ArcGIS.Core.Geometry.GeographicTransformation.Create(1478);stringname= gt1478.Name;stringwkt= gt1478.Wkt;intwkid= gt1478.Wkid;// create from wktGeographicTransformationanother_gt1478= ArcGIS.Core.Geometry.GeographicTransformation.Create(wkt);// inverseGeographicTransformationinverse_gt148= another_gt1478.GetInverse()as GeographicTransformation;boolisForward= inverse_gt148.IsForward;
Create Composite Geographic Transformation
// Create singleton from wkidCompositeGeographicTransformationcgt= ArcGIS.Core.Geometry.CompositeGeographicTransformation.Create(108272);intcount= cgt.Count;// count = 1IList<GeographicTransformation>gts= cgt.Transformations asIList<GeographicTransformation>;
gts.Add(ArcGIS.Core.Geometry.GeographicTransformation.Create(1437,false));count= cgt.Count;// count = 2// create from an enumerationCompositeGeographicTransformationanother_cgt= ArcGIS.Core.Geometry.CompositeGeographicTransformation.Create(gts);GeographicTransformationgt0= another_cgt[0];GeographicTransformationgt1= another_cgt[1];// get the inverseCompositeGeographicTransformationinversed_cgt= another_cgt.GetInverse()as CompositeGeographicTransformation;// inversed_cgt[0] is same as gt1// inversed_cgt[1] is same as gt0varwkt= gt0.Wkt;// create from string CompositeGeographicTransformationthird_cgt= ArcGIS.Core.Geometry.CompositeGeographicTransformation.Create(wkt, gt0.IsForward);count= third_cgt.Count;// count = 1// create from josnstringjson= cgt.ToJson();CompositeGeographicTransformationjoson_cgt= DatumTransformation.CreateFromJson(json)as CompositeGeographicTransformation;
Create Projection Transformation
// methods need to be on the MCT
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{SpatialReferencesr4267= SpatialReferenceBuilder.CreateSpatialReference(4267);SpatialReferencesr4326= SpatialReferences.WGS84;SpatialReferencesr3857= SpatialReferences.WebMercator;// Create transformation from 4267 -> 3857ProjectionTransformationprojTransFromSRs= ArcGIS.Core.Geometry.ProjectionTransformation.Create(sr4267, sr3857);// create an envelopeEnvelopeenv= EnvelopeBuilder.CreateEnvelope(new Coordinate2D(2,2),new Coordinate2D(3,3), sr4267);// Project with one geo transform 4267 -> 3857EnvelopeprojectedEnvEx= GeometryEngine.Instance.ProjectEx(env, projTransFromSRs)as Envelope;// Create inverse transformation, 3857 -> 4267ProjectionTransformationprojTransFromSRsInverse= ArcGIS.Core.Geometry.ProjectionTransformation.Create(sr3857, sr4267);// Project the projected envelope back using the inverse transformationEnvelopeprojectedEnvBack= GeometryEngine.Instance.ProjectEx(projectedEnvEx, projTransFromSRsInverse)as Envelope;boolisEqual= env.IsEqual(projectedEnvBack);});
Create HV Datum Transformation
// Create from wkidHVDatumTransformationhv110018= HVDatumTransformation.Create(110018);intwkid= hv110018.Wkid;boolisForward= hv110018.IsForward;// isForward = truestringname= hv110018.Name;// Name = WGS_1984_To_WGS_1984_EGM2008_1x1_Height// Create from wktstringwkt= hv110018.Wkt;HVDatumTransformationhv110018FromWkt= HVDatumTransformation.Create(wkt);// Get the inverseHVDatumTransformationhv110018Inverse= hv110018.GetInverse()as HVDatumTransformation;// hv110018Inverse.IsForward = false
Create Composite HV Datum Transformation
HVDatumTransformationhv1= HVDatumTransformation.Create(108034);HVDatumTransformationhv2= HVDatumTransformation.Create(108033,false);List<HVDatumTransformation>hvs=newList<HVDatumTransformation>(){ hv1, hv2 };// create from enumerationCompositeHVDatumTransformationcompositehv= CompositeHVDatumTransformation.Create(hvs);intcount= compositehv.Count;// count = 2List<HVDatumTransformation>transforms= compositehv.Transformations asList<HVDatumTransformation>;HVDatumTransformationtranform= transforms[0];// transform.Wkid = 108034// get inverseCompositeHVDatumTransformationinverse_compositehv= compositehv.GetInverse()as CompositeHVDatumTransformation;// create from xmlstringxml= compositehv.ToXML();CompositeHVDatumTransformationxml_compositehv= CompositeHVDatumTransformation.CreateFromXML(xml);// create from jsonstringjson= compositehv.ToJson();CompositeHVDatumTransformationjson_compositehv= DatumTransformation.CreateFromJson(json)as CompositeHVDatumTransformation;
Determine Transformations
// methods need to run on the MCT
ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{//// find the first transformation used between spatial references 4267 and 4326//SpatialReferencesr4267= SpatialReferenceBuilder.CreateSpatialReference(4267);SpatialReferencesr4326= SpatialReferences.WGS84;List<ProjectionTransformation>transformations= ProjectionTransformation.FindTransformations(sr4267, sr4326);// transformations.Count = 1ProjectionTransformationprojTrans= transformations[0];CompositeGeographicTransformationcompositeGT= projTrans.Transformation as CompositeGeographicTransformation;GeographicTransformationgt= compositeGT[0];// gt.Wkid = 15851// gt.Name = "NAD_1927_To_WGS_1984_79_CONUS"// gt.IsForward = true//// find the first five transformation used between spatial references 4267 and 4326//transformations= ProjectionTransformation.FindTransformations(sr4267, sr4326, numResults:5);// transformations.Count = 5projTrans= transformations[0];compositeGT= projTrans.Transformation as CompositeGeographicTransformation;// compositeGT.Count = 1// compositeGT[0].Wkid = 15851// compositeGT[0].Name = "NAD_1927_To_WGS_1984_79_CONUS"// compositeGT[0].IsForward = trueprojTrans= transformations[1];compositeGT= projTrans.Transformation as CompositeGeographicTransformation;// compositeGT.Count = 1// compositeGT[0].Wkid = 1173// compositeGT[0].Name = "NAD_1927_To_WGS_1984_4"// compositeGT[0].IsForward = trueprojTrans= transformations[2];compositeGT= projTrans.Transformation as CompositeGeographicTransformation;// compositeGT.Count = 1// compositeGT[0].Wkid = 1172// compositeGT[0].Name = "NAD_1927_To_WGS_1984_3"// compositeGT[0].IsForward = trueprojTrans= transformations[3];compositeGT= projTrans.Transformation as CompositeGeographicTransformation;// compositeGT.Count = 2// compositeGT[0].Wkid = 1241// compositeGT[0].Name = "NAD_1927_To_NAD_1983_NADCON"// compositeGT[0].IsForward = true// compositeGT[1].Wkid = 108190// compositeGT[1].Name = "WGS_1984_(ITRF00)_To_NAD_1983"// compositeGT[1].IsForward = falseprojTrans= transformations[4];compositeGT= projTrans.Transformation as CompositeGeographicTransformation;// compositeGT.Count = 2// compositeGT[0].Wkid = 1241// compositeGT[0].Name = "NAD_1927_To_NAD_1983_NADCON"// compositeGT[0].IsForward = true// compositeGT[1].Wkid = 1515// compositeGT[1].Name = "NAD_1983_To_WGS_1984_5"// compositeGT[1].IsForward = true//// find the first transformation used between spatial references 4267 and 4326 within Alaska//// AlaskaEnvelopeenvelope= EnvelopeBuilder.CreateEnvelope(-161,61,-145,69);transformations= ProjectionTransformation.FindTransformations(sr4267, sr4326, envelope);// transformations.Count = 1projTrans= transformations[0];compositeGT= projTrans.Transformation as CompositeGeographicTransformation;// compositeGT.Count = 2// compositeGT[0].Wkid = 1243// compositeGT[0].Name = "NAD_1927_To_NAD_1983_Alaska"// compositeGT[0].IsForward = true// compositeGT[1].Wkid = 108190// compositeGT[1].Name = "WGS_1984_(ITRF00)_To_NAD_1983"// compositeGT[1].IsForward = false//// find the first geographic transformation used between two spatial references with VCS (use vertical = false)//SpatialReferenceinSR= SpatialReferenceBuilder.CreateSpatialReference(4269,115702);SpatialReferenceoutSR= SpatialReferenceBuilder.CreateSpatialReference(4326,3855);// Even though each spatial reference has a VCS, vertical = false should return geographic transformations.transformations= ProjectionTransformation.FindTransformations(inSR, outSR);// transformations.Count = 1projTrans= transformations[0];compositeGT= projTrans.Transformation as CompositeGeographicTransformation;// compositeGT.Count = 1// compositeGT[0].Wkid = 108190// compositeGT[0].Name = ""WGS_1984_(ITRF00)_To_NAD_1983"// compositeGT[0].IsForward = false//// find the first vertical transformation used between two spatial references with VCS (use vertical = true)//transformations= ProjectionTransformation.FindTransformations(inSR, outSR, vertical:true);// transformations.Count = 1projTrans= transformations[0];CompositeHVDatumTransformationcompositeHV= projTrans.Transformation as CompositeHVDatumTransformation;// compositeHV.Count = 2// compositeHV[0].Wkid = 1188// compositeHV[0].Name = "NAD_1983_To_WGS_1984_1"// compositeHV[0].IsForward = true// compositeHV[1].Wkid = 110019// compositeHV[1].Name = "WGS_1984_To_WGS_1984_EGM2008_2.5x2.5_Height"// compositeHV[1].IsForward = true});
MapPoint GeoCoordinateString
MapPoint - GeoCoordinateString Conversion
SpatialReferencesr= SpatialReferences.WGS84;SpatialReferencesr2= SpatialReferences.WebMercator;// create some pointsMapPointpoint0= MapPointBuilder.CreateMapPoint(0,0, sr);MapPointpoint1= MapPointBuilder.CreateMapPoint(10,20, sr);MapPointpoint2= GeometryEngine.Instance.Project(point1, sr2)as MapPoint;MapPointpointEmpty= MapPointBuilder.CreateMapPoint(sr);MapPointpointwithNoSR= MapPointBuilder.CreateMapPoint(1,1);MapPointpointZM= MapPointBuilder.CreateMapPoint(1,2,3,4, sr);// convert to MGRSToGeoCoordinateParametermgrsParam=new ToGeoCoordinateParameter(GeoCoordinateType.MGRS);stringgeoCoordString= point0.ToGeoCoordinateString(mgrsParam);// 31NAA6602100000// use the builder to create a new point from the string. Coordinates are the same MapPointoutPoint= MapPointBuilder.FromGeoCoordinateString(geoCoordString, sr, GeoCoordinateType.MGRS);// outPoint.x = 0; outPoint.Y = 0geoCoordString= point1.ToGeoCoordinateString(mgrsParam);// 32QPH0460911794outPoint= MapPointBuilder.FromGeoCoordinateString(geoCoordString, sr, GeoCoordinateType.MGRS);// outPoint.X = 10; outPoint.Y = 20// z, m are not transformedgeoCoordString= pointZM.ToGeoCoordinateString(mgrsParam);outPoint= MapPointBuilder.FromGeoCoordinateString(geoCoordString, sr, GeoCoordinateType.MGRS);// outPoint.X = 1; outPoint.Y = 2; outPoint.Z = Nan; outPoint.M = Nan;// set the number of digits to 2 and convert
mgrsParam.NumDigits =2;geoCoordString= point1.ToGeoCoordinateString(mgrsParam);// 32QPH0512outPoint= MapPointBuilder.FromGeoCoordinateString(geoCoordString, sr, GeoCoordinateType.MGRS);// outPoint.X = 10; outPoint.Y = 20// convert to UTMToGeoCoordinateParameterutmParam=new ToGeoCoordinateParameter(GeoCoordinateType.UTM);geoCoordString= point0.ToGeoCoordinateString(utmParam);// 31N 166021 0000000geoCoordString= point1.ToGeoCoordinateString(utmParam);// 32Q 604609 2211793// convert to DMSToGeoCoordinateParameterdmsParam=new ToGeoCoordinateParameter(GeoCoordinateType.DMS);geoCoordString= point0.ToGeoCoordinateString(dmsParam);// 00 00 00.00N 000 00 00.00EgeoCoordString= point1.ToGeoCoordinateString(dmsParam);// 20 00 00.00N 010 00 00.00E// convert to DDMToGeoCoordinateParameterddmParam=new ToGeoCoordinateParameter(GeoCoordinateType.DDM);geoCoordString= point0.ToGeoCoordinateString(ddmParam);// 00 00.0000N 000 00.0000EgeoCoordString= point1.ToGeoCoordinateString(ddmParam);// 20 00.0000N 010 00.0000E// convert to DDToGeoCoordinateParameterddParam=new ToGeoCoordinateParameter(GeoCoordinateType.DD);geoCoordString= point0.ToGeoCoordinateString(ddParam);// 00.000000N 000.000000EgeoCoordString= point1.ToGeoCoordinateString(ddParam);// 20.000000N 010.000000E
AngularUnit
AngularUnit - Convert between degrees and radians
// convert 45 degrees to radiansdoubleradians= AngularUnit.Degrees.ConvertToRadians(45);// convert PI to degreesdoubledegrees= AngularUnit.Degrees.ConvertFromRadians(Math.PI);
AngularUnit - Create an AngularUnit with a factory code
try{// create a Grad unitvargrad= AngularUnit.CreateAngularUnit(9105);stringunitName= grad.Name;// GraddoubleconversionFactor= grad.ConversionFactor;// 0.015708doubleradiansPerUnit= grad.RadiansPerUnit;intfactoryCode= grad.FactoryCode;// 9105// convert 10 grads to degreesdoubleval= grad.ConvertTo(10, AngularUnit.Degrees);// convert 10 radians to gradsval= grad.ConvertFromRadians(10);}catch(ArgumentException){// ArgumentException will be thrown by CreateAngularUnit in the following scenarios// - if the factory code used is a non-angular factory code (i.e. it corresponds to square meters which is an area unit code)// - if the factory code used is invalid (i.e. it is negative or doesn't correspond to any factory code)}
AngularUnit - Create a Custom AngularUnit
// custom unit - 3 radians per unitvarmyAngularUnit= AngularUnit.CreateAngularUnit("myCustomAngularUnit",3);stringName= myAngularUnit.Name;// myCustomAngularUnitdoubleFactor= myAngularUnit.ConversionFactor;// 3intCode= myAngularUnit.FactoryCode;// 0 because it is a custom angular unitdoubleradiansUnit= myAngularUnit.RadiansPerUnit;// 3// convert 10 degrees to my unitdoubleconverted= AngularUnit.Degrees.ConvertTo(10, myAngularUnit);// convert it back to degreesconverted= myAngularUnit.ConvertTo(converted, AngularUnit.Degrees);// convert 1 radian into my angular unitsconverted= myAngularUnit.ConvertFromRadians(1);// get the wktstringwkt= myAngularUnit.Wkt;// create an angular unit from this wktvaranotherAngularUnit= AngularUnit.CreateAngularUnit(wkt);// anotherAngularUnit.ConversionFactor = 3// anotherAngularUnit.FactoryCode = 0 // anotherAngularUnit.RadiansPerUnit = 3
LinearUnit
LinearUnit - Convert between feet and meters
// convert 10 feet to metersdoublemetres= LinearUnit.Feet.ConvertToMeters(10);// convert 20 meters to feetdoublefeet= LinearUnit.Feet.ConvertFromMeters(20.0);
LinearUnit - Convert between centimeters and millimeters
// convert 11 centimeters to millimetersdoublemm= LinearUnit.Centimeters.ConvertTo(11, LinearUnit.Millimeters);// convert the result back to centimetersdoublecm= LinearUnit.Millimeters.ConvertTo(mm, LinearUnit.Centimeters);// convert the millimeter result back to metersdoublemeters= LinearUnit.Millimeters.ConvertToMeters(mm);
LinearUnit - Create a LinearUnit with a factory code
try{// create a british 1936 footvarbritFoot= LinearUnit.CreateLinearUnit(9095);stringunitName= britFoot.Name;// "Foot_British_1936"doubleconversionFactor= britFoot.ConversionFactor;// 0.3048007491doublemetersPerUnit= britFoot.MetersPerUnit;intfactoryCode= britFoot.FactoryCode;// 9095// convert 10 british 1936 feet to centimetersdoubleval= britFoot.ConvertTo(10, LinearUnit.Centimeters);// convert 10 m to british 1936 feetval= britFoot.ConvertFromMeters(10);}catch(ArgumentException){// ArgumentException will be thrown by CreateLinearUnit in the following scenarios// - if the factory code used is a non-linear factory code (i.e. it corresponds to square meters which is an area unit code)// - if the factory code used is invalid (i.e. it is negative or doesn't correspond to any factory code)}
LinearUnit - Create a Custom LinearUnit
// create a custom linear unit - there are 0.33 meters per myLinearUnitvarmyLinearUnit= LinearUnit.CreateLinearUnit("myCustomLinearUnit",0.33);stringname= myLinearUnit.Name;// myCustomLinearUnitdoubleconvFactor= myLinearUnit.ConversionFactor;// 0.33intcode= myLinearUnit.FactoryCode;// 0 for custom unitsdoublemetersUnit= myLinearUnit.MetersPerUnit;// 0.33stringtoString= myLinearUnit.ToString();// same as Name - myCustomLinearUnit// convert 10 centimeters to myLinearUnit doubleconvertedVal= LinearUnit.Centimeters.ConvertTo(10, myLinearUnit);// get the wktstringlu_wkt= myLinearUnit.Wkt;// create an angular unit from this wktvaranotherLinearUnit= LinearUnit.CreateLinearUnit(lu_wkt);// anotherLinearUnit.ConversionFactor = 0.33// anotherLinearUnit.FactoryCode = 0 // anotherLinearUnit.MetersPerUnit = 0.33
AreaUnit
AreaUnit - Convert between square feet and square meters
// convert 700 square meters to square feetdoublesqFeet= AreaUnit.SquareFeet.ConvertFromSquareMeters(700);// convert 1100 square feet to square metersdoublesqMeters= AreaUnit.SquareFeet.ConvertToSquareMeters(1000);
AreaUnit - Convert between hectares and acres
// convert 2 hectares to acresdoubleacres= AreaUnit.Hectares.ConvertTo(2, AreaUnit.Acres);
AreaUnit - Convert between hectares and square miles
// convert 300 hectares to square milesdoublesqMiles= AreaUnit.Hectares.ConvertTo(300, AreaUnit.SquareMiles);
AreaUnit - How many Square meters in various units
try{varmyFactoryCodeInit= AreaUnit.CreateAreaUnit(109439);// 109439 is the factory code for square milesvarmyWktUnit= AreaUnit.CreateAreaUnit("HECTARE_AREAUNIT[\"H\",10000.0]");varmyCustomUnit= AreaUnit.CreateAreaUnit("myAreaUnit",12);}catch(ArgumentException){// ArgumentException will be thrown by CreateAreaUnit in the following scenarios// - if the factory code used is a non-areal factory code (i.e. it corresponds to degrees which is an angular unit code)// - if the factory code used is invalid (i.e. it is negative or doesn't correspond to any factory code)}