ArcGIS查询WFS服务解决方案.docx
- 文档编号:27509087
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:21
- 大小:572.45KB
ArcGIS查询WFS服务解决方案.docx
《ArcGIS查询WFS服务解决方案.docx》由会员分享,可在线阅读,更多相关《ArcGIS查询WFS服务解决方案.docx(21页珍藏版)》请在冰豆网上搜索。
ArcGIS查询WFS服务解决方案
ArcGIS访问WFS服务
ESRI中国(北京)有限公司广州办事处
肖干林
一、概述
OGC全称OpenGeospatialConsortium,是一个非盈利的、国际化的、自愿协商的标准化组织,它的主要目的就是制定与空间信息、基于位置服务相关的标准。
这些标准就是OGC的“产品”,而这些标准的用处就在于使不同厂商、不同产品之间可以通过统一的接口进行互操作。
这些标准中,一般我们接触的都集中在数据交换和服务互操作方面,比如GML、KML和WFS、WMS等,其实这也是一些标准存在意义较大的场合。
WFS(OpenGIS®WebFeatureService)当前版本是1.1.0。
WFS标准定义了一些操作,这些操作允许用户在分布式的环境下通过HTTP对空间数据迚行查询、编辑等操作。
WFS服务要求服务的接口必须由XML描述,另外数据交互必须由GML进行,数据过滤采用CQL语言。
当一个客户端想要访问WFS服务时,一般会涉及到以下的流程:
1.通过操作获取WFS服务支持的操作和要素类(FeatureType,可以理解为WFS中的数据集)。
2.(可能)通过操作获取WFS服务支持的要素类的定义。
3.客户端发送某个操作的请求。
4.WFS服务处理请求。
5.WFS服务返回处理的结果和状态。
上面几个步骤中所提到的“操作”包括:
1.GetCapabilities(获取服务中的要素类及支持的操作)
2.DescribeFeatureType(描述要素类的信息)
3.GetFeature(获取要素)
4.GetGmlObject(通过XLink获取GML对象)
5.Transaction(创建、更新、删除数据的事务操作)
6.LockFeature(在事务过程中锁定要素)
但是,这些操作并不是必须全部实现,而是实现全部或部分。
根据所支持的操作不同,WFS可以分为3类:
1.BasicWFS(就是最常被提及的WFS,必须支持GetCapabilities/DescribeFeatureType/GetFeature操作,在功能上意味着提供一个只读的数据服务)
2.XLinkWFS(必须在BasicWFS基础上加上GetGmlObject操作)
3.TransactionWFS(也有称为WFS-T,必须在BasicWFS基础上加上Transaction操作以支持编辑数据,另外也可以加上GetGmlObject/LockFeature操作)。
详细OGC标准说明和WFS各类方法说明见(《OGC标准介绍.pdf》)资料。
以下演示使用到的环境:
Windows7
ArcGIS10
ArcGISAPIForFlex2.3
二、ArcGISServer构建WFS
在研究GIS访问WFS之前,需要有相关的WFS地图服务可以使用。
通过ArcGISServer软件可以构建OGC标准的地图服务,如:
WMS和WFS服务,供给其他客户端使用,其构建过程如下:
1、首先使用ArcGISDesktop的ArcMap软件制作需要发布的地图内容,包括:
添加需要发布的地图图层数据,并设置相应的符号、颜色、大小等信息,然后保存为MXD文档(名称如:
demo.mxd),如下图:
2、在制作好地图文档后,使用ArcCatalog软件将该文档发布为ArcGISServer的地图服务,如下图:
第一步打开ArcCatalog软件,并找到“GISServer”目录下的“AddArcGISServer”,然后双击,如下图:
选择“ManageGISServices”选项,然后点击“下一步”按钮,如下图:
然后在“HostName”输入安装有ArcGISServer的服务器名称(如:
XGLESRI),并点击“Finish”按钮完成增加ArcGISServer管理。
如下图:
第二步,发布地图文档,选择制作好的地图文档(如:
demo.mxd),然后点击鼠标右键,选择“PublishtoArcGISServer”,如下图:
设置发布的服务信息(如:
服务名称,服务所在目录等),如下图:
点击“下一步”按钮,选择地图服务类型(选择WFS和WMS),如下图:
点击“下一步”按钮,完成发布服务过程,如下图:
点击“Finish”按钮,然后可以在第一步增加的GISServer目录下出现刚才发布的地图服务,如下图:
这样可以使用其他客户端访问刚才发布的“demo”服务(该服务具有WMS和WFS服务类型)。
可以直接在浏览器中访问WFS服务,查看器返回的结果,在浏览器地址栏中输入http:
//localhost/ArcGIS/services/demo/MapServer/WFSServer?
request=Getfeature&service=WFS&typename=cities,如下图:
三、构建WFS服务查询语句
使用GIS客户端访问和查询WFS服务,需要对查询WFS服务的查询方式进行构建,并对WFS查询语句表达方式进行了解。
但首先需要了解WFS查询谓词(空间和属性)的含义:
首先介绍空间关系谓词,包括:
Disjoint,Touches,Crosses,Within,Overlaps,Contains,Intersects,Equals,DWithin,Beyond,BBOX。
前面八个是OGC定义的空间关系谓词,其解释如下:
(1)Disjoint
任意给两个空间实体a和b(拓扑闭合的):
a.disjoint(b)Ia∩Ib=Ø
(2)Touches
touch关系适合于面/面、线/线、线/面、点/面、点/线间的相互关系,但点/点间没有定义这种关系。
对于满足要求的空间实体a和b:
a.touch(b)(Ia∩Ib=Ø)∧(a∩b≠Ø)
touch关系的几个例子如图2所示:
图2Touch关系的例子
(3)Crosses
crosses关系适用于点/线、点/面、线/线及线/面间关系。
令dim(a)表示空间对象a的维度,则crosses关系定义为:
a.crosses(b)(dim(I(a)∩I(b)) crosses关系的几个例子如图3所示: 图3Cross关系的例子 (4)Within within关系定义为: a.within(b)(a∩b)=a∧(I(a)∩I(b))≠Ø overlaps的几个例子如图4所示: 图4Within关系的例子 (5)Overlaps overlaps关系适用于面/面、线/线和点/点关系,定义如下: a.overlaps(b)(dim(I(a))=dim(I(b))=dim(I(a)I(b)))∧(a∩b≠a)∧(a∩b≠b) overlaps的几个例子如图5所示: 图5Overlaps关系的例子 除了上述5个关系,为了使用的方便,还定义了以下几个关系: (6)Contains: a.contains(b)b.within(a) (7)Intersects: a.intersects(b)spanstyle="mso-spacerun: yes">a.disjoints(b) (8)Equals: a.equals(b)a.within(b)∧b.within(a) 后面三个是WFS定义的空间关系谓词。 DWithin可以查询一个圆形范围内的要素,需要给一个距离参数。 BBOX查询矩形范围内的要素。 属性查询类似于数据库SQL语句,提供如下属性比较谓词: Equal,NotEqual,Less,Greater,LessOrEqual,GreaterOrEqual,Like,IsNull,Between。 ①Equal: 等于。 ②NotEqual: 不等于。 ③Less: 小于。 ④Greater: 大于。 ⑤LessOrEqual: 小于等于。 ⑥GreaterOrEqual: 大于等于。 ⑦Like: 相似。 使用通配符“*”表示任意数量的字符,“? ”表示一个字符。 ⑧IsNull: 为空,字段值为空。 ⑨Between: 介于两者之间。 3.1、属性查询语句 可以直接通过写查询语句,实行WFS查询操作。 这样您就需要知道WFS查询语句如何编写。 WFS查询条件中And、Or、Not这三个逻辑判断谓词需要使用<××>××>的形式将条件包含其中,这一点和SQL差异比较大。 SQL语句: 条件1And条件2,WFS语句是 以下说明每种属性比较谓词如何写成WFS查询条件: 1)、Equal(=): 第一个%s填写字段名称,第二个%s填写字段值: 2)、NotEqual(<>): 第一个%s填写字段名称,第二个%s填写字段值: 3)、Less(<): 第一个%s填写字段名称,第二个%s填写字段值: 4)、Greater(>): 第一个%s填写字段名称,第二个%s填写字段值: 5)、LessOrEqual(<=): 第一个%s填写字段名称,第二个%s填写字段值: 6)、GreaterOrEqual(>=): 第一个%s填写字段名称,第二个%s填写字段值: 7)、Like: 第一个%s填写字段名称,第二个%s填写字段值: "escapeChar="\"> 8)、IsNull: 第一个%s填写字段名称: 9)、Between: 第一个%s填写字段名称,第二个%s填写字段值下限,第三个%s填写字段值上限: 综上所述,例子中属性查询语句部分可以直接写成: http: //localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer? request=Getfeature&service=WFS&typename=Tbeijing_qiao&Filter= Filter> And> PropertyIsLikewildCard='*'singleChar='? 'escapeChar=''> PropertyName>name PropertyName> Literal>*河* Literal> PropertyIsLike> PropertyIsEqualTo> PropertyName>class PropertyName> Literal>2 Literal> PropertyIsEqualTo> And> Filter> WFS的“Filter”就相当于SQL中的“where”。 从上述语句看出,其实SQL的where查询语句为: namelike'%河%'andclass=2。 而在进行WFS查询时,其查询语句为上述结构,并且构建时需要带“ogc”标识,要不然就无法正常查询了。 从上述WFS过滤查询语句与SQL查询语句对比,可以看出两者之间的差异非常大,这样我们就需要了解怎样将SQL的where查询语句解析为WFS过滤查询语句,解析代码详见代码文件。 3.2、空间查询语句 同样,可以使用空间查询方式进行WFS服务的查询,下面介绍空间查询语句如何编写。 需要注意的是由于WFS坐标显示为“40.151,116.527”,而我们在ArcMap查看坐标显示是“116.527,40.151”,所以在填写坐标时需要将从地图上获取到XY坐标顺序进行反转为YX。 在某些地理坐标系(例如WGS84)中返回的要素具有默认的纬度、经度(y,x)的轴顺序。 这一点符合WFS1.1规范。 如果某些WFS客户端希望坐标以经度、纬度(x,y)的轴顺序返回。 要使用这些客户端,您可将服务的轴顺序设置为经度、纬度。 以下描述了设置该属性的方法: 1.以管理员的身份登录到运行ArcGISServer的计算机。 2.关闭ArcGISServer。 3.转到服务配置文件的位置。 例如,如果ArcGISServer安装在c: \arcgis中,则请转到c: \arcgis\server\user\cfg。 4.在文本编辑器中打开您的服务的配置文件(例如myservice.cfg)。 5.在WFS部分中,将以下内容添加到属性: 例如: //bobmk/arcgis/services/wfs/WFSTest_ras/MapServer/WFSServer //bobmk/arcgis/services/wfs/WFSTest_ras/MapServer/WFSServer 6.启动ArcGISServer。 从服务中请求的地理坐标的要素现在以经度、纬度的轴顺序返回。 请注意轴顺序属性仅适用于带地理坐标的要素。 带有投影坐标的要素始终以x,y的轴顺序返回。 以下列举说明空间比较谓词如何写成WFS查询条件: 1)、Equals: 第一个%s填写图形字段名称(如: shape),第二个%f,%f填写图形的坐标值: Equals> PropertyName>%s PropertyName> Point> coordinates>%f,%f coordinates> Point> Equals> 2)、Intersects: 第一个%s填写图形字段名称,第二个%f,%f填写多边形的节点坐标,注意要首尾坐标闭合。 Intersects> PropertyName>%s PropertyName> Polygon> outerBoundaryIs> LinearRing> coordinates>%f,%f%f,%f%f,%f%f,%f coordinates> LinearRing> outerBoundaryIs> Polygon> Intersects> 3)、BBOX: 第一个%s填写图形字段名称,第二个%s填写坐标系统,后面四个%f填写一个矩形范围(顺序为xmin,ymin,xmax,ymax)。 BBOX> PropertyName>%s PropertyName> BoxsrsName="%s"> coordinates>%f,%f%f,%f coordinates> Box> BBOX> 多个空间查询条件也需要逻辑比较谓词来包含,同时需要使用正确的标识“gml”,一个空间查询条件可以看作是一个属性查询条件,这方面操作是一致的。 完整的空间查询语句如下: http: //xiaogl/ArcGIS/services/DemoWFS/MapServer/WFSServer? request=Getfeature&service=WFS&typename=Tbeijing_qiao&Filter= Filter> Intersects> PropertyName>Shape PropertyName> Polygon> outerBoundaryIs> LinearRing> coordinates>40.334,116.30440.317,116.36640.264,116.32140.277,116.28840.312,116.28740.334,116.304 coordinates> LinearRing> outerBoundaryIs> Polygon> Intersects> Filter> 各类空间关系查询表现样式,请详细参见: https: //wiki.state.ma.us/confluence/display/massgis/contains 3.3、空间和属性混合查询 通过上述说明,可以实现属性查询和空间查询,能否实现将属性和空间进行联合查询呢? 答案是肯定的,通过组合WFS属性和空间的查询语句,实现两者的混合查询模式,查询语句如下: http: //localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer? request=Getfeature&service=WFS&typename=Tbeijing_qiao&Filter= Filter> And> PropertyIsEqualTo> PropertyName>class PropertyName> Literal>2 Literal> PropertyIsEqualTo> BBOX> PropertyName>Shape PropertyName> BoxsrsName='EPSG: 4326'> coordinates>40.268176013,116.19934186340.30384199,116.250685194 coordinates> Box> BBOX> And> Filter> 这样可以有效结合属性查询和空间查询,达到精确查询的目的。 四、使用ArcGISFlexAPI查询WFS 在了解WFS属性和空间查询语句的构建方法后,需要在其他客户端进行测试,看能否通过构建的查询语句正确查询到所需要的对象信息。 而且了解在客户端怎样实现WFS查询语句的执行和查询结果的解析成符合客户端需要的方式进行展现查询结果。 下面以ArcGISAPIForFlex为客户端表现方式进行WFS服务地图查询并展现查询结果。 4.1、Flex执行WFS查询方式 对于在Flex执行WFS服务查询语句有两种方式: “HTTPService”和“urlLoader”,下面分别介绍两种查询方式: 第一种“HTTPService”查询方式,一般在使用XML格式描述WFS查询语句时常使用,使用步骤是: 首先定义一个“HTTPService”对象,并且使用“POST”方法进行请求,如下: Declarations> --将非可视元素(例如服务、值对象)放在此处--> HTTPServiceid="parseXml"method="POST"result="resultEve(event)"fault="faultEve(event)"resultFormat="xml"/> Declarations> 然后定义WFS的XML格式查询语句,如下: varxmlFile: XML= GetFeaturexmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance"xmlns: gml="xmlns: wfs="xmlns: ogc="service="WFS"version="1.1.0"> QuerytypeName="massgis: Tbeijing_qiao"xmlns: massgis="http: //localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer"> Filterxmlns="
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArcGIS 查询 WFS 服务 解决方案