publicasyncTaskOpenTinDataset(){try{awaitArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\Tin";varfileConnection=newFileSystemConnectionPath(newUri(path),FileSystemDatastoreType.Tin);using(FileSystemDatastoredataStore=newFileSystemDatastore(fileConnection)){// TIN is in a folder at d:\Data\Tin\TinDatasetstringdsName="TinDataset";using(vardataset=dataStore.OpenDataset<ArcGIS.Core.Data.Analyst3D.TinDataset>(dsName)){}}});}catch(GeodatabaseNotFoundOrOpenedExceptionexception){// Handle Exception.}}
Get a TIN Defintion
publicasyncTaskGetTinDatasetDefinition(){try{awaitArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\Tin";varfileConnection=newFileSystemConnectionPath(newUri(path),FileSystemDatastoreType.Tin);using(FileSystemDatastoredataStore=newFileSystemDatastore(fileConnection)){// TIN is in a folder at d:\Data\Tin\TinDatasetstringdsName="TinDataset";using(vardef=dataStore.GetDefinition<ArcGIS.Core.Data.Analyst3D.TinDatasetDefinition>(dsName)){}}});}catch(GeodatabaseNotFoundOrOpenedExceptionexception){// Handle Exception.}}
// search all nodesusing(ArcGIS.Core.Data.Analyst3D.TinNodeCursornodeCursor=tinDataset.SearchNodes(null)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNodenode=nodeCursor.Current){}}}// search within an extentArcGIS.Core.Data.Analyst3D.TinNodeFilternodeFilter=newArcGIS.Core.Data.Analyst3D.TinNodeFilter();nodeFilter.FilterEnvelope=envelope;using(ArcGIS.Core.Data.Analyst3D.TinNodeCursornodeCursor=tinDataset.SearchNodes(nodeFilter)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNodenode=nodeCursor.Current){}}}// search all "inside" nodesnodeFilter=newArcGIS.Core.Data.Analyst3D.TinNodeFilter();nodeFilter.FilterType=ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;using(ArcGIS.Core.Data.Analyst3D.TinNodeCursornodeCursor=tinDataset.SearchNodes(nodeFilter)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNodenode=nodeCursor.Current){}}}// search for super nodes onlynodeFilter=newArcGIS.Core.Data.Analyst3D.TinNodeFilter();nodeFilter.FilterEnvelope=tinDataset.GetSuperNodeExtent();nodeFilter.SuperNode=true;using(ArcGIS.Core.Data.Analyst3D.TinNodeCursornodeCursor=tinDataset.SearchNodes(nodeFilter)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNodenode=nodeCursor.Current){}}}
Search for TIN Edges
// search all edgesusing(ArcGIS.Core.Data.Analyst3D.TinEdgeCursoredgeCursor=tinDataset.SearchEdges(null)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdgeedge=edgeCursor.Current){}}}// search within an extentArcGIS.Core.Data.Analyst3D.TinEdgeFilteredgeFilter=newArcGIS.Core.Data.Analyst3D.TinEdgeFilter();edgeFilter.FilterEnvelope=envelope;using(ArcGIS.Core.Data.Analyst3D.TinEdgeCursoredgeCursor=tinDataset.SearchEdges(edgeFilter)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdgeedge=edgeCursor.Current){}}}// search all "inside" edgesedgeFilter=newArcGIS.Core.Data.Analyst3D.TinEdgeFilter();edgeFilter.FilterType=ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;using(ArcGIS.Core.Data.Analyst3D.TinEdgeCursoredgeCursor=tinDataset.SearchEdges(edgeFilter)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdgeedge=edgeCursor.Current){}}}// search for hard edgesedgeFilter=newArcGIS.Core.Data.Analyst3D.TinEdgeFilter();edgeFilter.FilterByEdgeType=true;edgeFilter.EdgeType=ArcGIS.Core.Data.Analyst3D.TinEdgeType.HardEdge;using(ArcGIS.Core.Data.Analyst3D.TinEdgeCursoredgeCursor=tinDataset.SearchEdges(edgeFilter)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdgeedge=edgeCursor.Current){}}}
Search for TIN Triangles
// search all trianglesusing(ArcGIS.Core.Data.Analyst3D.TinTriangleCursortriangleCursor=tinDataset.SearchTriangles(null)){while(triangleCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinTriangletriangle=triangleCursor.Current){}}}// search within an extentArcGIS.Core.Data.Analyst3D.TinTriangleFiltertriangleFilter=newArcGIS.Core.Data.Analyst3D.TinTriangleFilter();triangleFilter.FilterEnvelope=envelope;using(ArcGIS.Core.Data.Analyst3D.TinTriangleCursortriangleCursor=tinDataset.SearchTriangles(triangleFilter)){while(triangleCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinTriangletriangle=triangleCursor.Current){}}}// search all "inside" trianglestriangleFilter=newArcGIS.Core.Data.Analyst3D.TinTriangleFilter();triangleFilter.FilterType=ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;using(ArcGIS.Core.Data.Analyst3D.TinTriangleCursortriangleCursor=tinDataset.SearchTriangles(triangleFilter)){while(triangleCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinTriangletriangle=triangleCursor.Current){}}}
Access TIN Elements by MapPoint
// "identify" the closest node, edge, triangleusing(varnearestNode=tinDataset.GetNearestNode(mapPoint)){}using(varnearestEdge=tinDataset.GetNearestEdge(mapPoint)){}using(vartriangle=tinDataset.GetTriangleByPoint(mapPoint)){}// get the set of natural neighbours // (set of nodes that "mapPoint" would connect with to form triangles if it was added to the TIN)IReadOnlyList<ArcGIS.Core.Data.Analyst3D.TinNode>naturalNeighbors=tinDataset.GetNaturalNeighbors(mapPoint);// get the set of triangles whose circumscribed circle contains "mapPoint" IReadOnlyList<ArcGIS.Core.Data.Analyst3D.TinTriangle>triangles=tinDataset.GetTriangleNeighborhood(mapPoint);
TIN Nodes
// node coordinatesvarcoord3D=node.Coordinate3D;varmapPoint=node.ToMapPoint();// is the node "inside"varisInsideNode=node.IsInsideDataArea;// get all other nodes connected to "node" IReadOnlyList<ArcGIS.Core.Data.Analyst3D.TinNode>adjNodes=node.GetAdjacentNodes();// get all edges that share "node" as a from node. IReadOnlyList<ArcGIS.Core.Data.Analyst3D.TinEdge>edges=node.GetIncidentEdges();// get all triangles that share "node"IReadOnlyList<ArcGIS.Core.Data.Analyst3D.TinTriangle>triangles=node.GetIncidentTriangles();
TIN Edges
// nodes of the edgevarnodes=edge.Nodes;// edge geometryvarpolyline=edge.ToPolyline();// edge lengthvarlength=edge.Length;// is the edge "inside"varisInsideEdge=edge.IsInsideDataArea;// edge type - regular/hard/softvaredgeType=edge.EdgeType;// get next (clockwise) edge in the trianglevarnextEdge=edge.GetNextEdgeInTriangle();// get previous (anti-clockwise) edge in the trianglevarprevEdge=edge.GetPreviousEdgeInTriangle();// get opposite edgevaroppEdge=edge.GeNeighbor();// get left trianglevarleftTriangle=edge.LeftTriangle;// get right trianglevarrightTriangle=edge.RightTriangle;
TIN Triangles
// nodes, edges of the trianglevartriNnodes=triangle.Nodes;vartriEdges=triangle.Edges;// triangle geometryvarpolygon=triangle.ToPolygon();// triangle lengthvartriLength=triangle.Length;// triangle area vartriArea=triangle.Area;// is the triangle "inside"varisInsideTriangle=triangle.IsInsideDataArea;// triangle aspect and slope (radians)varaspect=triangle.Aspect;varslope=triangle.Slope;// get centroidvarcentroid=triangle.GetCentroid();// get normalvarnormal=triangle.GetNormal();// get adjacent trianglesvaradjTriangles=triangle.GetAdjacentTriangles();// get area of triangle that falls between the z valuesdoubleminZ=1.0;doublemaxZ=3.0;IReadOnlyList<Coordinate3D>coords=triangle.GetPointsBetweenZs(minZ,maxZ);
publicasyncTaskGetTerrainDefinition(){try{awaitArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\Terrain\filegdb_Containing_A_Terrain.gdb";varfileConnection=newFileGeodatabaseConnectionPath(newUri(path));using(GeodatabasedataStore=newGeodatabase(fileConnection)){stringdsName="nameOfTerrain";using(varterrainDef=dataStore.GetDefinition<ArcGIS.Core.Data.Analyst3D.TerrainDefinition>(dsName)){// get the feature class names that are used in the terrainvarfcNames=terrainDef.GetFeatureClassNames();}}});}catch(GeodatabaseNotFoundOrOpenedExceptionexception){// Handle Exception.}}
publicasyncTaskOpenLasDataset(){try{awaitArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\LASDataset";varfileConnection=newFileSystemConnectionPath(newUri(path),FileSystemDatastoreType.LasDataset);using(FileSystemDatastoredataStore=newFileSystemDatastore(fileConnection)){stringname="utrecht_tile.lasd";// can specify with or without the .lasd extensionusing(vardataset=dataStore.OpenDataset<ArcGIS.Core.Data.Analyst3D.LasDataset>(name)){}}});}catch(GeodatabaseNotFoundOrOpenedExceptionexception){// Handle Exception.}}
Get a LAS Dataset Defintion
publicasyncTaskGetLasDatasetDefinition(){try{awaitArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\LASDataset";varfileConnection=newFileSystemConnectionPath(newUri(path),FileSystemDatastoreType.LasDataset);using(FileSystemDatastoredataStore=newFileSystemDatastore(fileConnection)){stringname="utrecht_tile.lasd";// can specify with or without the .lasd extensionusing(vardataset=dataStore.GetDefinition<ArcGIS.Core.Data.Analyst3D.LasDatasetDefinition>(name)){}}});}catch(GeodatabaseNotFoundOrOpenedExceptionexception){// Handle Exception.}}
Get Individual File Information from a LAS Dataset
// access by IDIReadOnlyList<ArcGIS.Core.Data.Analyst3D.LasPoint>pts=lasDataset.GetPointByID(123456);pts=lasDataset.GetPointByID(123456,envelope);ArcGIS.Core.Data.Analyst3D.LasPointpt=pts.FirstOrDefault();varcoords=pt.Coordinate3D;varmapPoint=pt.ToMapPoint();
Search LAS Points
// search all pointsusing(ArcGIS.Core.Data.Analyst3D.LasPointCursorptCursor=lasDataset.SearchPoints(null)){while(ptCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.LasPointpoint=ptCursor.Current){}}}// search within an extentArcGIS.Core.Data.Analyst3D.LasPointFilterpointFilter=newArcGIS.Core.Data.Analyst3D.LasPointFilter();pointFilter.FilterGeometry=envelope;using(ArcGIS.Core.Data.Analyst3D.LasPointCursorptCursor=lasDataset.SearchPoints(pointFilter)){while(ptCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.LasPointpoint=ptCursor.Current){}}}// search within an extent and limited to specific classification codespointFilter=newArcGIS.Core.Data.Analyst3D.LasPointFilter();pointFilter.FilterGeometry=envelope;pointFilter.ClassCodes=newList<int>{4,5};using(ArcGIS.Core.Data.Analyst3D.LasPointCursorptCursor=lasDataset.SearchPoints(pointFilter)){while(ptCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.LasPointpoint=ptCursor.Current){}}}
Search using pre initialized arrays
// search all pointsusing(ArcGIS.Core.Data.Analyst3D.LasPointCursorptCursor=lasDataset.SearchPoints(null)){intcount;Coordinate3D[]lasPointsRetrieved=newCoordinate3D[10000];while(ptCursor.MoveNextArray(lasPointsRetrieved,null,null,null,outcount)){varpoints=lasPointsRetrieved.ToList();// ...}}// search within an extent// use MoveNextArray retrieving coordinates, fileIndex and pointIdsArcGIS.Core.Data.Analyst3D.LasPointFilterfilter=newArcGIS.Core.Data.Analyst3D.LasPointFilter();filter.FilterGeometry=envelope;using(ArcGIS.Core.Data.Analyst3D.LasPointCursorptCursor=lasDataset.SearchPoints(filter)){intcount;Coordinate3D[]lasPointsRetrieved=newCoordinate3D[50000];int[]fileIndexes=newint[50000];double[]pointIds=newdouble[50000];while(ptCursor.MoveNextArray(lasPointsRetrieved,null,fileIndexes,pointIds,outcount)){varpoints=lasPointsRetrieved.ToList();}}