通用接入WFS
Wfs服务主要功能
:属性查询 包含图像查询。支持各种条件 和查询数据库一样。
也支持 删除、修改、增加,支持空间查询和比较。
使用Acrgis发布wfs服务;方法自行百度;
获取wfs数据的代码:
通过与配合能够得到查询条件;然后拼凑到整个查询参数当中去就行。
从上面我们也能看出来,请求其实就是ajax的post请求。只是对于 wfs 来说查询参数需要是GML格式的(就是一种xml,只不过里面的节点名称都是指定的 有一定的规则,不然不能被arcgis识别);
获取过来的数据可以通过直接转化为feature对象,然后通过layer加载就可以显示了。
wfs查询参数的格式:
下面的就是查询参数的格式,可以看出来就是个xml,格式化后就是:
Filter部分条件也就是构造的查询条件。
关于跨域
请上面的请求我们能看出来:传入的参数中有个参数:
这个参数其实就是服务器的路径,由于请求是跨域的,所以使用了代理服务器,在后台获取的,所以就要把原始路径传递过去。
Ol中使用代理服务需要在js中加一行代码:
这个官方有定义。
下面附上 ashx的完整跨域代码:其实代理服务就是设置了一个后台的获取功能。没有啥东西。以前以为代理是什么呢,草。
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
usingSystem.Collections.Generic;
using System.Web;
using System.Net;
using System.IO;
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
if (string.IsNullOrEmpty(context.Request["URL"])) return;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(context.Request["URL"]);
request.UserAgent = context.Request.UserAgent;
request.ContentType =context.Request.ContentType;
request.Method =context.Request.HttpMethod;
byte[] trans = new byte[10240];
int offset = 0;
int offcnt = 0;
if (request.Method.ToUpper() == "POST")
{
Stream nstream =request.GetRequestStream();
while (offset <context.Request.ContentLength)
{
offcnt = context.Request.InputStream.Read(trans,offset, 10240);
if (offcnt > 0)
{
nstream.Write(trans, 0, offcnt);
offset +=offcnt;
}
}
nstream.Close();
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//Encoding enc =Encoding.GetEncoding(65001);
context.Response.ContentType = response.ContentType;
StreamReader loResponseStream = new StreamReader(response.GetResponseStream());
string lcHtml =loResponseStream.ReadToEnd();
context.Response.Write(lcHtml);
response.Close();
loResponseStream.Close();
}
public bool IsReusable {
get {
return false;
}
}
}
完整代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="../Lib/jquery/jquery-1.8.3.all.js"></script>
<script src="../OpenLayers2.13/OpenLayers.js"></script>
<script src="../OpenLayers2.13/lib/deprecated.js"></script>
<style>
html,body
{
height:100%;
overflow:hidden;
width:100%;
}
#map
{
height:500px;
width:1000px;
border:2px red solid;
}
</style>
<script type="text/javascript">
var map, drawLayer; var drawLayer;
function init() {
//添加代理
OpenLayers.ProxyHost = 'Handler.ashx?URL=';
var options = {
controls: [],
projection: "EPSG:4326"
};
map = new OpenLayers.Map('map', options);
var tiled = new OpenLayers.Layer.WMS(
"province", "http://ltserver:6080/arcgis/services/MyMapService/MapServer/WmsServer",
{
"LAYERS": '0',
"STYLES": '',
format: 'image/png'
},
{
buffer: 0,
isBaseLayer:true
}
);
map.addLayer(tiled);
drawLayer = new OpenLayers.Layer.Vector("drawLayer");
map.addLayer(drawLayer);
map.addControl(new OpenLayers.Control.PanZoomBar({
position: new OpenLayers.Pixel(2, 15)
}));
map.addControl(new OpenLayers.Control.Navigation());
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.setCenter([117,36],6);
GetGeoJson();
}
function GetGeoJson(layerName) {
var filter = new OpenLayers.Filter.Logical({
type:OpenLayers.Filter.Logical.AND,
filters: [
new OpenLayers.Filter.Comparison({//比较操作符
type:OpenLayers.Filter.Comparison.LIKE,
property: "所在市",
value: "温州市"
}),
new OpenLayers.Filter.Comparison({//比较操作符
type: OpenLayers.Filter.Comparison.LIKE,
property: "所在市",
value: "温州市"
})
]
});
var filter_1_0 = new OpenLayers.Format.Filter.v1_0_0();
var xml = new OpenLayers.Format.XML();
var xmlPara = '<?xml version="1.0"encoding="utf-8" ?>'
+ "<wfs:GetFeatureservice='WFS' version='1.0.0' outputFormat='GML2' "
+ "xmlns:wfs='http://www.opengis.net/wfs'"
+ "xmlns:gml='http://www.opengis.net/gml' "
+ "xmlns:ogc='http://www.opengis.net/ogc'"
+ "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"
+ "xsi:schemaLocation='http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd'> "
+ "<wfs:QuerytypeName='ProtectDev:功能区方案'srsName='EPSG:4326' >"
+ "<wfs:PropertyName>ProtectDev:所在市</wfs:PropertyName>"
+xml.write(filter_1_0.write(filter)) //添加查询条件,报错,目前是获取全部数据
+ "</wfs:Query>"
+ "</wfs:GetFeature>";
var request = OpenLayers.Request.POST({
url: "http://ltserver:6080/arcgis/services/ProtectDev/MapServer/WFSServer?",
data: xmlPara,
callback: function (e) {
var gmlParse = new OpenLayers.Format.GML();
var features =gmlParse.read(e.responseText);
drawLayer.addFeatures(features);
}
});
}
</script>
</head>
<body onload="init()">
<div id="map"></div>
</body>
</html>