1、GeoServer(地理信息系统服务器)是 OpenGIS Web 服务器规范的 J2EE 实现(geoserver只能用j2ee开发),利用GeoServer 可以方便的发布地图数据。GeoServer的主要特征包括:兼容 WMS 和 WFS 特性;能够将网络地图输出为jpeg、gif、png、SVG、KML等格式;能够运行在任何基于 J2EE/Servlet 容器之上。其安装方式有两种,一种是常见的.EXE安装,这种安装方式最简单,只要确保你电脑上安装了JDK并且8080端口是开的,按照安装步骤一步一步来就可以完成安装,安装完成以后,可以从开始菜单中选择GeoServer-> Start GeoServer进行启动,启动服务后,打开浏览器,输入http://localhost:8080/geoserver/就可以查看到GeoServer的欢迎界面了。另一种安装是以.WAR的形式安装,开发者电脑上得先安装有Tomcat,然后将此WAR导入即可。
Geoserver是一个功能齐全,遵循OGC开放标准的开源WFS-T和WMS服务器。利用Geoserver可以把数据作为maps/images来发布(利用WMS来实现)也可以直接发布实际的数据(利用WFS来实现),同时也提供了修改,删除和新增的功能(利用WFS-T)。 GeoServer, 顾名思义,是一个Server. 它是开源的 ,允许用户查看和编辑地理数据。GeoServer能够发布的数据类型:
(1)地图或影象——应用WMS
(2)实时数据——应用WFS
(3)用户更新、删除和编辑的数据——应用WFS-T。
GeoServer 是您需要显示地图在网页的那些工具的当中一个,用户可以缩放并且移动。可以与一些客户端联合使用,比如: MapBuilder(for web pages), UDig, GVSig,等等。 对标准的使用允许信息从GeoServer 到其它地理信息可以很容易地被结合。
2、Web地图服务(WMS):利用具有地理空间位置信息的数据制作地图,其中将地图定义为地理数据可视的表现,地图本身并不是数据。地图通常以图像格式表达,例如PNG,GIF或是JPEG,有时候也表达为基于矢量图形,如可缩放矢量图形(SVG)或是网络电脑图形元文件等格式(WebCGM)。根据OGC规范,地图服务是专门提供共享地图数据的服务,负责根据客户程序的请求,提供地图图像、指定坐标点的要素信息、以及地图服务的功能说明信息。
WMS规范定义了三个接口(操作):GetCapabilities(获取服务能力), GetMap(获取地图)和GetFeatureInfo(获取对象信息)。其中GetMap为核心操作。GetCapabitities返回服务级元数据,它是对服务信息内容和要求参数的一种描述;GetMap返回一个地图影像,其地理空间参考和大小参数是明确定义了的;GetFeatureInfo(可选)返回显示在地图上的某些特殊要素的信息。这个规范还定义了一个用于调用上述操作的万维网统一资源定位器(URL)语法和服务级元数据的XML(可扩展标记语言)表达法。
3、WMS 请求方式: WMS 支持标准 HTTP 中标准的 GET 请求和 POST 请求方式,不过对于 WMS 来说,基本都是基于 GET 方式的服务请求,而且 OGC 官方提供的兼容性测试中也都是基于 GET 方式的请求。
OGC网络服务明确支持的唯一的分布式计算平台(DCP)就是是万维网本身,更明确地说是实现了超文本传递协议(HTTP)的网络主机。因此,每个由服务实例支持的各操作的在线资源都是一个HTTP的统一资源定位器(URL)。HTTP支持两个请求方法:GET和POST,一个基本的WMS规范仅仅定义用来调用操作的HTTP GET。URL规范保留了一些特定的字符并赋予它们必要的意义,如下表1,
表1 HTTP GET查询中的保留字符
字符 | 用 途 |
? | 查询语句开始的分隔符 |
& | 查询语句参数之间的分隔符 |
= | 参数名字和参数值之间的分隔符 |
/ | 格式参数值中MIME类型子类型之间的分隔符 |
: | SRS参数值中命名空间和标识之间的分隔符 |
,
| 清单型参数中单个值的分隔符(例如GETMAP请求中的BBOX,LAYERS和STYLES) |
用于HTTPGET请求的在线资源URL事实上仅仅是一个URL前缀,为了建立一个有效的操作请求,在其后还添加了另外的参数。URL前缀被定义为一个不透明的字符串,它包括协议、主机名、端口号(可选)、路径、和一个问号“?”,还可以包括一个或几个用于具体服务器的参数并以“&”结束。
表2总结了操作请求URL的各个构件:
表2 普通OGC网络服务请求
URL 构件 | 描 述 |
http://host[:port]/path?{name[=value]&} | 服务操作的URL前缀。[ ]表示可选择0个或1个事件;{}表示0个或更多的事件。前缀完全取决于服务提供者。 |
name=value& | 由OGC网络服务定义的一个或更多的标准请求参数的名称和数值对。对于每个操作,相应的的OWS规范都规定了请求中使用的必选和可选参数的实际列表。 |
4、网络地图服务(WMS)的三大操作
(1)GetCapabilities(必选)
http://localhost:8080/geoserver/wms?service=WMS&request=GetCapabilities( GeoServer )
(浏览器会返回提示打开或保存一个文件,我的机器返回的是一个叫“wms”的文件,没有扩展名。没关系我们把它保存为“wms.xml”就可以了)
GetCapabilities请求返回的是一个对于WMS服务的一个元数据的描述,其中包括有当前服务提供商的一些基本信息以及当前服务的一些能力,而对于使用WMS服务的客户端来说,能获取到的所有信息全部包含在此文档中,当客户端发送一个服务中没有提供的的图片格式时,此时服务端将没有能力处理此请求。在使用WMS服务时需要确认当前服务提供的能力,以便在使用过程中发生一些不必要的麻烦。
GetCapabilities 接口用于向客户端提供当前地图服务器可以提供的空间信息类型和范围、具体的图层信息和显示样式、支持的查询方式、没有查询结果时(异常)的缺省返回信息格式等服务描述信息。
GetCapabilities 请求URL的参数
请求参数 | 必选(M)/可选(O) | 说明 |
VERSION=version(Version ( 版本 )=(1.1.1 或者 1.3.0) ) | O | 请求版本,URL 中可选的请求参数,当没有使用时就使用当前服务提供商提供的最高的 wms 版本服务 |
SERVICE=WMS | M | 服务类型 |
REQUEST=GetCapabilities | M | 请求名,请求中必须设置当前请求的操作,可以设置 request 的值为 Getcapabilities 、 GetMap 、 GetFeatureInfo |
FORMAT=MIME_type | O | 服务元数据的输出格式 |
UPDATESEQUENCE=string | O | 用于控制缓冲存储的数字序列或字符串 |
(2)GetMap(必选)
GetMap 接口的目的在于请求服务器生成一幅具有确定地理位置坐标范围的地图图像。但按照WMS规范,这个操作需要明确地指定出操作本身遵循的WMS规范的版本号以及需要显示的具体图层、对应的坐标范围、返回图像的大小和格式等。
GetMap请求的参数
请求参数 | 必选的(M)/ | 说 明 |
VERSION=version | M | 请求版本. |
REQUEST=GetMap | M | 请求名称. |
LAYERS=layer_list | M | 以逗号隔开的一个或多个图层列表,若存在SLD参数则是可选的。 |
STYLES=style_list | M | 以逗号隔开的请求图层的一个再现风格列表,若存在SLD参数则是可选的。 |
CRS=namespace:identifier | M | 坐标参考系。 |
BBOX=minx,miny,maxx,maxy | M | 以SRS单位表示的边界框边角 (左下角,右上角)。 |
WIDTH=output_width | M | 以像素表示的地图图像宽度。. |
HEIGHT=output_height | M | 以像素表示的地图图像高度 |
FORMAT=output_format | M | 地图输出格式。. |
TRANSPARENT=TRUE|FALSE | O | 地图背景的透明性 (default=FALSE). |
BGCOLOR=color_value | O | 以十六进制RGB颜色值表示的背景颜色(default=0xFFFFFF). |
EXCEPTIONS=exception_format | O | WMS通告异常的格式 (default=SE_XML). |
TIME=time | O | 请求层的时间值。 |
ELEVATION=elevation | O | 请求层的高程。 |
Other sample dimension(s) | O | 其它适当维度的值。. |
Vendor-specific parameters | O | 可选的实验性参数。. |
下列参数只用于支持格式化层描述符规范的网络地图服务 [3]. | ||
SLD=styled_layer_descriptor_URL | O | 格式化层描述符的URL(如同SLD规范中确定的). |
WFS=web_feature_service_URL | O | 网络要素服务URL,该服务提供将要用SLD进行符号化的要素。. |
注:在LAYERS参数值和STYLES参数值之间存在一个一一对应关系
对GetMap的响应:
对有效的GetMap请求的响应必须是一张地图,它包含了所请求的具有地理参考坐标的信息层,使用的是期望的样式,并且采用了指定的空间参照系、范围框、大小和透明性。一个无效的GetMap请求必须产生一个按请求的Exceptions格式输出的错误信息(或在极端情况下回答一个网络协议错误)。
(3)GetFeatureInfo(可选)
GetFeatureInfo是一个可选操作。该操作向WMS的客户端程序提供了进一步查询特定空间实体信息的能力。这种操作往往是由客户程序在WMS服务器先前返回的地图上指定了一个空间实体,进而提交查询而形成。支持GetFeatureInfo操作的仅仅是那些定义或继承了属性queryable=“1”的层。对于其它层,客户端不能发送GetFeatureInfo请求。如果一个WMS不支持该请求而遇到了它,则应该应答一个适当格式的服务异常。
GetFeatureInfo请求参数
请求参数 | 必选(M)/ | 描述 |
VERSION=version | M | 请求版本。 |
REQUEST=GetFeatureInfo | M | 请求名称。 |
map request part | M | 地图请求参数的部分拷贝,这些参数产生了需要查询其信息的地图。 |
QUERY_LAYERS=layer_list | M | 用逗号分隔的需要查询的一个或多个层的列单。 |
INFO_FORMAT=output_format | M | 要素信息的返回格式(MIME 类型)。 |
FEATURE_COUNT=number | O | 需要返回其信息的要素个数(default=1)。 |
X=pixel_column | M | 用像素表达的要素的X坐标 (以左上角坐标为0)。 |
Y=pixel_row | M | 用像素表达的要素的Y坐标 (以左上角坐标为0)。 |
EXCEPTIONS=exception_format | O | WMS报告异常信息采用的格式(default=application/vnd.ogc.se_xml)。 |
5、三大操作的样例
(1)GetMap请求类似于在Web上请求一幅图像,但它的请求参数更加复杂。下面是一个样例请求:
返回的图像如下图所示:
>
其中:
http:// —— 使用的网络协议
webmapping.mgis.psu.edu/ —— 主机域名
geoserver/wms —— 页面或web程序位置
version=1.1.1 —— WMS版本号
request=getmap —— 操作动词,可以为GetCapabilities, GetMap和GetFeatureInfo等
layers=topp:states —— 请求地图所包含的图层名,可以为多层
styles=population —— 指定图层绘制的样式名
SRS=EPSG:4326 —— 指定地图的坐标投影系统代码
bbox=-125,24,-67,50 —— 请求地图的范围(The Bounding Box)
width=400 —— 地图的像素宽度
height=200 —— 地图的像素高度,宽度和高度的不同设置可能会引起返回图像的变形
format=image/png —— 返回地图图像的格式,可以为Image/gif, image/jpg, image/svg+xml等等
如果参数设置错误,将返回一个XML文件来描述错误信息。如下所示:
<ServiceExceptionReportversion="1.1.1">
<ServiceException code="">
WIDTH and HEIGHT incorrectly specified
</ServiceException>
< /ServiceExceptionReport>
(2)GetCapabilities请求的样例如下所示:
http://webmapping.mgis.psu.edu/geoserver/wms?version=1.1.1&request=getcapabilities
返回的是一个XML文件(文件很大,内容略),包括Service、Capability等部分,详细信息可以查看返回XML文件。
把这个文档去头去尾以后留下两个节点Service和Capability。 Service包含了有关服务器的一般特性数据,对于只是想直接使用WMS服务器的人来说,这个节点还不太用得上,唯一值得注意的就是KeywordList节点,它里面是关键字,也就是服务器的保留字。 Capability才是我们学习的重点。如果你想正确的使用WMS服务器,这个节点里面的内容就必须搞清楚了。你可以从这个节点获得如下信息:
1)服务器支持哪些方法,WMS服务器必须支持GetCapabilities和GetMap,此外还有许多扩展的方法。
2)服务器支持哪些返回格式,WMS返回的地图都是渲染好的图片,因此这里的格式基本上都是图片格式,如image/png。
3)服务器发布了哪些图层,这个是WMS的重点,不然你连最简单的GetMap调用都构造不出来。
(3)GetFeatureInfo用于查询屏幕某点的对象信息,它的样例请求如下所示:
此请求返回一个HTML文档来描述对象,如下所示:
Results forFeatureType 'states':
--------------------------------------------
the_geom = [GEOMETRY(MultiPolygon) with 153 points]
STATE_NAME = Arizona
STATE_FIPS = 04
SUB_REGION = Mtn
STATE_ABBR = AZ
LAND_KM = 294333.462
WATER_KM = 942.772
PERSONS = 3665228.0
FAMILIES = 940106.0
HOUSHOLD = 1368843.0
MALE = 1810691.0
FEMALE = 1854537.0
WORKERS = 1358263.0
DRVALONE = 1178320.0
CARPOOL = 239083.0
PUBTRANS = 32856.0
EMPLOYED = 1603896.0
UNEMPLOY = 123902.0
SERVICE = 455896.0
MANUAL = 185109.0
P_MALE = 0.494
P_FEMALE = 0.506
SAMP_POP = 468178.0
要注意的是不同规范版本对上述请求的参数规定不同,如WMS1.3对于GetFeatureInfo的X、Y参数要求使用经纬度。所以我们必须根据服务器的WMS版本来设置我们的参数。
6、实现一个C#版本的WMS浏览器
(1)WmsBrowser需求
1)、用户输入WMS服务器的URI,点击一个按钮调用GetCapabilities方法。然后用返回的数据初始化控制界面。 用户在控制界面上可以查看服务器的各种Capability数据,并且可以选择要显示的图层,调整图层顺序 ,为图层设置参数,然后返回一个地图图片显示在预览区。
2)、用户可以把返回的图片保存成文件。
已经有许多支持WMS的客户端了,有许多代码可供学习和使用。但是,为了不干扰视线,为了避免介绍多余的内容,为了体现“自主创新精神”,最重要的是为了体验编程的乐趣(这也是我当初进入这个行业的原因),我决定只使用NotNet标准库提供的类完全从头开始编写代码。
(2)WmsBrowser设计
根据需求,这是一个WinForm的执行程序。需求其实很不明确,完全没有说明最重要的部分,控制界面是什么样子的,用户如何使用它。所以有必要补充一下了。
控制界面有两个功能:
1)查看GetCapabilities返回的数据;
2)设置GetMap需要的调用参数。
我们可以据此来设计这个界面。GetCapabilities返回的数据我们前面已经介绍过了,想象一下我们这款软件的潜在用户可能想要看到哪些数据,他们会如何使用这些数据。首先肯定是服务器发布的图层,这是访问WMS的唯一原因。至于服务器支持哪些调用应该不是他们关心的,而是我们开发者关心的。所以我们需要在界面上显示出Layer的内容,由于Layer是嵌套的,自然而然我们需要一个树控件。
除了Layer的Name,Title,Abstract这些属性外,用户应该还需要知道Layer支持的SRS,Style,Format和BoundingBox。这样他们才能构造出合理的调用参数。我们显然不应该让用户查看完数据后手动构造调用参数,我们需要让用户很方便的用鼠标完成工作。我们已经知道需要一个树控件来显示Layer信息。然后我们需要提供构造调用参数的界面。首先我们设想用户可能会如何完成这个工作。
上面的介绍中我们一直是手动敲入字符串来完成调用URI的构建的,繁琐而且容易出错,但是这种方法很灵活,所以应该保留。于是我们需要一个TexBox来输入URI。然后我们需要一个按钮来发出GetMap请求。我们必须考虑到,有相当一部分人并不善于键盘操作(其中包括我),所以我们应该给他们提供鼠标操作模式。于是第二个界面出现了,用户在这里使用鼠标选择想要显示的Layer,调整Layer显示的顺序,选择每个Layer的Style,选择Format,选择SRS,输入BoundingBox,输入返回图片的尺寸。然后同样点击上面提到的按钮,发出GetMap请求。更进一步,我们可以用上面的界面来获得一个基本的调用参数,然后到TextBox里面去微调,这样用户会获得更好的灵活性。
好了,到这里我们基本上搞清楚控制界面的样子了。现在需要讨论一点设计风格方面的问题。我们可以把所有代码写进一个叫MainForm的类里面,它是一个WinForm类。这样没有错,完全可以工作,实际上我见过的大部分代码都是这么干得。这样做的结果是,我很快就会放弃这个项目,转而去浏览cnblog或ifeng上面的帖子。我们需要一个更好的设计。我们在这里并不是要讨论架构,模式和开发方法,所以我们只需要达成一个共识就可以了: 我们需要把界面元素,操作响应以及数据模型分开编码,为他们单独建立类体系。
据此我们的设计也就差不多了,开始编码咯。
WmsBrowser编码ing。。。
程序完成。
启动程序后会看见主界面如下: 下图是返回的地图
这个程序还很稚嫩,有许多问题没有考虑,例如:输入验证,数据验证,异常处理等。以后我们会逐步完善它,目前作为一个参考和学习WMS的起点已经足够了。
(3)后续
在使用这个程序时,作为用户,我觉得还有很多不方便的地方。首先,我如果敲错了地址,我很容易敲错,程序会弹出一个丑陋的异常对话框,显示一大堆堆栈信息,完全看不出是什么错误。其次,设置参数BBox很不方便,如果能从已有的地图上用鼠标选择就好了。还有,返回时只是显示一个图片想看细节又要重复设置,Apply,GetMap的操作,太繁琐了。