Executing spatial queries
来源:互联网 发布:js定义map集合 编辑:程序博客网 时间:2024/06/05 19:58
空间查询是基于与某几何要素的空间关系的查询。
1.Finding features within a polygon
// Get the feature and its geometry given an ObjectID.IFeature stateFeature = stateFeatureClass.GetFeature(14);IGeometry queryGeometry = stateFeature.ShapeCopy;// Create the spatial filter; "highwayFeatureClass" is the feature class containing// the highway data. Set the SubFields property to "FULL_NAME" as only that field// is shown.ISpatialFilter spatialFilter = new SpatialFilterClass();spatialFilter.Geometry = queryGeometry;spatialFilter.GeometryField = highwayFeatureClass.ShapeFieldName;spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;spatialFilter.SubFields = "FULL_NAME";// Find the position of the "FULL_NAME" field in the highway feature class.int nameFieldPosition = highwayFeatureClass.FindField("FULL_NAME");// Execute the query and iterate through the cursor's results.using(ComReleaser comReleaser = new ComReleaser()){ IFeatureCursor highwayCursor = highwayFeatureClass.Search(spatialFilter, false); comReleaser.ManageLifetime(highwayCursor); IFeature highwayFeature = null; while ((highwayFeature = highwayCursor.NextFeature()) != null) { String name = Convert.ToString(highwayFeature.get_Value(nameFieldPosition)); Console.WriteLine("Highway found: {0}", name); }}
2.Querying for features with relation to multiple geometries
这个场景展示了如何使用geometry bag进行几何查询。geometry bag是一个单一的高层次的几何形状,存储的几何形状的集合。下列代码演示了如何在一组已知的block features中找到geometry bag。block features不相邻,但其ObjectIds是已知的。
// Create a geometry bag and give it the same spatial reference as the// blocks feature class.IGeometryBag geometryBag = new GeometryBagClass();IGeometryCollection geometryCollection = (IGeometryCollection)geometryBag;IGeoDataset geoDataset = (IGeoDataset)blocksFeatureClass;ISpatialReference spatialReference = geoDataset.SpatialReference;geometryBag.SpatialReference = spatialReference;// Get a feature cursor for the three blocks and put their geometries into the geometry bag.// A non-recycling cursor is used, as the features' geometries are stored// for later use.int[] blockObjectIDs = { 11043, 11049, 11057};using(ComReleaser comReleaser = new ComReleaser()){ IFeatureCursor blocksCursor = blocksFeatureClass.GetFeatures(blockObjectIDs, false); comReleaser.ManageLifetime(blocksCursor); IFeature blockFeature = null; object missingType = Type.Missing; while ((blockFeature = blocksCursor.NextFeature()) != null) { geometryCollection.AddGeometry(blockFeature.Shape, ref missingType, ref missingType); }}
When using a geometry bag as the query geometry, create a spatial index on the geometry bag to allow rapid access to the contained geometries during the spatial query. See the following code example:
// Cast the geometry bag to the ISpatialIndex interface and call the Invalidate method// to generate a new spatial index.ISpatialIndex spatialIndex = (ISpatialIndex)geometryBag;spatialIndex.AllowIndexing = true;spatialIndex.Invalidate();
现在的geometry bag可以用作一个新的空间滤波器的几何查询。下面的代码示例演示如何使用“包含”(包含在块中的完全的空间关系)的空间过滤器,以找到三个区块内的包裹数量:
// Create the spatial filter. The SubFields property specifies that only// the Shape field is retrieved, since the features' attributes aren't being inspected.ISpatialFilter spatialFilter = new SpatialFilterClass();spatialFilter.Geometry = geometryBag;spatialFilter.GeometryField = parcelsFeatureClass.ShapeFieldName;spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;spatialFilter.SubFields = "Shape";// Use IFeatureClass.FeatureCount to get a parcel count.int parcelCount = parcelsFeatureClass.FeatureCount(spatialFilter);Console.WriteLine("Parcels in the three blocks: {0}", parcelCount);
3.Buffering and querying
// Find the feature for Osaka and get its geometry.IFeature osakaFeature = citiesFeatureClass.GetFeature(2263);IGeometry osakaGeometry = osakaFeature.ShapeCopy;// Use the ITopologicalOperator interface to create a buffer.ITopologicalOperator topoOperator = (ITopologicalOperator)osakaGeometry;IGeometry buffer = topoOperator.Buffer(500000);
4.Evaluating a specific spatial relationship using IRelationalOperator
// Get the marsh and highway features from their respective classes.IFeature marshFeature = vegFeatureClass.GetFeature(518);IFeature highwayFeature = roadsFeatureClass.GetFeature(39);// Get the geometries of the two features.IGeometry marshGeometry = marshFeature.Shape;IGeometry highwayGeometry = highwayFeature.Shape;// Cast the highway's geometry to IRelationalOperator and determine if// it crosses the marsh's geometry.IRelationalOperator relationalOperator = (IRelationalOperator)highwayGeometry;Boolean crosses = relationalOperator.Crosses(marshGeometry);Console.WriteLine("Highway crosses marsh: {0}", crosses);
0 0
- Executing spatial queries
- Executing spatial queries
- oracle spatial
- Spatial Reference
- Oracle Spatial
- Oracle Spatial
- Oracle Spatial
- Oracle Spatial
- Spatial Filters
- about "static" executing order
- Executing an HTTP Request
- Error executing link.exe.
- Executing A Jira Filter
- 解决Error executing aapt.
- Error executing cl.exe
- Self-executing For JS
- ogg_Fatal error executing DDL
- self-Executing Anonymous Functions
- AT SELECTION-SCREEN OUTPUT 用法实例
- Git版本控制策略
- UIBezierPath 使用
- ADT下载地址(含各版本),最新ADT-23.0.6
- Unity3D在windows10下小问题解决
- Executing spatial queries
- Android Java层的hook检测(Cydia Substrate或者Xposed框架)
- Android只GLSurfaceView画立方体测试代码
- 分享pdf表格转换成excel的转换方法
- 使用Jsoup解析html网页
- 如何查看表和索引的统计信息
- Spring的quartz定时器
- 字符串结尾‘0’和‘\0’的区别
- 配置JAVA环境变量