ol2加载ArcGis发布的wfs

来源:互联网 发布:linux中的dd命令 编辑:程序博客网 时间:2024/05/21 22:58

通用接入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 classHandler : 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;

        }

    }

 

}

 

完整代码:

<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<htmlxmlns="http://www.w3.org/1999/xhtml">

<head>

    <title></title>

    <scriptsrc="../Lib/jquery/jquery-1.8.3.all.js"></script>

    <scriptsrc="../OpenLayers2.13/OpenLayers.js"></script>

    <scriptsrc="../OpenLayers2.13/lib/deprecated.js"></script>

    <style>

        html,body

        {

            height:100%;

            overflow:hidden;

            width:100%;

        }

        #map

        {

            height:500px;

            width:1000px;

           border:2pxred solid;

 

        }

    </style>

    <scripttype="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>

<bodyonload="init()">

    <divid="map"></div>

</body>

</html>

 

阅读全文
0 0
原创粉丝点击