ArcGIS查询WFS服务解决方案_第1页
ArcGIS查询WFS服务解决方案_第2页
ArcGIS查询WFS服务解决方案_第3页
ArcGIS查询WFS服务解决方案_第4页
ArcGIS查询WFS服务解决方案_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ArcGIS访问WFS服务ESRI中国(北京)有限公司 广州办事处肖干林一、概述OGC全称Open Geospatial Consortium,是一个非盈利的、国际化的、自愿协商的标准化组织,它的主要目的就是制定与空间信息、基于位置服务相关的标准。这些标准就是OGC的“产品”,而这些标准的用处就在于使不同厂商、不同产品之间可以通过统一的接口进行互操作。这些标准中,一般我们接触的都集中在数据交换和服务互操作方面,比如GML、KML和WFS、WMS等,其实这也是一些标准存在意义较大的场合。WFS(OpenGIS® Web Feature Service)当前版本是1.1.0。WFS标准定

2、义了一些操作,这些操作允许用户在分布式的环境下通过HTTP对空间数据迚行查询、编辑等操作。 WFS服务要求服务的接口必须由XML描述,另外数据交互必须由GML进行,数据过滤采用CQL语言。当一个客户端想要访问WFS服务时,一般会涉及到以下的流程: 1.通过操作获取WFS服务支持的操作和要素类(Feature Type,可以理解为WFS中的数据集)。2.(可能)通过操作获取WFS服务支持的要素类的定义。3. 客户端发送某个操作的请求。 4. WFS服务处理请求。 5. WFS服务返回处理的结果和状态。 上面几个步骤中所提到的“操作”包括: 1. GetCapabilities(获取服务中的要素类

3、及支持的操作) 2. DescribeFeatureType(描述要素类的信息) 3. GetFeature(获取要素) 4. GetGmlObject(通过XLink获取GML对象) 5. Transaction(创建、更新、删除数据的事务操作) 6. LockFeature(在事务过程中锁定要素)但是,这些操作并不是必须全部实现,而是实现全部或部分。根据所支持的操作不同,WFS可以分为3类:1. Basic WFS(就是最常被提及的WFS,必须支持GetCapabilities/ DescribeFeatureType/ GetFeature操作,在功能上意味着提供一个只读的数据服务) 2

4、. XLink WFS(必须在Basic WFS基础上加上GetGmlObject操作) 3. Transaction WFS(也有称为WFS-T,必须在Basic WFS基础上加上Transaction操作以支持编辑数据,另外也可以加上GetGmlObject/LockFeature操作)。详细OGC标准说明和WFS各类方法说明见(OGC标准介绍.pdf)资料。以下演示使用到的环境:Windows 7ArcGIS 10ArcGIS API For Flex 2.3二、ArcGIS Server构建WFS在研究GIS访问WFS之前,需要有相关的WFS地图服务可以使用。通过ArcGIS Serv

5、er软件可以构建OGC标准的地图服务,如:WMS和WFS服务,供给其他客户端使用,其构建过程如下:1、首先使用ArcGIS Desktop的ArcMap软件制作需要发布的地图内容,包括:添加需要发布的地图图层数据,并设置相应的符号、颜色、大小等信息,然后保存为MXD文档(名称如:demo.mxd),如下图:2、在制作好地图文档后,使用ArcCatalog软件将该文档发布为ArcGIS Server的地图服务,如下图: 第一步打开ArcCatalog软件,并找到“GIS Server”目录下的“Add ArcGIS Server”,然后双击,如下图:选择“Manage GIS Services”

6、选项,然后点击“下一步”按钮,如下图:然后在“Host Name”输入安装有ArcGIS Server的服务器名称(如:XGLESRI),并点击“Finish”按钮完成增加ArcGIS Server管理。如下图:第二步,发布地图文档,选择制作好的地图文档(如:demo.mxd),然后点击鼠标右键,选择“Publish to ArcGIS Server”,如下图:设置发布的服务信息(如:服务名称,服务所在目录等),如下图:点击“下一步”按钮,选择地图服务类型(选择WFS和WMS),如下图:点击“下一步”按钮,完成发布服务过程,如下图:点击“Finish”按钮,然后可以在第一步增加的GIS Ser

7、ver目录下出现刚才发布的地图服务,如下图:这样可以使用其他客户端访问刚才发布的“demo”服务(该服务具有WMS和WFS服务类型)。可以直接在浏览器中访问WFS服务,查看器返回的结果,在浏览器地址栏中输入http:/localhost/ArcGIS/services/demo/MapServer/WFSServer?request=Getfeature&service=WFS&typename=cities,如下图:三、构建WFS服务查询语句使用GIS客户端访问和查询WFS服务,需要对查询WFS服务的查询方式进行构建,并对WFS查询语句表达方式进行了解。但首先需要了解WFS查

8、询谓词(空间和属性)的含义:首先介绍空间关系谓词,包括: Disjoint, Touches, Crosses, Within, Overlaps, Contains, Intersects, Equals, DWithin, Beyond, BBOX。前面八个是OGC定义的空间关系谓词,其解释如下:(1)Disjoint任意给两个空间实体a和b(拓扑闭合的):a.disjoint(b) IaIb=Ø(2)Touchestouch关系适合于面/面、线/线、线/面、点/面、点/线间的相互关系,但点/点间没有定义这种关系。对于满足要求的空间实体a和b:a.touch(b) (IaIb=

9、Ø)(abØ)touch关系的几个例子如图2所示:图2 Touch关系的例子(3)Crossescrosses关系适用于点/线、点/面、线/线及线/面间关系。令dim(a)表示空间对象a的维度,则crosses关系定义为:a.crosses(b) (dim(I(a)I(b)<max(dim(I (a),dim(I(b) (ab) a(ab) bcrosses关系的几个例子如图3所示:图3 Cross关系的例子(4)Withinwithin关系定义为:a.within(b) (ab)=a(I(a)I(b) Øoverlaps的几个例子如图4所示:图4 With

10、in关系的例子(5)Overlapsoverlaps关系适用于面/面、线/线和点/点关系,定义如下:a.overlaps(b) (dim(I(a)=dim(I(b)=dim(I(a)I(b)(aba) (abb)overlaps的几个例子如图5所示:图5 Overlaps关系的例子除了上述5个关系,为了使用的方便,还定义了以下几个关系:(6)Contains:a.contains(b) b.within(a)(7)Intersects:ersects(b) span style="mso-spacerun: yes"> a.disjoints(b)(8)Eq

11、uals: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:大于等于。 L

12、ike:相似。使用通配符“*”表示任意数量的字符,“?”表示一个字符。 IsNull:为空,字段值为空。 Between:介于两者之间。3.1、属性查询语句可以直接通过写查询语句,实行WFS查询操作。这样您就需要知道WFS查询语句如何编写。WFS查询条件中And、Or、Not这三个逻辑判断谓词需要使用<××></××>的形式将条件包含其中,这一点和SQL差异比较大。SQL语句:条件1 And 条件2 ,WFS语句是 <And> 条件1 条件2 </And>。以下说明每种属性比较谓词如何写成WFS查询条件:1

13、)、Equal(=):第一个%s填写字段名称,第二个%s填写字段值:<PropertyIsEqualTo><PropertyName>%s</PropertyName><Literal>%s</Literal></PropertyIsEqualTo>;2)、NotEqual(<>):第一个%s填写字段名称,第二个%s填写字段值:<PropertyIsNotEqualTo><PropertyName>%s</PropertyName><Literal>%s</

14、Literal></PropertyIsNotEqualTo>;3)、Less(<):第一个%s填写字段名称,第二个%s填写字段值:<PropertyIsLessThan><PropertyName>%s</PropertyName><Literal>%s</Literal></PropertyIsLessThan>;4)、Greater(>):第一个%s填写字段名称,第二个%s填写字段值:<PropertyIsGreaterThan><PropertyName>%s&

15、lt;/PropertyName><Literal>%s</Literal></PropertyIsGreaterThan>;5)、LessOrEqual(<=):第一个%s填写字段名称,第二个%s填写字段值:<PropertyIsLessThanOrEqualTo><PropertyName>%s</PropertyName><Literal>%s</Literal></PropertyIsLessThanOrEqualTo>;6)、GreaterOrEqual(>=

16、):第一个%s填写字段名称,第二个%s填写字段值:<PropertyIsGreaterThanOrEqualTo><PropertyName>%s</PropertyName><Literal>%s</Literal></PropertyIsGreaterThanOrEqualTo>;7)、Like:第一个%s填写字段名称,第二个%s填写字段值:<PropertyIsLike wildCard="*" singleChar="?" escapeChar=""

17、><PropertyName>%s</PropertyName><Literal>%s</Literal></PropertyIsLike>;8)、IsNull:第一个%s填写字段名称:<PropertyIsNull><PropertyName>%s</PropertyName></PropertyIsNull>;9)、Between:第一个%s填写字段名称,第二个%s填写字段值下限,第三个%s填写字段值上限:<PropertyIsBetween><Propert

18、yName>%s</PropertyName><LowerBoundary>%s</LowerBoundary><UpperBoundary>%s</UpperBoundary></PropertyIsBetween>;综上所述,例子中属性查询语句部分可以直接写成:http:/localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer?request=Getfeature&service=WFS&typename=Tbeijing_qiao&Fi

19、lter=<ogc:Filter><ogc:And><ogc:PropertyIsLike wildCard='*' singleChar='?' escapeChar=''><ogc:PropertyName>name</ogc:PropertyName><ogc:Literal>*河*</ogc:Literal></ogc:PropertyIsLike><ogc:PropertyIsEqualTo><ogc:PropertyNam

20、e>class</ogc:PropertyName><ogc:Literal>2</ogc:Literal></ogc:PropertyIsEqualTo></ogc:And></ogc:Filter>WFS的“Filter”就相当于SQL中的“where”。从上述语句看出,其实SQL的where查询语句为:name like '%河%' and class = 2。而在进行WFS查询时,其查询语句为上述结构,并且构建时需要带“ogc”标识,要不然就无法正常查询了。从上述WFS过滤查询语句与SQL查询

21、语句对比,可以看出两者之间的差异非常大,这样我们就需要了解怎样将SQL的where查询语句解析为WFS过滤查询语句,解析代码详见代码文件。3.2、空间查询语句同样,可以使用空间查询方式进行WFS服务的查询,下面介绍空间查询语句如何编写。需要注意的是由于WFS坐标显示为“40.151,116.527”,而我们在ArcMap查看坐标显示是“116.527,40.151”,所以在填写坐标时需要将从地图上获取到XY坐标顺序进行反转为YX。在某些地理坐标系(例如 WGS 84)中返回的要素具有默认的纬度、经度 (y,x) 的轴顺序。这一点符合 WFS 1.1 规范。如果某些 WFS 客户端希望坐标以经度

22、、纬度 (x,y) 的轴顺序返回。要使用这些客户端,您可将服务的轴顺序设置为经度、纬度。以下描述了设置该属性的方法:1. 以管理员的身份登录到运行 ArcGIS Server 的计算机。 2. 关闭 ArcGIS Server。 3. 转到服务配置文件的位置。例如,如果 ArcGIS Server 安装在 c:arcgis 中,则请转到 c:arcgisserverusercfg。 4. 在文本编辑器中打开您的服务的配置文件(例如 myservice.cfg)。 5. 在 WFS 部分中,将以下内容添加到属性:<AxisOrderWFS11>longlat</AxisOrde

23、rWFS11>。例如: <Extension><TypeName>WFSServer</TypeName><Enabled>true</Enabled><Properties><AxisOrderWFS11>longlat</AxisOrderWFS11><CustomGetCapabilities>false</CustomGetCapabilities><EnableTransactions>false</EnableTransactions>

24、;<Name>wfs_WFSTest_ras</Name><OnlineResource>http:/bobmk/arcgis/services/wfs/WFSTest_ras/MapServer/WFSServer</OnlineResource><AppSchemaURI>http:/bobmk/arcgis/services/wfs/WFSTest_ras/MapServer/WFSServer</AppSchemaURI><AppSchemaPrefix>wfs_WFSTest_ras</AppS

25、chemaPrefix></Properties><Info><WebEnabled>true</WebEnabled></Info></Extension>6. 启动 ArcGIS Server。从服务中请求的地理坐标的要素现在以经度、纬度的轴顺序返回。请注意轴顺序属性仅适用于带地理坐标的要素。带有投影坐标的要素始终以 x,y 的轴顺序返回。以下列举说明空间比较谓词如何写成WFS查询条件:1)、Equals:第一个%s填写图形字段名称(如:shape),第二个%f,%f填写图形的坐标值:<ogc:Equals

26、><ogc:PropertyName>%s</ogc:PropertyName><gml:Point><gml:coordinates>%f,%f</gml:coordinates></gml:Point></ogc:Equals>2)、Intersects:第一个%s填写图形字段名称,第二个%f,%f填写多边形的节点坐标,注意要首尾坐标闭合。<ogc:Intersects><ogc:PropertyName>%s</ogc:PropertyName><gml:P

27、olygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>%f,%f %f,%f %f,%f %f,%f</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></ogc:Intersects>3)、BBOX:第一个%s填写图形字段名称,第二个%s填写坐标系统,后面四个%f填写一个矩形范围(顺序为xmin,ymin,xmax,ymax)。<

28、ogc:BBOX><ogc:PropertyName>%s</ogc:PropertyName><gml:Box srsName="%s"><gml:coordinates>%f,%f %f,%f</gml:coordinates></ gml:Box></ogc:BBOX>多个空间查询条件也需要逻辑比较谓词来包含,同时需要使用正确的标识“gml”,一个空间查询条件可以看作是一个属性查询条件,这方面操作是一致的。完整的空间查询语句如下:http:/xiaogl/ArcGIS/servi

29、ces/DemoWFS/MapServer/WFSServer?request=Getfeature&service=WFS&typename=Tbeijing_qiao&Filter=<ogc:Filter><ogc:Intersects><ogc:PropertyName>Shape</ogc:PropertyName><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>40.334,116

30、.304 40.317,116.366 40.264,116.321 40.277,116.288 40.312,116.287 40.334,116.304</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></ogc:Intersects></ogc:Filter>各类空间关系查询表现样式,请详细参见:https:/wiki.state.ma.us/confluence/display/massgis/contains3.3、空间

31、和属性混合查询通过上述说明,可以实现属性查询和空间查询,能否实现将属性和空间进行联合查询呢?答案是肯定的,通过组合WFS属性和空间的查询语句,实现两者的混合查询模式,查询语句如下:http:/localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer?request=Getfeature&service=WFS&typename=Tbeijing_qiao&Filter=<ogc:Filter><ogc:And><ogc:PropertyIsEqualTo><ogc:Propert

32、yName>class</ogc:PropertyName><ogc:Literal>2</ogc:Literal></ogc:PropertyIsEqualTo><ogc:BBOX><ogc:PropertyName>Shape</ogc:PropertyName><gml:Box srsName='EPSG:4326'><gml:coordinates>40.268176013,116.199341863 40.30384199,116.250685194<

33、;/gml:coordinates></gml:Box></ogc:BBOX></ogc:And></ogc:Filter>这样可以有效结合属性查询和空间查询,达到精确查询的目的。四、使用ArcGIS Flex API查询WFS在了解WFS属性和空间查询语句的构建方法后,需要在其他客户端进行测试,看能否通过构建的查询语句正确查询到所需要的对象信息。而且了解在客户端怎样实现WFS查询语句的执行和查询结果的解析成符合客户端需要的方式进行展现查询结果。下面以ArcGIS API For Flex为客户端表现方式进行WFS服务地图查询并展现查询结果

34、。4.1、Flex 执行WFS查询方式对于在Flex 执行WFS服务查询语句有两种方式:“HTTPService”和“urlLoader”,下面分别介绍两种查询方式:第一种“HTTPService”查询方式,一般在使用XML格式描述WFS查询语句时常使用,使用步骤是:首先定义一个“HTTPService”对象,并且使用“POST”方法进行请求,如下:<fx:Declarations><!- 将非可视元素(例如服务、值对象)放在此处 -><mx:HTTPService id="parseXml" method="POST" r

35、esult="resultEve(event)" fault="faultEve(event)" resultFormat="xml"/></fx:Declarations>然后定义WFS的XML格式查询语句,如下:var xmlFile:XML = <wfs:GetFeature xmlns:xsi="/2001/XMLSchema-instance" xmlns:gml=" xmlns:wfs=" xmlns:ogc=" se

36、rvice="WFS" version="1.1.0"><wfs:Query typeName="massgis:Tbeijing_qiao" xmlns:massgis="http:/localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer"><ogc:Filter xmlns=" <ogc:PropertyIsEqualTo><ogc:PropertyName>name</ogc:PropertyN

37、ame><ogc:Literal>前渠河桥</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter></wfs:Query></wfs:GetFeature>var xml:XML = new XML(xmlFile);发送该XML查询语句到后台进行请求,如下:parseXml.request=xml;parseXml.url="http:/localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer"par

38、seXml.contentType = "application/xml"/需要注意:必须设置该项内容,否则后台无法解析XMLparseXml.send();并获取查询结果,如下:private function faultEve(event:FaultEvent):void trace(event.message) private function resultEve(event:ResultEvent):void var arr:String=event.result.toString();/Alert.show(event.result.result.row.toSt

39、ring();var data:Object = event.result;下面对第二种方式进行介绍:在构建好WFS查询语句后,可以在Flex中对该查询语句进行请求:var urlString:String = “http:/localhost/ArcGIS/services/DemoWFS/MapServer/WFSServer?request=Getfeature&service=WFS&typename=Tbeijing_qiao&Filter=<ogc:Filter><ogc:And><ogc:PropertyIsLike wild

40、Card='*' singleChar='?' escapeChar=''><ogc:PropertyName>name</ogc:PropertyName><ogc:Literal>*河*</ogc:Literal></ogc:PropertyIsLike><ogc:PropertyIsEqualTo><ogc:PropertyName>class</ogc:PropertyName><ogc:Literal>2</ogc:L

41、iteral></ogc:PropertyIsEqualTo></ogc:And></ogc:Filter>”;如果该语句中包含有中文查询字符,则需要先进行转换成URI模式,如下:var uriString:String = encodeURI(urlString);对转换好的WFS查询语句进行请求,如下:var request:URLRequest = new URLRequest(uriString);var loader:URLLoader = new URLLoader();loader.load(request);loader.addEven

42、tListener(Event.COMPLETE,onCompleteHandler);这样请求后就可以得到查询的结果,但是由于WFS查询结果是以XML结构方式进行展现GML模式,这样需要在Flex中对得到的查询结果进行解析。4.2、Flex解析WFS查询结果使用Flex API中相应的类来构建对查询结果中的地图要素信息,需要对查询结果进行解析。在WFS查询结果中要素信息都是包含在“featureMember”这个GML的节点中,包括:属性值信息和空间几何类型及坐标值等。对应WFS查询结果中不同的几何类型,使用Flex API中的几何类进行定义:var pt:Point = new Point

43、();var polygon:Polygon = new Polygon();var polyline:Polyline = new Polyline();在获取几何坐标后,使用Flex API中的几何类型进行展现对应的几何形状。获取到几何信息和属性信息后,使用Flex API中Graphic进行几何形状的绘制并表现在客户端。五、使用ArcGIS Flex API更新WFS服务图层ArcGIS Server 10中支持的WFS版本为最新的1.1.0。在ArcGIS Server中,只需简单地勾选的Capabilities选项卡中可以选择支持WFS,如下图。如果勾选了Transaction复选框

44、,那么通过该WFS还可以进行数据更新(注意,需要是SDE数据源)。对WFS服务启用事务能力后,就可以实现对WFS服务地图图层进行更新编辑操作,包括Insert、Update、Delete三种编辑操作,可以使用如下语句进行插入一条新记录:<wfs:Transaction version="1.1.0" service="WFS" handle="Transaction 01" xmlns=" xmlns:wfs=" xmlns:ogc=" xmlns:gml=" xmlns:xsi=&quo

45、t;/2001/XMLSchema-instance" xsi:schemaLocation="http:/localhost/ArcGIS/services/TestWFST/MapServer/WFSServer http:/ localhost/ArcGIS/services/TestWFST/MapServer/WFSServer?request=DESCRIBEFEATURETYPE&typename=TestPoints ./wfs/1.1.0/WFS.xsd"><wfs:Insert><

46、TestPoints><name>Highway01</name><type>41</type><SHAPE><gml:Point><gml:pos>84.514 27.314</gml:pos></gml:Point></SHAPE></TestPoints></wfs:Insert></wfs:Transaction>然后使用HTTPService方式进行POST请求,如果执行成功则返回类似如下结果:<wfs:TransactionResponse xmlns:gml=" version="1.1.0" xmlns:xs="/2001/XMLSchema" xmlns:wfs=" xmlns:ogc=" fid="F460_463" /></wfs:Feature>&l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论