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=newSpatialReferenceBuilder(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=newSpatialReferenceBuilder(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=newSpatialReferenceBuilder(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=newSpatialReferenceBuilder(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=newSpatialReferenceBuilder(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=newSpatialReferenceBuilder(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;}});
Determine grid convergence for a SpatialReference at a given point
Coordinate2Dcoordinate=newCoordinate2D(10,30);doubleangle=SpatialReferences.WGS84.ConvergenceAngle(coordinate);// angle = 0SpatialReferencesrUTM30N=SpatialReferenceBuilder.CreateSpatialReference(32630);coordinate.X=500000;coordinate.Y=550000;angle=srUTM30N.ConvergenceAngle(coordinate);// angle = 0MapPointpointWGS84=MapPointBuilder.CreateMapPoint(10,50,SpatialReferences.WGS84);MapPointpointUTM30N=GeometryEngine.Instance.Project(pointWGS84,srUTM30N)asMapPoint;coordinate=(Coordinate2D)pointUTM30N;// get convergence angle and convert to degreesangle=srUTM30N.ConvergenceAngle(coordinate)*180/Math.PI;// angle = 10.03
Datum
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=newPolylineBuilder(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=newPolylineBuilder(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=newPolygonBuilder(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=newPolygonBuilder(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=newMapPointBuilder(1.0,2.0,3.0,4.0)){// do something with the builderptWithM=mb.ToGeometry();}});MapPointclone=ptWithM.Clone()asMapPoint;MapPointanotherM=MapPointBuilder.CreateMapPoint(ptWithM);// builderEx constructors don't need to run on the MCT.MapPointBuilderExbuilderEx=newMapPointBuilderEx(1.0,2.0,3.0);builderEx.HasM=true;builderEx.M=4.0;pt=builderEx.ToGeometry()asMapPoint;// or another alternative with builderEx constructorbuilderEx=newMapPointBuilderEx(1.0,2.0,true,3.0,true,4.0,false,0);pt=builderEx.ToGeometry()asMapPoint;
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=newMapPointBuilder(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 propertiesmb.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=newMapPointBuilderEx(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()asMapPoint;
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 effectMapView.Active.ZoomTo(poly,newTimeSpan(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=newPolylineBuilder(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;// assignpts.Copy2DCoordinatesToList(1,2,refsubsetCoordinates2D);// 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 coordinatespts.Copy2DCoordinatesToList(5,9,refsubsetCoordinates2D);// 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;// assignpts.Copy3DCoordinatesToList(3,5,refsubsetCoordinates3D);// 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;// assignpts.CopyPointsToList(1,4,refsubsetMapPoint);// 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(Segmentsinseg){len+=s.Length;// perhaps do something specific per segment typeswitch(s.SegmentType){caseSegmentType.Line:break;caseSegmentType.Bezier:break;caseSegmentType.EllipticArc:break;}}}// or use foreach patternforeach(varpartinpolyline.Parts){foreach(varsegmentinpart){len+=segment.Length;// perhaps do something specific per segment typeswitch(segment.SegmentType){caseSegmentType.Line:break;caseSegmentType.Bezier:break;caseSegmentType.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=newPolylineBuilder(polyline)){polylineBuilder.ReverseOrientation();PolylinereversedPolyline=polylineBuilder.ToGeometry();}});
Get the segments of a Polyline
ICollection<Segment>collection=newList<Segment>();polyline.GetAllSegments(refcollection);intnumSegments=collection.Count;// = 10IList<Segment>iList=collectionasIList<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=newPolylineBuilder(firstPoints)){pBuilder.AddPart(nextPoints);Polylinepolyline=pBuilder.ToGeometry();// polyline p has 2 partspBuilder.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=sketchGeometryasArcGIS.Core.Geometry.Polyline;varpolyLineParts=polylineGeom.Parts;ReadOnlySegmentCollectionpolylineSegments=polyLineParts.First();//get the first segment as a LineSegmentvarfirsLineSegment=polylineSegments.First()asLineSegment;//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=newPolylineBuilder(list)){// split at a distance 0.75polylineBuilder.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 pathpolylineBuilder.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=newPolygonBuilder(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=newPolygonBuilder(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(Segmentsinseg){// do something with the segment}}
Get the segments of a Polygon
List<Segment>segmentList=newList<Segment>(30);ICollection<Segment>collection=segmentList;polygon.GetAllSegments(refcollection);// 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(newCoordinate2D(10.0,10.0));outerCoordinates.Add(newCoordinate2D(10.0,20.0));outerCoordinates.Add(newCoordinate2D(20.0,20.0));outerCoordinates.Add(newCoordinate2D(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=newPolygonBuilder(outerCoordinates)){Polygondonut=pb.ToGeometry();doublearea=donut.Area;// area = 100// define the inner polygon as anti-clockwiseList<Coordinate2D>innerCoordinates=newList<Coordinate2D>();innerCoordinates.Add(newCoordinate2D(13.0,13.0));innerCoordinates.Add(newCoordinate2D(17.0,13.0));innerCoordinates.Add(newCoordinate2D(17.0,17.0));innerCoordinates.Add(newCoordinate2D(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>publicPolygonCreateRegularPolygon(intnumSides,Coordinate2Dcenter,doubleradius,doublerotation){if(numSides<3)thrownewArgumentException();Coordinate2D[]coords=newCoordinate2D[numSides+1];doublecenterX=center.X;doublecenterY=center.Y;doublex=radius*Math.Cos(rotation)+centerX;doubley=radius*Math.Sin(rotation)+centerY;Coordinate2Dstart=newCoordinate2D(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]=newCoordinate2D(x,y);}coords[numSides]=start;returnPolygonBuilder.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=newEnvelopeBuilder(minPt,maxPt)){// do something with the builderenvelope=builder.ToGeometry();}});// builderEx constructors don't need to run on the MCT.EnvelopeBuilderExbuilderEx=newEnvelopeBuilderEx(minPt,maxPt);envelope=builderEx.ToGeometry()asEnvelope;
// 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=newEnvelopeBuilder(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=newEnvelopeBuilderEx(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()asEnvelope;
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=newEnvelopeBuilder(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=newEnvelopeBuilderEx(0,0,1,1,SpatialReferences.WGS84);intersects=builderEx.Intersects(env2);builderEx.Intersection(env2);// note this sets the builder to the intersectionenv3=builderEx.ToGeometry()asEnvelope;
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=newEnvelopeBuilder(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=newEnvelopeBuilderEx(100.0,100.0,500.0,500.0);builderEx.Expand(0.5,0.5,true);envelope=builderEx.ToGeometry()asEnvelope;
Update Coordinates of an Envelope
Coordinate2DminCoord=newCoordinate2D(1,3);Coordinate2DmaxCoord=newCoordinate2D(2,4);// Builder constructors need to run on the MCT.ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EnvelopeBuilderbuilder=newEnvelopeBuilder(minCoord,maxCoord)){// builder.XMin, YMin, Zmin, MMin = 1, 3, 0, double.Nan// builder.XMax, YMax, ZMax, MMax = 2, 4, 0, double.Nan// set XMin. if XMin > XMax; both XMin and XMax changebuilder.XMin=6;// builder.XMin, YMin, ZMin, MMin = 6, 3, 0, double.Nan// builder.XMax, YMax, ZMax, MMax = 6, 4, 0, double.Nan// set XMaxbuilder.XMax=8;// builder.XMin, YMin, ZMin, MMin = 6, 3, 0, double.Nan// builder.XMax, YMax, ZMax, MMax = 8, 4, 0, double.Nan// set XMax. if XMax < XMin, both XMin and XMax changebuilder.XMax=3;// builder.XMin, YMin, ZMin, MMin = 3, 3, 0, double.Nan// builder.XMax, YMax, ZMax, MMax = 3, 4, 0, double.Nan// set YMinbuilder.YMin=2;// builder.XMin, YMin, ZMin, MMin = 3, 2, 0, double.Nan// builder.XMax, YMax, ZMax, MMax = 3, 4, 0, double.Nan// set ZMin. if ZMin > ZMax, both ZMin and ZMax changebuilder.ZMin=3;// builder.XMin, YMin, ZMin, MMin = 3, 2, 3, double.Nan// builder.XMax, YMax, ZMax, MMax = 3, 4, 3, double.Nan// set ZMax. if ZMax < ZMin. both ZMin and ZMax changebuilder.ZMax=-1;// builder.XMin, YMin, ZMin, MMin = 3, 2, -1, double.Nan// builder.XMax, YMax, ZMax, MMax = 3, 4, -1, double.Nanbuilder.SetZCoords(8,-5);// builder.XMin, YMin, ZMin, MMin = 3, 2, -5, double.Nan// builder.XMax, YMax, ZMax, MMax = 3, 4, 8, double.NanCoordinate2Dc1=newCoordinate2D(0,5);Coordinate2Dc2=newCoordinate2D(1,3);builder.SetXYCoords(c1,c2);// builder.XMin, YMin, ZMin, MMin = 0, 3, -5, double.Nan// builder.XMax, YMax, ZMax, MMax = 1, 5, 8, double.Nan}});
Multipoint
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=newMultipointBuilder(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=newMultipointBuilderEx(list);multiPoint=builderEx.ToGeometry()asMultipoint;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=newMultipointBuilder(multipoint)){// remove the first pointmpb.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=newMultipointBuilderEx(multipoint);// remove the first pointbuilderEx.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()asMultipoint;
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=newLineBuilder(startPt,endPt)){// do something with the builderlineFromMapPoint=lb.ToSegment();}using(LineBuilderlb=newLineBuilder(start2d,end2d)){// do something with the builderlineFromCoordinate2D=lb.ToSegment();}using(LineBuilderlb=newLineBuilder(start3d,end3d)){// do something with the builderlineFromCoordinate3D=lb.ToSegment();}using(LineBuilderlb=newLineBuilder(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=newLineBuilder(lineSegment)){// find the existing coordinateslb.QueryCoords(outstartPt,outendPt);// or use //startPt = lb.StartPoint;//endPt = lb.EndPoint;// update the coordinateslb.SetCoords(GeometryEngine.Instance.Move(startPt,10,10)asMapPoint,GeometryEngine.Instance.Move(endPt,-10,-10)asMapPoint);// 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=newCoordinate2D(1.0,2.0);Coordinate2Dctrl2Pt=newCoordinate2D(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 MCTArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(CubicBezierBuildercbb=newCubicBezierBuilder(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 MCTArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(CubicBezierBuildercbb=newCubicBezierBuilder(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 MCTArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(CubicBezierBuildercbb=newCubicBezierBuilder(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=newCubicBezierBuilder(bezierSegment)){MapPointstartPt=cbb.StartPoint;Coordinate2DctrlPt1=cbb.ControlPoint1;Coordinate2DctrlPt2=cbb.ControlPoint2;MapPointendPt=cbb.EndPoint;// or use the QueryCoords methodcbb.QueryCoords(outstartPt,outctrlPt1,outctrlPt2,outendPt);}});
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=newCoordinate2D(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=newEllipticArcBuilder(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=newEllipticArcBuilder(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=newCoordinate2D(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=newEllipticArcBuilder(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=newCoordinate2D(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(outsemiMajor,outsemiMinor);// semiMajor = 1, semiMinor = 0.5// Builder constructors need to run on the MCT.ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{using(EllipticArcBuildercab=newEllipticArcBuilder(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=newCoordinate2D(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=newEllipticArcBuilder(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(newCoordinate2D(100,100),newCoordinate2D(50,50));LineSegmentsegment2=LineBuilder.CreateLineSegment(newCoordinate2D(100,100),newCoordinate2D(150,50));// Construct the hint point to determine where the arc will be constructed.Coordinate2DhintPoint=newCoordinate2D(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=newEllipticArcBuilder(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=newCoordinate2D(-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(outactualCenterPt,outstartAngle,outcentralAngle,outrotationAngle,outsemiMajor,outsemiMinor);// 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=newEllipticArcBuilder(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=newCoordinate2D(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=newEllipticArcBuilder(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=newEllipticArcBuilder(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 axesarc.GetAxes(outsemiMajorAxis,outsemiMinorAxis);// or use the properties// semiMajorAxis = arc.SemiMajorAxis;// semiMinorAxis = arc.SemiMinorAxis;doublestartAngle,centralAngle,rotationAngle;// or use QueryCoords to get complete informationarc.QueryCoords(outcenterPt,outstartAngle,outcentralAngle,outrotationAngle,outsemiMajorAxis,outsemiMinorAxis);// 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=newGeometryBagBuilder(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>(){newCoordinate2D(0,0),newCoordinate2D(0,1),newCoordinate2D(1,1),newCoordinate2D(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>(){newCoordinate2D(50,60),newCoordinate2D(-120,-70),newCoordinate2D(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=newGeometryBagBuilder(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>(){newCoordinate2D(50,60),newCoordinate2D(-120,-70),newCoordinate2D(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=newGeometryBagBuilder(SpatialReferences.WGS84)){// builder.CountGeometries = 0builder.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=newCoordinate3D(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=newCoordinate3D(50,50,-500);Coordinate3DtoCoord=newCoordinate3D(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,reftextureCoordinates);}// 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,refnormalCoordinates);}
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)asMultipatch;
Construct Multipatch via MultipatchBuilderEx
varcoords_face1=newList<Coordinate3D>(){newCoordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),newCoordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),newCoordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),newCoordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),newCoordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),newCoordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),};varcoords_face2=newList<Coordinate3D>(){newCoordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),newCoordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),newCoordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),newCoordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),newCoordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),newCoordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),};varcoords_face3=newList<Coordinate3D>(){newCoordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),newCoordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),newCoordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),newCoordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),newCoordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),newCoordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),};varcoords_face4=newList<Coordinate3D>(){newCoordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),newCoordinate3D(12.495461061000071,41.902576344000067,59.504700000004959),newCoordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),newCoordinate3D(12.495488442000067,41.902576344000067,59.504700000004959),newCoordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),newCoordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),};varcoords_face5=newList<Coordinate3D>(){newCoordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),newCoordinate3D(12.495461061000071,41.902603910000039,59.504700000004959),newCoordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),newCoordinate3D(12.495488442000067,41.902603910000039,59.504700000004959),newCoordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),newCoordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),};varcoords_face6=newList<Coordinate3D>(){newCoordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),newCoordinate3D(12.495461061000071,41.902603910000039,62.552700000000186),newCoordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),newCoordinate3D(12.495488442000067,41.902603910000039,62.552700000000186),newCoordinate3D(12.495461061000071,41.902576344000067,62.552700000000186),newCoordinate3D(12.495488442000067,41.902576344000067,62.552700000000186),};// materialsvarmaterialRed=newBasicMaterial();materialRed.Color=System.Windows.Media.Colors.Red;varmaterialTransparent=newBasicMaterial();materialTransparent.Color=System.Windows.Media.Colors.White;materialTransparent.TransparencyPercent=80;varblueTransparent=newBasicMaterial(materialTransparent);blueTransparent.Color=System.Windows.Media.Colors.SkyBlue;// create a list of patch objectsvarpatches=newList<Patch>();// create the multipatchBuilderEx objectvarmpb=newArcGIS.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 multipatchBuildermpb.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()asMultipatch;
Construct Multipatch from another Multipatch
// create the multipatchBuilderEx objectvarbuilder=newArcGIS.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 materialpatches[0].Material=brickMaterialTexture;}// update the builder for M awarenessbuilder.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 coordinatesbuilder.SynchronizeAttributeAwareness();// call ToGeometry to get the multipatchmultipatch=builder.ToGeometry()asMultipatch;// 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}
Create BasicMaterial
// Create BasicMaterial with default valuesBasicMaterialmaterial=newBasicMaterial();System.Windows.Media.Colorcolor=material.Color;// color = Colors.BlackSystem.Windows.Media.ColoredgeColor=material.EdgeColor;// edgeColor = Colors.BlackintedgeWidth=material.EdgeWidth;// edgeWidth = 0inttransparency=material.TransparencyPercent;// transparency = 0intshininess=material.Shininess;// shininess = 0boolcullBackFace=material.CullBackFace;// cullBackFace = false// Modify the propertiesmaterial.Color=System.Windows.Media.Colors.Red;material.EdgeColor=System.Windows.Media.Colors.Blue;material.EdgeWidth=10;material.TransparencyPercent=50;material.Shininess=25;material.CullBackFace=true;
Create BasicMaterial with JPEG texture
// read the jpeg into a bufferSystem.Drawing.Imageimage=System.Drawing.Image.FromFile(@"C:\temp\myImageFile.jpg");MemoryStreammemoryStream=newMemoryStream();System.Drawing.Imaging.ImageFormatformat=System.Drawing.Imaging.ImageFormat.Jpeg;image.Save(memoryStream,format);byte[]imageBuffer=memoryStream.ToArray();varjpgTexture=newJPEGTexture(imageBuffer);// texture propertiesintbpp=jpgTexture.BytesPerPixel;intcolumnCount=jpgTexture.ColumnCount;introwCount=jpgTexture.RowCount;// build the textureResource and the materialBasicMaterialmaterial=newBasicMaterial();material.TextureResource=newTextureResource(jpgTexture);
Create BasicMaterial with Uncompressed texture
UncompressedTextureuncompressedTexture1=newUncompressedTexture(newbyte[10*12*3],10,12,3);// texture propertiesintbpp=uncompressedTexture1.BytesPerPixel;intcolumnCount=uncompressedTexture1.ColumnCount;introwCount=uncompressedTexture1.RowCount;// build the textureResource and the materialTextureResourcetr=newTextureResource(uncompressedTexture1);BasicMaterialmaterial=newBasicMaterial();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=newMemoryStream(textureBuffer);System.Drawing.Imageimage=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,refnormals);// 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.Colorcolor=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){caseGeometryType.Envelope:singleParts.Add(inputGeometry.Clone()asEnvelope);break;caseGeometryType.Multipatch:singleParts.Add(inputGeometry.Clone()asMultipatch);break;caseGeometryType.Multipoint:varmultiPoint=inputGeometryasMultipoint;foreach(varpointinmultiPoint.Points){// add each point of collection as a standalone point into the listsingleParts.Add(point);}break;caseGeometryType.Point:singleParts.Add(inputGeometry.Clone()asMapPoint);break;caseGeometryType.Polygon:varpolygon=inputGeometryasPolygon;foreach(varpolygonPartinpolygon.Parts){// use the PolygonBuilder turning the segments into a standalone // polygon instancesingleParts.Add(PolygonBuilder.CreatePolygon(polygonPart));}break;caseGeometryType.Polyline:varpolyline=inputGeometryasPolyline;foreach(varpolylinePartinpolyline.Parts){// use the PolylineBuilder turning the segments into a standalone// polyline instancesingleParts.Add(PolylineBuilder.CreatePolyline(polylinePart));}break;caseGeometryType.Unknown:break;default:break;}returnsingleParts;}
Get the outermost rings of a polygon
publicPolygonGetOutermostRings(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(varpartinclockwiseParts){// add the first (the largest) ring into the internal collectionif(internalRings.Count==0)internalRings.Add(partasPolygon);// use flag to indicate if current part is within the already selection polygonsboolisWithin=false;foreach(varitemininternalRings){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(partasPolygon);}using(PolygonBuilderouterRings=newPolygonBuilder()){// now assemble a new polygon geometry based on the internal polygon collectionforeach(varringininternalRings){outerRings.AddParts(ring.Parts);}// return the final geometry of the outer ringsreturnouterRings.ToGeometry();}}
Retrieve Geometry from Geodatabase
Retrieve Geometry from Geodatabase
// methods need to run on the MCTArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{try{// open a gdbusing(ArcGIS.Core.Data.Geodatabasegdb=newArcGIS.Core.Data.Geodatabase(newFileGeodatabaseConnectionPath(newUri(@"c:\Temp\MyDatabase.gdb")))){//Open a featureClass using(ArcGIS.Core.Data.FeatureClassfeatureClass=gdb.OpenDataset<ArcGIS.Core.Data.FeatureClass>("Polygon")){// find a field ArcGIS.Core.Data.FeatureClassDefinitionfeatureClassDefinition=featureClass.GetDefinition();intfldIndex=featureClassDefinition.FindField("SomeField");if(fldIndex==-1){return;}ArcGIS.Core.Data.QueryFilterfilter=newArcGIS.Core.Data.QueryFilter{WhereClause="OBJECTID = 6"};// get the rowusing(ArcGIS.Core.Data.RowCursorrowCursor=featureClass.Search(filter,false)){while(rowCursor.MoveNext()){using(varrow=rowCursor.Current){longoid=row.GetObjectID();// get the shape from the rowArcGIS.Core.Data.Featurefeature=rowasArcGIS.Core.Data.Feature;Polygonpolygon=feature.GetShape()asPolygon;// 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)asMapPoint;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)asMapPoint;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)asMapPoint;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)asMapPoint;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>{newCoordinate2D(0,0),newCoordinate2D(0,1),newCoordinate2D(1,1),newCoordinate2D(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=geometryasPolyline;// alternatively, determine the size for the bufferintbufferSize=GeometryEngine.Instance.GetWKBSize(wkbExportFlags,polyline);buffer=newbyte[bufferSize];// exportbufferSize=GeometryEngine.Instance.ExportToWKB(wkbExportFlags,polyline,refbuffer);// importimportPolyline=GeometryEngine.Instance.ImportFromWKB(wkbImportFlags,buffer,SpatialReferences.WGS84)asPolyline;
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)asPolygon;EnvelopeimportedEnvelope=importedPolygon.Extent;// export without z,mbuffer=GeometryEngine.Instance.ExportToEsriShape(EsriShapeExportFlags.esriShapeExportStripZs|EsriShapeExportFlags.esriShapeExportStripMs,envelope);importedPolygon=GeometryEngine.Instance.ImportFromEsriShape(importFlags,buffer,SpatialReferences.WGS84)asPolygon;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,refbuffer);importedPolygon=GeometryEngine.Instance.ImportFromEsriShape(importFlags,buffer,envelope.SpatialReference)asPolygon;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=geometryasMapPoint;// 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)asMapPoint;// 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>(){newCoordinate2D(100,200),newCoordinate2D(201,300),newCoordinate2D(301,400),newCoordinate2D(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)asMultipoint;// 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=geometryasPolyline;// 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=geometryasPolygon;// 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)asPolygon;// 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()asGeographicTransformation;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.TransformationsasIList<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()asCompositeGeographicTransformation;// 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)asCompositeGeographicTransformation;
Create Projection Transformation
// methods need to be on the MCTArcGIS.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(newCoordinate2D(2,2),newCoordinate2D(3,3),sr4267);// Project with one geo transform 4267 -> 3857EnvelopeprojectedEnvEx=GeometryEngine.Instance.ProjectEx(env,projTransFromSRs)asEnvelope;// 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)asEnvelope;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()asHVDatumTransformation;// 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.TransformationsasList<HVDatumTransformation>;HVDatumTransformationtranform=transforms[0];// transform.Wkid = 108034// get inverseCompositeHVDatumTransformationinverse_compositehv=compositehv.GetInverse()asCompositeHVDatumTransformation;// create from xmlstringxml=compositehv.ToXML();CompositeHVDatumTransformationxml_compositehv=CompositeHVDatumTransformation.CreateFromXML(xml);// create from jsonstringjson=compositehv.ToJson();CompositeHVDatumTransformationjson_compositehv=DatumTransformation.CreateFromJson(json)asCompositeHVDatumTransformation;
Determine Transformations
// methods need to run on the MCTArcGIS.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.TransformationasCompositeGeographicTransformation;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.TransformationasCompositeGeographicTransformation;// 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.TransformationasCompositeGeographicTransformation;// compositeGT.Count = 1// compositeGT[0].Wkid = 1173// compositeGT[0].Name = "NAD_1927_To_WGS_1984_4"// compositeGT[0].IsForward = trueprojTrans=transformations[2];compositeGT=projTrans.TransformationasCompositeGeographicTransformation;// compositeGT.Count = 1// compositeGT[0].Wkid = 1172// compositeGT[0].Name = "NAD_1927_To_WGS_1984_3"// compositeGT[0].IsForward = trueprojTrans=transformations[3];compositeGT=projTrans.TransformationasCompositeGeographicTransformation;// 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.TransformationasCompositeGeographicTransformation;// 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.TransformationasCompositeGeographicTransformation;// 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.TransformationasCompositeGeographicTransformation;// 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.TransformationasCompositeHVDatumTransformation;// 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)asMapPoint;MapPointpointEmpty=MapPointBuilder.CreateMapPoint(sr);MapPointpointwithNoSR=MapPointBuilder.CreateMapPoint(1,1);MapPointpointZM=MapPointBuilder.CreateMapPoint(1,2,3,4,sr);// convert to MGRSToGeoCoordinateParametermgrsParam=newToGeoCoordinateParameter(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 convertmgrsParam.NumDigits=2;geoCoordString=point1.ToGeoCoordinateString(mgrsParam);// 32QPH0512outPoint=MapPointBuilder.FromGeoCoordinateString(geoCoordString,sr,GeoCoordinateType.MGRS);// outPoint.X = 10; outPoint.Y = 20// convert to UTMToGeoCoordinateParameterutmParam=newToGeoCoordinateParameter(GeoCoordinateType.UTM);geoCoordString=point0.ToGeoCoordinateString(utmParam);// 31N 166021 0000000geoCoordString=point1.ToGeoCoordinateString(utmParam);// 32Q 604609 2211793// convert to DMSToGeoCoordinateParameterdmsParam=newToGeoCoordinateParameter(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=newToGeoCoordinateParameter(GeoCoordinateType.DDM);geoCoordString=point0.ToGeoCoordinateString(ddmParam);// 00 00.0000N 000 00.0000EgeoCoordString=point1.ToGeoCoordinateString(ddmParam);// 20 00.0000N 010 00.0000E// convert to DDToGeoCoordinateParameterddParam=newToGeoCoordinateParameter(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)}