利用DotSpatial发布WMS, WFS服务
我们遇到的几个给政府部门做的GIS系统,一般都只要面子,只要好看,领导高兴得不得了,点点这里点点那里,哟,这按钮一点还会转,领导开心得跟朵花似的。。。要是搞个各种分析什么的全堆上来,他就嫌烦了。。。这不说是由于使用的功能比较简单,花钱买个ArcGIS太浪费了,要用个开源系统做一个,一来给客户节省开销,二来我们自己也能赚一点。然后就在挑开源GIS,主要到现在也就会写点C#的代码,Grass, QGis, GeoTools, GeoServer什么的就都没考虑,就在DotSpatial和SharpMap里选了DotSpatial。我们的要求不高,只要能完成常用的地图加载查询什么的就好了。首先写的WMS。
WMS
WMS服务必须实现的有 GetCapabilites, GetMap,可选的功能是GetFeatureInfo。(说明一下,在ArcGIS发布的WMS服务里,还有GetStyles功能,但是在OGC的1.3.0版本的WMS说明文档里没有提到GetStyles,也就是说GetStyles并不是OGC标准功能)这里分条介绍一下:
GetCapabilites
其功能是获取WMS服务的功能列表,也就是描述一下我发布的这个WMS能实现哪几个功能。
GetCapabilites请求有不同的版本,常见的是1.1.1和1.3.0的,这里我写的是1.3.0版本的,下面只针对1.3.0写一下必备的参数:
是否必需
描述
REQUEST=GetCapabilities
必需
SERVICE=WMS
必需
大写的WMS
VERSION=1.3.0
可选
这里我写的只支持1.3.0的,所以不设置的话就默认返回1.3.0的格式了
FORMAT=MINE_type
可选
返回类型,我这里只返回text/tml格式
UPDATESEQUENCE=string
可选
Sequence number or string for cache control,我这里忽略了
在添加了一个一般处理程序wms.ashx之后,首先从HttpContext里获取各种参数,利用DotSpatial.Control.Map新建一个Map对象,接下来就是根据下面的返回格式进行解析拼凑了:
大体代码如下:
string wmsNamespaceURI = "http://www.opengis.net/wms";
XmlDocument doc = new XmlDocument();
XmlNode rootNode = doc.CreateNode(capabilities.CreateNode(XmlNodeType.Element, "WMS_Capabilities", wmsNamespaceURI);
rootNode.Attributes.Append(doc.CreateAttribute(...));
...
doc.AppendChild(rootNode); context.Response.Clear();
context.Response.ContentType = "text/xml";
XmlWriter writer = XmlWriter.Create(context.Response.OutputStream);
capabilities.WriteTo(writer);
writer.Close();
context.Response.End();GetMap
GetMap方法主要是根据请求和地图来获取图片。
这里依旧根据1.3.0版本简单介绍一下请求参数:
是否必需
描述
REQUEST=GetMap
必需
VERSION=1.3.0
必需
LAYERS=layer_list
必需
用逗号分隔多个图层,请求全部置为空
STYLES=style_list
必需
用逗号分隔多个图层,与LAYERS排序相同
CRS=namespace:identifier
必需
如 CRS=EPSG:2436
BBOX=minx,miny,maxx,maxy
必需
要请求的图上坐标范围
WIDTH=output_width
必需
请求返回的图像的宽度
HEIGHT=output_height
必需
FORMAT=output_format
必需
返回图像格式 image/png
TRANSPARENT=TRUE|FALSE
可选
地图是否透明 true
BGCOLOR=color_value
可选
背景颜色 White
EXCEPTIONS=exception_format
可选
抛出异常默认为xml格式
与GetCapabilities一样,也是取到参数之后,用参数初始化一个DotSpatial.Control.Map对象,把Map.Size设置成WIDTH和HEIGHT大小,这样导出的地图就正好符合输出尺寸了,设置好LAYERS和STYLES,缩放到BBOX,然后利用Map提供的SnapShot()方法获得图像并插入到Response中。后边代码:
var img = map.SnapShot(); ImageEncodeInfo info; ImageCodecInfo [] infos = ImageCodecInfo.GetImageEncoders();
for (int i = ; i < infos.Length; i++)
{
if (infos[i].MimeType == pMimeType)
{
info = infos[i];
break;
}
} byte[] buffer;
using (var ms = new MemoryStream())
{
img.Save(ms, info, null);
img.Dispose();
buffer = ms.ToArray();
}
context.Response.Clear();
context.Response.ContentType = pMimeType;
context.Response.OutputStream.Write(buffer, , buffer.Length);
context.Response.End();GetFeatureInfo
根据请求参数获取要素。
还是1.3.0版本的参数设置:
是否必需
描述信息
REQUEST=GetFeatureInfo
必需
VERSION=1.3.0
必需
#regionGetMap的设置地图部分
LAYERS=layer_list
必需
用逗号分隔多个图层,请求全部置为空
STYLES=style_list
必需
用逗号分隔多个图层,与LAYERS排序相同
CRS=namespace:identifier
必需
如 CRS=EPSG:2436
BBOX=minx,miny,maxx,maxy
必需
地图的当前范围
WIDTH=output_width
必需
地图的当前范围
HEIGHT=output_height
必需
请求返回的图像的宽度
…其它可选参数
#endregion
I=pixel_column
必需
请求点在图片上的位置X
J=pixel_row
必需
QUERY_LAYERS=layer_list
必需
查询的图层,逗号分隔,必须包含在LAYERS中
INFO_FORMAT=output_format
必需
要素信息返回的格式Capabilities里<Request><FeatureInfo><Format>中的格式
FEATURE_COUNT=number
可选
最大返回数量
EXCEPTIONS=exception_format
可选
GetFeatureInfo也与上面无异,首先设置好Map,然后通过DotSpatial.Control.IMapFeatureLayer.Select(Extent)工具选出要查找的要素,最后把要素的属性拼接出来。
除了用Extent选择以外,还可以将得到的List<IFeature>用CQL_FILTER进行过滤。
把Context.Response.ContentType设置成要返回的格式,Context.Response.Write(string)写入取得的字符串。
WFS
WFS(Web Feature Service)服务必须实现的功能有GetCapabilities 、 DescribeFeatureType 和 GetFeature,可选的功能有GetGmlObject 和 Tansaction。这里说明的版本为1.1.0
这里都是根据索引号为OGC 04-094 Version: 1.1.0的Web Feature Service Implementation Specification 里的说明。
GetCapabilities
这是所有OWS(OGC Web Service)都必须实现的功能,功能都是返回该服务的服务能力等元数据。
下面是1.1.0版本的参数说明
是否必需
REQUEST=GetCapabilities
必需
还是拼xml,和WMS的GetCapabilities差不多了。请求如:http://…..?Request=GetCapabilities
<?xml version="1.0" encoding="UTF-8"?>
<wfs:WFS_Capabilities xmlns:ows="http://www.opengis.net/ows" version="1.1.0" xmlns:Basemap="http://sritserver-pc/ArcGIS/services/Basemap/MapServer/WFSServer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs" xsi:schemaLocation="http://www.opengis.net/gml http://schemas.opengis.net/gml/3.1.1/base/gml.xsd http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd http://www.opengis.net/ows http://schemas.opengis.net/ows/1.0.0/owsAll.xsd http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
<ows:ServiceIdentification>……
<ows:ServiceProvider>……
<ows:OperationsMetadata>……
<wfs:FeatureTypeList>……
<ogc:Filter_Capabilities>……
</wfs:WFS_Capabilities>DescribeFeatureType
请求参数:
<xsd:element name="DescribeFeatureType" type="wfs:DescribeFeatureTypeType"/>
<xsd:complexType name="DescribeFeatureTypeType">
<xsd:complexContent>
<xsd:extension base="wfs:BaseRequestType">
<xsd:sequence>
<xsd:element name="TypeName" type="xsd:QName"minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="outputFormat"type="xsd:string" use="optional"default="text/xml; subtype=gml/3.1.1"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>是否必需
TypeName
不必需
如果不带TypeName参数则返回所有图层
outputFormat
不必需
该属性用于设置返回的要素类型的描述语言,默认为text/xml; subtype=gml/3.1.1,如果设置错了不识别会自动跳过该属性
返回格式大致如下:(http://…..?Request=DescribeFeatureType&TypeName=SQ).具体的格式可以查看OGC标准文档说明或arcgis发布的服务的返回。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:Basemap="http://sritserver-pc/ArcGIS/services/Basemap/MapServer/WFSServer" xmlns:gml="http://www.opengis.net/gml" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://sritserverpc/ArcGIS/services/Basemap/MapServer/WFSServer"><xs:import schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd" namespace="http://www.opengis.net/gml"/>
<xs:element type="Basemap:SQType" name="SQ" substitutionGroup="gml:_Feature"/>
<xs:complexType name="SQType">……
</xs:schema>GetFeature
常用的几个参数如下:
是否必需
Request=GetFeature
必需
featureID=SQ.F1026__6
直接取得SQ图层里featureID(不是ObjectID)为F…__6的要素,以F开头,最后6是ObjectID,中间的几个字母不知道是怎么对应的,不过可以根据图层的各信息来编码,只要不重复就可以
TypeName=SQ
如果featureID未指定,则必需,多个用逗号隔开
BBOX=xmin,ymin,xmax,ymax
非必需
outputFormat
非必需
默认值text/gml; subtype=gml/3.1.1,还有text/xml; subtype=gml/2.1.2等
maxFeatures
非必需
featureVersion=ALL
非必需
对于支持版本的系统返回指定版本的要素
resultType=Results
非必需
还有Hits可选值,Hits时不返回所有结果,只返回结果的一些描述,如数量、结构等
…
其它参数…
依旧是根据请求的参数 和 Map 来查找需要返回的要素,然后转换成 GML 的格式返回,这里列一下我用到的几个格式,不一定全:
对于Shape,最顶层节点都是<Shape>
点。 <gml:Point>
<gml:pos>x y<gml:pos>
</gml:Point>线,多线 <gml:multiCurve>
<gml:CurveMember><!--每一段对应一个CurveMember-->
<gml:LineString>
<gml:posList>x1 y1 x2 y2 x3 y3……</gml:posList>
</gml:LineString>
</gml:CurveMember>
<gml:CurveMember>… </gml:CurveMember>
</gml:multiCurve>面,多面 <gml:MultiSurface>
<gml:surfaceMember><!--每一部分面对应一个surfaceMember-->
<gml:Polygon>
<gml:exterior><!--只有一个外环-->
<gml:LinearRing>
<gml:posList>x1 y1 x2 y2 x3 y3......</gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior><!--每一个内环对应一个interior-->
<gml:LinearRing>
<gml:posList>x1 y1 x2 y2 x3 y3......</gml:posList>
</gml:LinearRing>
</gml:interior>
<gml:interior>......</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>......</gml:surfaceMember>
<gml:MultiSurface>
转载请注明出处
利用DotSpatial发布WMS, WFS服务的更多相关文章
- openlayer3 加载geoserver发布的WFS服务
转自原文 openlayer3加载geoserver发布的WFS服务 openlayers3调用GeoServer发布的wfs 1 参考一 1.1 问题 openlayer3加载WFS存在跨域问题,需 ...
- OpenLayers调用ArcGIS Server发布的WFS服务
OpenLayers调用ArcGIS Server发布的WFS服务 原创: 蔡建良 2013-08-20 一. 开发环境 1) Openlayers2.13+arcgis server9.3 2) W ...
- 利用GeoServer发布web地图服务
参考: http://www.cnblogs.com/beniao/archive/2011/01/11/1931028.html http://www.cnblogs.com/LBSer/p/445 ...
- SkylineGlobe SFS发布的WFS和WMS服务测试
SkylineGlobe SFS发布的WFS服务:http://localhost/SFS/streamer.ashx?service=wfs&request=GetCapabilities& ...
- 使用GeoServer发布shp数据为WMS服务和WFS服务
使用GeoServer发布shp数据为WMS服务和WFS服务 1安装GeoServer 2使用GeoServer上传数据 3使用GeoServer发布数据为WMS和WFS 看完本教程,你将学会安装Ge ...
- ArccGIS 10发布WFS服务并加载到Skyline中
下面用ArcGIS Server 10.0将建筑物图层发布为WFS服务. (1)创建mxd文件.ArcMap打开建筑物图层,存为Buildings.mxd文件.注意:必须统一空间参考系,且要与图层的坐 ...
- WFS服务查询方法
基于Geoserver发布的wfs服务,实现空间和属性信息的查询.wfs包含getFeature操作,用来检索要素信息,支持返回gml格式的地理要素表达. WFS的getFeature操作需要提供的参 ...
- GDAL库中WFS服务中含有中文不能获取数据的问题
GDAL库中目前提供了对WFS服务发布的数据进行获取,目前发现对于中文的服务名称或者图层名为中文,GDAL不能正确识别.通过调试发现,其原因有下面两点: 1.输入的URL路径没有使用UTF8编码而从网 ...
- skyline添加wfs服务时,弹出错误“no layers were found”!
1.问题描述: 使用TerraExplorer Pro添加ArcGIS Server 10.2发布的WFS服务图层时,弹出如下错误: 2.错误原因: 发布wfs服务前,图层数据源的空间参考未设置,不能 ...
随机推荐
- (转)SqlServer索引及优化详解(1)
(一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚 ...
- 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
学习 EF Code First+MVC 时遇到了在请求JsonResult时出现 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用 的异常,原因 ...
- Elasticsearch配置详解、文档元数据
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch配置文件详解 a. 在上面博客中,我们已经安装并且成功 ...
- 【高级功能】使用canvas元素(第一部分)
1. 开始使用 canvas 元素 canvas 元素非常简单,这是指它所有的功能都体现在一个JavaScript对象上,因此该元素本身只有两个属性:width 和 height. canvas 元素 ...
- 滚动条美化实践(原生js,iscroll,nicescroll)
近期需要改造项目中的滚动条,使原滚动条在三大浏览器下表现相同,分享一下自己的改造经历: 项目中的滚动条分布在网页的各个小窗口中,使用的是-webkit-scrollbar制作,在-webkit内核的浏 ...
- 从头开始构建LINUX[内核更新和资料]
了解了LFS的内容后,至于内核的更新就一目了然了 http://www.cnblogs.com/2018/p/3979305.html http://www.cnblogs.com/2018/p/39 ...
- Menu创建菜单
菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu),今天这讲是O ...
- iOS开发之功能模块--本地序列化
下面只展示项目开发中,本地序列化的示例代码: AuthenticationManager.h #import <Foundation/Foundation.h> #import " ...
- OkHttp简介
什么是OKHttp 一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理.比如可以使用http客户端与第三方服务(如SSO服 ...
- JavaWeb开发环境准备之Linux篇
01 Linux环境准备 (本文在win10上使用 VMware12 + Ubuntu14.04) 1.JDK安装及相关配置 参考:http://blog.csdn.net/sxdtzhaoxin ...