publicasync Task OpenTinDataset(){try{await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\Tin";varfileConnection=new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.Tin);using(FileSystemDatastoredataStore=new FileSystemDatastore(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
publicasync Task GetTinDatasetDefinition(){try{await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\Tin";varfileConnection=new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.Tin);using(FileSystemDatastoredataStore=new FileSystemDatastore(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.TinNodeCursor nodeCursor= tinDataset.SearchNodes(null)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNode node= nodeCursor.Current){}}}// search within an extent
ArcGIS.Core.Data.Analyst3D.TinNodeFilter nodeFilter=new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
nodeFilter.FilterEnvelope =envelope;using(ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor= tinDataset.SearchNodes(nodeFilter)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNode node= nodeCursor.Current){}}}// search all "inside" nodesnodeFilter=new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
nodeFilter.FilterType = ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;using(ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor= tinDataset.SearchNodes(nodeFilter)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNode node= nodeCursor.Current){}}}// search for super nodes onlynodeFilter=new ArcGIS.Core.Data.Analyst3D.TinNodeFilter();
nodeFilter.FilterEnvelope = tinDataset.GetSuperNodeExtent();
nodeFilter.SuperNode =true;using(ArcGIS.Core.Data.Analyst3D.TinNodeCursor nodeCursor= tinDataset.SearchNodes(nodeFilter)){while(nodeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinNode node= nodeCursor.Current){}}}
Search for TIN Edges
// search all edgesusing(ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor= tinDataset.SearchEdges(null)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdge edge= edgeCursor.Current){}}}// search within an extent
ArcGIS.Core.Data.Analyst3D.TinEdgeFilter edgeFilter=new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
edgeFilter.FilterEnvelope =envelope;using(ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor= tinDataset.SearchEdges(edgeFilter)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdge edge= edgeCursor.Current){}}}// search all "inside" edgesedgeFilter=new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
edgeFilter.FilterType = ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;using(ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor= tinDataset.SearchEdges(edgeFilter)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdge edge= edgeCursor.Current){}}}// search for hard edgesedgeFilter=new ArcGIS.Core.Data.Analyst3D.TinEdgeFilter();
edgeFilter.FilterByEdgeType =true;
edgeFilter.EdgeType = ArcGIS.Core.Data.Analyst3D.TinEdgeType.HardEdge;using(ArcGIS.Core.Data.Analyst3D.TinEdgeCursor edgeCursor= tinDataset.SearchEdges(edgeFilter)){while(edgeCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinEdge edge= edgeCursor.Current){}}}
Search for TIN Triangles
// search all trianglesusing(ArcGIS.Core.Data.Analyst3D.TinTriangleCursor triangleCursor= tinDataset.SearchTriangles(null)){while(triangleCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinTriangle triangle= triangleCursor.Current){}}}// search within an extent
ArcGIS.Core.Data.Analyst3D.TinTriangleFilter triangleFilter=new ArcGIS.Core.Data.Analyst3D.TinTriangleFilter();
triangleFilter.FilterEnvelope =envelope;using(ArcGIS.Core.Data.Analyst3D.TinTriangleCursor triangleCursor= tinDataset.SearchTriangles(triangleFilter)){while(triangleCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinTriangle triangle= triangleCursor.Current){}}}// search all "inside" trianglestriangleFilter=new ArcGIS.Core.Data.Analyst3D.TinTriangleFilter();
triangleFilter.FilterType = ArcGIS.Core.Data.Analyst3D.TinFilterType.InsideDataArea;using(ArcGIS.Core.Data.Analyst3D.TinTriangleCursor triangleCursor= tinDataset.SearchTriangles(triangleFilter)){while(triangleCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.TinTriangle triangle= 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);
publicasync Task GetTerrainDefinition(){try{await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\Terrain\filegdb_Containing_A_Terrain.gdb";varfileConnection=new FileGeodatabaseConnectionPath(new Uri(path));using(GeodatabasedataStore=new Geodatabase(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.}}
Get datasources from a Terrain
vardsCount= terrain.GetDataSourceCount();IReadOnlyList<ArcGIS.Core.Data.Analyst3D.TerrainDataSource>dataSources= terrain.GetDataSources();foreach(var ds in dataSources){vardsName= ds.DataSourceName;varsurfaceType= ds.SurfaceType;varmaxResolution= ds.MaximumResolution;varminResolution= ds.MinimumResolution;}
Get Pyramid Level Information from a Terrain
varlevelCount= terrain.GetPyramidLevelCount();IReadOnlyList<ArcGIS.Core.Data.Analyst3D.TerrainPyramidLevel>pyramidLevels= terrain.GetPyramidLevels();foreach(var pyramidLevel in pyramidLevels){varresolution= pyramidLevel.Resolution;varmaxScale= pyramidLevel.MaximumScale;}
publicasync Task OpenLasDataset(){try{await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\LASDataset";varfileConnection=new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.LasDataset);using(FileSystemDatastoredataStore=new FileSystemDatastore(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
publicasync Task GetLasDatasetDefinition(){try{await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(()=>{stringpath=@"d:\Data\LASDataset";varfileConnection=new FileSystemConnectionPath(new Uri(path), FileSystemDatastoreType.LasDataset);using(FileSystemDatastoredataStore=new FileSystemDatastore(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
// search all pointsusing(ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor= lasDataset.SearchPoints(null)){while(ptCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.LasPoint point= ptCursor.Current){}}}// search within an extent
ArcGIS.Core.Data.Analyst3D.LasPointFilter pointFilter=new ArcGIS.Core.Data.Analyst3D.LasPointFilter();
pointFilter.FilterGeometry =envelope;using(ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor= lasDataset.SearchPoints(pointFilter)){while(ptCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.LasPoint point= ptCursor.Current){}}}// search within an extent and limited to specific classification codespointFilter=new ArcGIS.Core.Data.Analyst3D.LasPointFilter();
pointFilter.FilterGeometry =envelope;
pointFilter.ClassCodes =newList<int>{4,5};using(ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor= lasDataset.SearchPoints(pointFilter)){while(ptCursor.MoveNext()){using(ArcGIS.Core.Data.Analyst3D.LasPoint point= ptCursor.Current){}}}
Search using pre initialized arrays
// search all pointsusing(ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor= lasDataset.SearchPoints(null)){intcount;
Coordinate3D[]lasPointsRetrieved=new Coordinate3D[10000];while(ptCursor.MoveNextArray(lasPointsRetrieved,null,null,null,out count)){varpoints= lasPointsRetrieved.ToList();// ...}}// search within an extent// use MoveNextArray retrieving coordinates, fileIndex and pointIds
ArcGIS.Core.Data.Analyst3D.LasPointFilter filter=new ArcGIS.Core.Data.Analyst3D.LasPointFilter();
filter.FilterGeometry =envelope;using(ArcGIS.Core.Data.Analyst3D.LasPointCursor ptCursor= lasDataset.SearchPoints(filter)){intcount;
Coordinate3D[]lasPointsRetrieved=new Coordinate3D[50000];int[]fileIndexes=newint[50000];double[]pointIds=newdouble[50000];while(ptCursor.MoveNextArray(lasPointsRetrieved,null, fileIndexes, pointIds,out count)){varpoints= lasPointsRetrieved.ToList();}}