1 / 116

GIS 应用开发 Developing GIS Applications with ArcObjects using C#.NET 江西省研究生优质课程 主讲: 兰小机 GIS 博士、教授

GIS 应用开发 Developing GIS Applications with ArcObjects using C#.NET 江西省研究生优质课程 主讲: 兰小机 GIS 博士、教授 Email : landcom8835@163.com QQ : 305333315 课件: ftp://218.87.136.94/. 兰小机简历. 主要经历 1988 年 7 月 毕业于南方冶金学院工程测量专业,获 学士学位 ,并留校任教 1994 年 6 月 毕业于武汉测绘科技大学工程测量专业,获 硕士学位 ,回校任教

Download Presentation

GIS 应用开发 Developing GIS Applications with ArcObjects using C#.NET 江西省研究生优质课程 主讲: 兰小机 GIS 博士、教授

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. GIS应用开发 • Developing GIS Applications with ArcObjects using C#.NET • 江西省研究生优质课程 • 主讲:兰小机 GIS博士、教授 • Email : landcom8835@163.com • QQ :305333315 • 课件: ftp://218.87.136.94/

  2. 兰小机简历 • 主要经历 • 1988年7月毕业于南方冶金学院工程测量专业,获学士学位,并留校任教 • 1994年6月毕业于武汉测绘科技大学工程测量专业,获硕士学位,回校任教 • 2005年6月毕业于南京师范大学地图学与地理信息系统专业,获理学博士学位,回校任教 • 主要研究方向 • GIS应用开发 • 分布式并行计算环境下空间数据的存储管理 • 空间数据库理论与GMLGIS • GML空间数据挖掘 • 空间数据集成与共享

  3. 科研项目 • 国家自然科学基金项目--面向GML的时空关联规则及序列模式挖掘研究(编号:40971234) ,35万元,主持 • 国家自然科学基金项目--本原GML空间数据库理论及GMLGIS与传统GIS集成研究(编号:40761017) ,16万元,主持 • 国家自然科学基金项目 -- GML空间数据存储索引机制研究(编号:40401045) ,26万元,排名第二 • 地理信息科学江苏省重点实验室开发基金项目 --面向对象的GML空间数据库及其应用研究(编号:JK20050302) ,5万元主持 • 江西省教育厅科技项目—GML空间数据库理论及GMLGIS研究,1万元,主持 • 萍乡市基础地理信息系统研究与开发,22万元,主持 • 城市公众地理信息服务系统研究与开发,10万元,主持

  4. Chap.9 空间查询与空间分析 (4学时) • 本章内容: • 空间查询基础 • 空间分析基础 • 属性条件查询 • 基于空间位置、空间关系的查询 • 缓冲区查询 • 邻接多边形查询 • 缓冲区分析 • 空间叠加分析 • 网络分析

  5. 9.1 空间查询基础 • Cursor与FeatureCursor对象 • QueryFilter与SpatialFilter对象 • QueryDef对象 • TableSort对象 • 要素选择集

  6. 9.1.1 Cursor与FeatureCursor对象 • 游标Cursor对象本质上是一个指向数据的指针,本身并不包含数据内容,它只是提供了一个链接到Row对象或要素对象的桥梁而已。 • 游标有三种类型,即查询游标、插入游标和更新游标。每一种游标都是通过与之相适应的方法来获得的,如Search、Insert和Update方法。

  7. Cursor对象支持的接口是ICursor. • ICursor pCursor = ITable.Insert(……) • Insert方法返回一个插入型游标,它通常用于往表中插入一批记录。 • ICursor pCursor = ITable.Update(……) • Update方法会返回一个更新型游标,它用于更新或者删除一批记录。 • ICursor pCursor= ITable.Search(……) • 使用ITable.Search方法对表进行查询后,可以得到一个查询型Cursor对象,它指向一个或多个Row对象。

  8. IRowprow = pCursor.NextRow(); while (prow != null) { …….//对Row对象进行操作 prow = pCursor.NextRow(); } • FeatureCursor是Cursor的一个子类,指向一个或多个要素。它实现了IFeatureCursor接口,这个接口定义的属性和方法与ICursor类似。

  9. //IFeatureLayerpFeatlyr IFeatureCursorpCursor = pFeatlyr.search ( null,false ); //返回游标对象 IFeaturepFeat = pCursor.NextFeature(); //下面做一个循环可以遍历游标指向的要素 while (pFeat != null) { ....... //对要素pFeat进行操作 pFeat = pCursor.NextFeature(); }

  10. 9.1.2 QueryFilter与SpatialFilter对象 • 在关系数据库中,查询条件是使用SQL语句的WHERE子语句完成的。 • ArcObjects中并不直接使用SQL语句,它是通过多个不同对象的配合来实现数据选择目的的。QueryFilter与SpatialFilter对象就承担了这个任务。 • QueryFilter filters data based on attribute values and or relationships. • SpatialFilter filters data based on a spatial relationship.

  11. IQueryFilter接口 IQueryFilter pQueryFilter = new QueryFilterClass(); //设置过滤器对象的属性 pQueryFilter.WhereClause = "STATE_NAME = 'California'"; IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection; pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);

  12. 如果在选择的过程中不过滤任何的记录,而是返回所有的数据,则可以使用关键字“null”来替代pQueryFilter对象:如果在选择的过程中不过滤任何的记录,而是返回所有的数据,则可以使用关键字“null”来替代pQueryFilter对象: pFeatureSelection.SelectFeatures(null, esriSelectionResultEnum.esriSelectionResultNew, false); 如用户如果希望知道一个要素类中的要素数目: pFeatureClass.FeatureCount(null)

  13. 不同的数据源, WhereClause 的语法不一样。 (1) 字段名引用不同 • 如果要查询的数据源为file Geodatabase、shapefile、dBase table、coverage或INFO 表,则字段名使用双引号引用,如"AREA"; • 如果要查询的数据源为personal Geodatabase,则字段名使用方括号引用,如[AREA]; • 如果要查询的数据源为ArcSDE Geodatabase或 ArcIMS影像服务或要素服务,则字段名直接使用,如AREA • 如果要查询的数据源为Excel文件(.xls)中worksheet或文本文件(.txt),一般情况下,字段名使用单引号引用,如'AREA';但如果是从表窗口中打开Select By Attributes 对话框时,则字段名使用方括号引用,如[AREA]。

  14. (2) 字符串使用区别 • 字符串总是使用单引号引用,如: "STATE_NAME" = 'California' • Personal Geodatabase中的字段值不区分大小写;而ArcSDE、File Geodatabases及shapefiles中的字段值大小写敏感。可以使用转换函数将字符串统一转换为大写或小写;基于文件的数据源,使用UPPER函数将字符串中的所有字符转换为大写,使用LOWER函数将字符串中的所有字符转换为小写,如UPPER("LAST_NAME") = 'JONES';其他数据源有类似的转换函数,如personal Geodatabase中的UCASE、LCASE。 • 使用LIKE运算符(代替”=”) 构建基于部分字符串的查询,如“STATE_NAME” LIKE ‘Miss%’。

  15. (3) 通配符使用区别。通配符是代表一个或多个字符的一个特殊符号。 • 对于文件类型的数据源,'%'代表其所在位置的一个或多个或无字符;'_'代表其所在位置的任意一个字符,如"NAME" LIKE 'Cath%',"OWNER_NAME" LIKE '_atherine smith'. • 对于personal Geodatabase,'*'代表任意数目的字符,'?'代表任意单个字符。 • 对于连接表,要使用合适的通配符;如果查询仅用到目标表的字段,则使用目标表的通配符;如果查询仅用到连接表的字段,则使用连接表的通配符;如果查询用涉及到两边的字段,则使用'%'、'_'通配符。 • 例如:如果要连接一个dbf文件(连接表)到personal Geodatabase要素类 (目标表): • 如果查询仅涉及到personal Geodatabase 中的字段,使用*通配符; • 如果查询仅涉及到dbf 中的列,使用%通配符; • 如果查询涉及到两边的表,使用%通配符。

  16. (4) 其他 • Geodatabases中的字段、 shapefiles/dBASE 表及coverages/INFO表中的date 字段都支持Null值。 • File Geodatabase不支持Distinct关键字,建议使用IDataStatistics.UniqueValues返回某个字段上的唯一值。 • 可以使用=、<>、>、<、>=、<=运算符查询数值型数据,如"POPULATION96" >= 5000。 • 日期的查询语法依赖于数据源类型,如personal Geodatabase 中[DATE_OF_BIRTH] = #06-13-2001 19:30:00#,file Geodatabase中"DATE_OF_BIRTH" = date '2001-06-13 19:30:00'.

  17. 开发人员可以使用Workspace的ISQLSyntax接口来确定数据源使用的SQL语法,如表名、字段名使用的分隔符,引号使用的字符等。开发人员可以使用Workspace的ISQLSyntax接口来确定数据源使用的SQL语法,如表名、字段名使用的分隔符,引号使用的字符等。

  18. 使用ISQLSyntax.GetSpecialCharacter方法返回数据源使用的分隔符的前缀和后缀等信息,该方法的语法如下:使用ISQLSyntax.GetSpecialCharacter方法返回数据源使用的分隔符的前缀和后缀等信息,该方法的语法如下: public string GetSpecialCharacter ( esriSQLSpecialCharacters sqlSC); • esriSQLSpecialCharacters取值如下: • esriSQL_WildcardManyMatch,值为1,多字符通配符; • esriSQL_WildcardSingleMatch,值为2,单字符通配符; • esriSQL_DelimitedIdentifierPrefix,值为3,分隔符前缀; • esriSQL_DelimitedIdentifierSuffix,值为4,分隔符后缀; • esriSQL_EscapeKeyPrefix,值为5,Escape Key 前缀; • esriSQL_EscapeKeySuffix,值为6,Escape Key 后缀。

  19. ISpatialFilter • ISpatialFilter继承IQueryFilter,如果要查询“在100米内的电话亭有哪些?”,就要使用ISpatialFilter. • 用户可以进行的空间过滤范围非常广泛,如 • 寻找与某个选择区域相覆盖的要素 • 寻找某个要素附近的对象 • ISpatialFilter对象就包含了空间属性和普通属性两种条件。 • 如需要查询“在某一点2000米范围内的服装店”

  20. ISpatialFilter过滤器 2个必须的属性: • Geometry • SpatialRel • GeometryField用于设置几何字段名 • ISpatialFilter.SearchOrder属性用于设置选择顺序,默认先空间后非空间 • esriSearchOrderSpatial,0,Spatial query is applied first. • esriSearchOrderAttribute,1,Attribute query is applied first. • 当SpatialRel属性的值为esriSpatialRelRelation时,需要使用SpatialRelDescription属性。SpatialRelDescription的值为要检测的空间关系对应的九交矩阵,如’TT*FFT***’.

  21. esriSpatialRelEnum Constants

  22. ISpatialFilter 实例 ISpatialFilter pFilter = new SpatialFilterClass(); //设置空间过滤器的三个必须属性 pFilter.Geometry= pPolygon; pFilter.GeometryField = "SHAPE"; pFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; IFeatureCursor pFeatureCursor = pFeatureClass.Search(pFilter, false);

  23. 9.1.3 QueryDef对象 • QueryDef对象代表了数据库中基于一个或多个表、要素类进行的属性查询。通过这个对象,用户可以在多个表间建立连接,并且保证在这个连接基础上的查询可以实现。 • QueryDef中的表必须放在一个工作空间内,而QueryDef对象也是使用IFeatureWorkspace.CreateQueryDef方法来产生的,它并不是一个组件类。 • QueryDef不能在Shapefile和Coverage数据中使用,而仅仅可以使用在Geodatabase数据库中。 • QueryDef的查询结果是Cursor对象返回的 ,没有和它们的父表相关联 ,不能使用store方法。 • IFeatureWorkspace.OpenFeatureQuery方法会产生一个基于QueryDef对象的要素类,可以加入到Map中。

  24. QueryDef 实例 //产生一个QueryDef对象 IQueryDef pQueryDef = pFeatureWorkspace.CreateQueryDef(); //基于连接的两个表必须是在一个工作空间内,设置它的各种属性 pQueryDef.Tables = "Counties,States"; pQueryDef.SubFields = "Counties.Shape,Counties.NAME,States.STATE_ABBR"; pQueryDef.WhereClause = "Counties.STATE_FIPS = States.STATE_FIPS";

  25. //基于上面产生的QueryDef对象来新建一个虚要素类 IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureQuery("My counties join ", pQueryDef); IFeatureClassContainer pFeatureClassContainer = pFeatureDataset as IFeatureClassContainer; IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(0); IFeatureLayer pFeatureLayer = new FeatureLayerClass(); pFeatureLayer.FeatureClass = pFeatureClass; pFeatureLayer.Name = pFeatureClass.AliasName; pMap.AddLayer(pFeatureLayer); Opens a feature dataset containing a single feature class defined by the specified Query. public IFeatureDatasetOpenFeatureQuery ( string QueryName,  IQueryDef QueryDef );

  26. ITableSort 9.1.4 TableSort对象 • TableSort对象是表的排序对象,它可以将查找的结果按照某个字段进行排序,然后返回所有符合条件的要素游标。 • TableSort必须被设置属性: • Table • Fields--是一个用于排序的字段列表 ,排序方式Ascending、CaseSensitive 等 • 实例分析(见p265)

  27. 9.1.5 要素选择集 • IFeatureClass、IFeatureLayer都提供了两种不同的查询手段: • Search方法:返回的是一个指向数据的查询型Cursor对象; • Select方法:构造一个选择集(SelectionSet),然后在选择集中再得到选择集; 显示的效果上比前者好,即得到的要素选择集在Map上会呈高亮显示。

  28. public IFeatureCursorIFeatureLayer .Search ( IQueryFilterqueryFilter, boolrecycling); • public IFeatureCursorIFeatureClass .Search ( IQueryFilter QueryFilter, bool Recycling); • public ISelectionSetIFeatureClass.Select ( IQueryFilterQueryFilter,esriSelectionTypeselType,esriSelectionOptionselOption,IWorkspaceselectionContainer ); • public void ISelectionSet .Search ( IQueryFilter queryFilter, bool recycling, ref ICursor cursor); • public ISelectionSet Select ( IQueryFilter queryFilter, esriSelectionType selType, esriSelectionOption selOption, IWorkspace selectionContainer);

  29. 至于使用何种方式来得到选择集,可以使用SelectionType属性来设置。至于使用何种方式来得到选择集,可以使用SelectionType属性来设置。 • 选择集的类型如果是esriSelectionTypelDSet,那代表选择集使用的是一个OID集合,The selection is always based on a persistent set of OIDs ; • 当它为esriSelectionTypeSnapShot时,它表明选择集使用的是保存在内存中的实际的行对象--The selection is always based on a set of in-memory rows ; • 如果是esriSelectionTypeHybird,那情况就比较灵活,当选择数量少的时候选择集使用在内存中的行对象,当数量多时则使用OID集合。

  30. 下面是一个在要素类中构造要素选择集的例子:下面是一个在要素类中构造要素选择集的例子: ISelectionSet pSelectionSet = pFeatcls.Select(pQueryFilter, esriSelectionType.esriSelectionTypeHybrid, esriSelectionOption.esriSelectionOptionNormal, null);

  31. ISelectionSet接口

  32. ISelectionSet的Add、AddList和ReomveList方法可以用于选择集中添加和移除对象,这些方法都是通过OID属性来完成的。ISelectionSet的Add、AddList和ReomveList方法可以用于选择集中添加和移除对象,这些方法都是通过OID属性来完成的。 • ISelectionSet.Combine方法则可以用于绑定两个选择集,这两个选择集必须是来自同一个目标表或者要素类。

  33. 9.2 空间分析基础 空间关系运算 空间拓扑运算 IProximityOperator接口

  34. 9.2.1 空间关系运算 • 空间关系运算用于检测两个几何对象是否满足某种空间关系。OGC简单要素规范中定义了Equal、Disjoint、Intersect、Touch、Cross、Within、Contains和Overlap八种空间拓扑关系。 • 在ArcObjects的几何模型中,IRelationalOperator接口定义了空间关系检测运算的操作算子,该接口中除了OGC简单要素规范中定义的七种拓扑关系(Intersect=! Disjoint)外,还有一个通用的空间关系检测运算IRelationalOperator.Relation.

  35. IRelationaloperator接口

  36. 实现IRelationalOperator接口的几何对象有:Point、Multipoint、Polyline、Polygon、MultiPatch、Envelope和GeometryBag. • 假设pGeometryA(基本几何对象,Base Geometry)、pGeometryB(比较几何对象,Comparison Geometry)为实现了IRelationalOperator接口的任一类型的几何对象,则可以按如下方式使用该接口: IRelationalOperator relOp = pGeometryA as IRelationalOperator; bool yesOrNo = relOp . Contains(pGeometryB);

  37. Is the current geometry disjoint from the other geometry? Does the current geometry overlap the other geometry? Does the current geometry cross the other geometry? Does the current geometry equal the other geometry? Does the current geometry touch the other geometry? Is the current geometry within the other geometry Does the current geometry contain the other geometry?

  38. 9.2.2 空间拓扑运算 • 使用空间拓扑运算可以基于一个或多个几何对象产生新的几何对象。OGC简单要素规范中定义了六种空间拓扑运算:Buffer、ConvexHull、Intersection、Union、Difference和SysmmDiff.

  39. ITopologicalOperator接口定义了如下拓扑运算: • Buffer(缓冲区运算) • Clip(用矩形裁剪) • ClipDense(用矩形裁剪,输出的线要求内插点加密) • ConvexHull(获得一个几何对象的最小凸多边形) • Cut(用线切割) • Difference(两个几何对象的差运算) • SymmetricDifference(两个几何对象的异或运算) • Intersect(两个几何对象的交集) • QueryClipped(用一个矩形去裁剪一个几何对象) • QueryClippedDense(用一个矩形去裁剪一个几何对象,输出的线要求内插点加密) • Union(两个几何对象的并集) • ConstructUnion(多个几何对象的并集) • Simplify(简化几何对象)

  40. ITopologicalOperator接口还定义了三个属性: • Boundary(几何对象的边界) • IsKnownSimple(假定几何对象为简单类型) • IsSimple(检测几何对象是否为简单类型)。 • 实现ITopologicalOperator接口的几何对象: • Point、Multipoint、Polyline、Polygon、GeometryBag和MultiPatch. • 如果要在低等级的几何对象上使用该接口,如Segment、Path或Ring上,它们需要先组合成高级别几何对象才行。

  41. ITopologicalOperator接口 • ITopologicalOperator2- ITopologicalOperator5定义了更多的拓扑运算相关操作。

  42. ITopologicalOperator2接口 • 继承ITopologicalOperator

  43. 几何对象的缓冲区操作(Buffer) 几何对象的边界(Boundary) SymmetricDifference ConvexHull方法 Intersection方法 Union方法 Difference Cut方法 Clip方法

  44. 9.2.3 IProximityOperator接口 • IProximityOperator.QueryNearestPoint方法用于查询该几何对象上离输入点最近的点;对于不同的线段延伸类型,这个最近点可以位于该几何对象的某个延伸位置上。 • public void QueryNearestPoint ( IPoint p, esriSegmentExtension extension, IPoint nearest); • IProximityOperator.ReturnNearestPoint方法用于查找并返回该几何对象上离输入点最近的点;对于不同的线段延伸类型,这个最近点可以位于该几何对象的某个延伸位置上。 • public IPoint ReturnNearestPoint ( IPoint p, esriSegmentExtension extension); • IProximityOperator. ReturnDistance方法返回两个几何对象之间的最短距离,该方法的语法如下: • public double ReturnDistance ( IGeometry other);

  45. 最近点查询 • IProximityOperator接口被众多几何对象的类所实现,包括BezierCurve、CircularArc、EllipticArc、Envelope、Line、Multipoint、Point、Polygon和Polyline对象。

  46. 9.3 属性条件查询 • 属性条件查询是根据属性条件,对某个要素图层查询满足条件的地理要素。 • 对于扩展ArcGIS桌面,可以使用SQLQueryDialog来构造属性查询条件; • 对于ArcGIS Engine开发,需要开发人员自己设计界面来构造属性查询条件,这里只考虑ArcGIS Engine开发。

  47. SelectByAttribute:Form

  48. 主要实现思路如下:窗体的Load事件,主要加载当前地图对象中的要素图层到图层下拉列表框comboBoxLayers中,并进行IActiveViewEvents.SelectionChanged设置;事件设置的目的是一旦执行完要素的选择,在地图上能够马上高亮显示被选择的要素。主要实现思路如下:窗体的Load事件,主要加载当前地图对象中的要素图层到图层下拉列表框comboBoxLayers中,并进行IActiveViewEvents.SelectionChanged设置;事件设置的目的是一旦执行完要素的选择,在地图上能够马上高亮显示被选择的要素。 • 详细实现过程,请参阅本书附带的光盘。

  49. 事件设置的主要代码如下: IActiveViewEvents_Event activeViewEvent = null; IActiveViewEvents_SelectionChangedEventHandler mapSelectionChanged; private void SetupEvents() { activeViewEvent = m_activeview as IActiveViewEvents_Event; mapSelectionChanged = new IActiveViewEvents_SelectionChangedEventHandler(OnMapSelectionChanged); activeViewEvent.SelectionChanged += mapSelectionChanged; } private void OnMapSelectionChanged() { m_activeview.PartialRefresh( esriViewDrawPhase.esriViewGeoSelection, null, m_activeview.Extent); }

More Related