(九)WebGIS中的矢量查询(针对AGS和GeoServer)

文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/html

1.前言

在第七章里咱们知道了WebGIS中要素的本质是UIComponent,而矢量图层的本质是包含了n(n>=0)个UIComponent的Canvas。咱们在UIComponent的graphics中,根据矢量数据画出矢量的形状(shape),而且将矢量数据的属性(attributes)赋予该UIComponent。前端

在接下来进行要素和矢量图层的设计前,咱们有必要了解这四个问题算法

(1)矢量数据是什么?sql

(2)矢量数据从何而来?json

(3)矢量数据如何组织的?缓存

(4)矢量数据获得后如何使用?服务器

在这一章里,我将着重回答第一、二、3个问题,第四个问题涉及到一些算法知识,咱们将专门在下一章进行讲解。app

2.矢量数据的本质

矢量数据跟通常性数据最大的差异在于矢量数据是包含了空间(geometry)信息的。咱们知道要素是由有序的空间坐标链接组成,而这个空间信息中便包含了该序列坐标。若是geometry为空,说明此要素不存在。同时矢量数据还包含通常性数据全部的信息,即属性数据。不过属性数据并非必须的,只要geometry信息存在,attributes信息没有,要素也是一样存在的。框架

3.矢量数据的来源

我将矢量数据的来源分为两种:工具

(1)非向后台请求得到。

这些数据是已经存在于前台代码中,或者由第三方调用者经过参数在前台调用咱们系统时自己经过参数传递进来。

(2)向后台请求得到。

向后台请求得到又要分为两种:

a.向业务服务器请求得到。

b.向地图服务器请求得到。

向业务服务器请求得到矢量数据跟通常的请求并无区别,业务服务器只要按照必定的规范,组织好矢量数据,返回便可。本章的重点是向你们介绍后者,如何向地图服务器请求矢量数据。

3.1经过ArcGIS Server得到矢量数据

3.1.1 AGS中几种服务的介绍

在咱们发布地图服务时,若是勾选了Mapping(必须勾选),咱们将能发布一个MapServer服务。固然,咱们的AGS还能发布多个其余种类服务,好比NAServer、GeometryServer、FeatureServer、GPServer。其中NAServer能够用来进行路径分析,GeometryServer服务中包含了一系列拓扑操做的服务,FeatureServer能够用来进行要素编辑,GPServer则能够利用发布的模型来进行复杂的空间操做。下面两张图分别是10.0中发布的几种服务,以及Geometry服务中提供的一些功能(在10.1和10.2中Geometry服务的默认地址有变化)。

 

 

这一章里,我主要讲的是MapServer中的Query服务。其余服务在咱们之后的功能设计模块中,若是涉及,会跟你们再一块儿探讨。

3.1.2MapServer的详解

首先MapServer支持两种请求方式,而且支持一些查询操做。具体以下:

 

在MapServer的页面中,咱们还能够看到该服务中所包含的图层的具体信息:

 

点击具体图层,进入该图层页面后,能看到该图层的详细信息,一样此页面中也详细的描述了能够支持的操做。以下图所示:

 

点击Query后即可以进入该图层空间查询的具体页面:

 

在此页面中,咱们能够经过对各个查询参数的设置来获取想要的查询结果。

3.1.3 Query查询的具体URL

MapServer中图层提供的查询服务是只支持rest样式的。经过上面的Query截图咱们能够知道,Query查询的参数为:objectIds、where、geometry、geometryType、spatialRel、outFields、returnGeometry、returnIdsOnly、f、time。

这些参数所表明的实际含义以下:

objectIds:要素的ObjectID号。好比:objectIds=37, 462。

where:查询条件,支持标准sql中的where写法。好比:where=POP2000 > 350000。

geometry:geometry中为要查询的范围。其与Geometrytype应保持一致。geometry中,有点、线、面三种写法。这里给出接口API中的描述:

 

geometryType:它的内容与geometry中的内容是对应的,它能够选择的值有:esriGeometryPoint 、 esriGeometryMultipoint 、 esriGeometryPolyline 、esriGeometryPolygon 、 esriGeometryEnvelope。

spatialRel:为空间参考参数。

outFields:为须要返回的属性字段。

returnGeometry:是否范围几何信息。默认是ture。

returnIdsOnly:是否只范围ObjectID。默认是false。

f:返回数据的格式。有html、json 、kmz 、 amf。对咱们开发者来讲,返回json是最适合的。

time:赋为一个随机值便可,设置了此参数,能够避免查询读缓存。

这里给出一个URL示例的截图:

 

注意:我在这里将where设置为1=1,此表示可以返回咱们在发布服务时已经设置好的返回的最大数据个数。默认为返回1000个数据。outFields设置为*是返回数据中全部关键字段的信息。另外,对于URL还想作进一步了解的读者,能够参考ArcGIS Server中的API Reference。

咱们在程序中,向AGS服务器发送请求,查询某个关键字段时,即可以仿照这个URL的样式来进行请求。AGS的Query服务支持GET和POST两种请求方式。

3.2经过GeoServer得到矢量数据

3.2.1Geoserver的简介

GeoServer做为开源的地图服务工具,因为其易扩展性、开源性、功能完整性等等优势,被愈来愈多的实际项目所使用。Geoserver支持OGC中的WMS、WFS等标准,且Geoserver的请求方式一样支持Rest和Soap两种协议。GeoServer自己是由Maven进行组织的,内部使用了struts和Spring框架,这里我跟你们展现一下GeoServer的源码内部构造,让你们对GeoServer的本质有个稍微清晰的认识:

                                                

如何开发GeoServer并非咱们这个系列的重点,咱们这个系列是跟你们一块儿探索WebGIS的一些原理知识,设计并实现一些基于原理知识的模型和功能。若是你们对Geoserver有兴趣,我将在之后的其余系列里和你们一块儿研究。

Geoserver发布成功后,即可以登录、进入以下页面:

 

回到正题上,如何用GeoServer来实现如AGS中的Query查询呢?

3.1.2 详解Query查询

查询图层信息为WFS服务中的getFeature服务,其请求方式与标准的WFS请求方式是同样的。可是,与AGS相比,Geoserver的Query查询条件编写是相对复杂的,而且通常有两种方式。

3.1.2.1第一种方式,URL方式

http://www.someserver.com/wfs?SERVICE=WFS& VERSION=1.1.0& REQUEST=GetFeature& PROPERTYNAME=InWaterA_1M/wkbGeom,InWaterA_1M/tileId& TYPENAME=InWaterA_1M& FILTER=<Filter><Within><PropertyName>InWaterA_1M/wkbGeom<PropertyName> <gml:Envelope><gml:lowerCorner>10,10</gml:lowerCorner> <gml:upperCorner>20 20</gml:upperCorner></gml:Envelope></Within></Filter>

3.1.2.2第二种:链接后发送XML方式

在链接到http://www.someserver.com/wfs 后,向其发送下面的XML:

 

3.1.2.3对两种请求方式的小结

这两种方式中,Filter均是编写重点。Filter自己是一种基于XML的而且符合OGC规范的语言。WFS在全部须要定位操做对象的地方都会使用Filter。Filter的做用是构建一个表达式,返回值就是Feature的集合,换句话说Filter就如它的名字通常为咱们从一个集合中过滤出一个知足咱们要求的子集。而过滤的方法就是Filter定义的操做符。Filter定义了三种操做符:地理操做符(Spatial operators),比较操做符(Comparison operators)和逻辑操做符(Logical operators)。

Spatial operators定义了地理属性的操做方式,他们有:Equals、Disjoint、Touches、Within、Overlaps、Crosses、Intersects、Contains、Dwithin、Beyond、BBOX。

 Comparison operators定义了标量属性的操做方式,他们有:PropertyIsEqualTo、PropertyIsNotEqualTo、PropertyIsLessThan、PropertyIsGreaterThan、PropertyIsLessThanOrEq、PropertyIsLike、PropertyIsNull、PropertyIsBetween。

 Logical operators逻辑操做符,定义了组合这些操做的方式,他们有:And、Or、Not。

在Query编写中,Geometry参数的编写也很重要,同时也有必定的难度,他须要咱们对GML语言有必定的了解。这里给出GML的三个例子,分别对应point、box、Polygon:

 

 

 

若是咱们但愿前台直接向Geoserver发送请求,能够选择第一种URL方式。若是咱们是经过咱们的业务服务器转发对Geoserver的请求,建议使用第二种方式。第二种能够发送的数据量更大,而且易于造成标准请求。

4.矢量数据的组织

矢量数据自己的组织方式并无规定的格式,能够视具体的项目而定。不过对于AGS和Geoserver返回的数据,是有固定格式的。这里咱们分别给出例子。

4.1AGS的矢量数据组织格式

下图便为一个AGS标准的矢量数据格式:

 

它由attributes和geometry组成。Attributes中包含了查询获得的属性结果,geometry中则包含了查询所得要素的空间信息。针对不一样的要素,返回的geometry的组织是各不相同的。Geometry对线和面分别有paths和rings两种数据组织格式。

4.2Geoserver的矢量数据组织格式

Geoserver中返回的矢量数据组织格式与AGS的差很少,须要注意的是两点:

(1)表示点、线、面的字段名称有不一样之处。在Geoserver中线和面的字段名分别是:Line、Polygon| MultiPolygon。

(2)返回的坐标,相对于AGS中的坐标(X,Y),Geoserver中的是相反的,即为(Y,X)。

5.总结

在这一章里,咱们对AGS和Geoserver中的WFS服务进行了详细的讲解。实际项目中,矢量图层的数据大可能是来源于此服务所返回的数据的。咱们回到我在本章开头时提出的第四个问题:矢量数据获得后如何使用?

矢量数据中的Geometry数据为地理坐标数据,咱们在前端表现矢量图层时,是在要素(UIComponent)中画出Geometry的形状,因此这里就涉及到,如何将获得的地理坐标转换为对应的屏幕坐标,让前端的UIComponent上能够画出该要素形状。

在下一章里我将跟你们一块儿探讨这个问题,下一章:地理坐标与屏幕坐标的转换,敬请关注。

                                                                                                  --欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS

 

 

 

朋友喜欢读历史,但我私下以为,他这个爱好有点把读闲书当作干正事之嫌。缘由主要有以下几点:

1.所读的历史书籍均是私货太多、通过别人几层过滤之书,不是作历史研究该多看之书。

2.每当问起最近作了什么有意义的事情时,朋友便会说我看了什么什么历史书,却拈轻怕重的逃避了应该去作的更多更实际的事情。

3.若是真心想研究历史,朋友应该不仅停留在看书上面。应该还要有多问、多听、多写这三个方面。

期待朋友能在历史方面有更多收获,小的收获是丰富生活、增长谈资,中等收获是陶冶情操、学会作人,高等收获是成一家之言、立百代之学。

有中等收获,就已是一个了不得的读史人了。朋友,但愿你可以实现。

相关文章
相关标签/搜索