概述:
一直在寻求openlayers中wfs加载和属性查询的相关操作,功夫不负有心人,蓦然回首,那人却在灯火阑珊处,找到了这篇博文:http://blog.csdn.net/longshengguoji/article/details/39377931,试了下,在IE8中正常运行,但是在chrom中涉及到跨域的问题,待后期接解决吧。本文讲解如何通过wfs实现属性的查询与展示。
效果:
初始化状态
属性查询结果
空间查询结果
数据表:
关键代码:
添加wfs图层
wfs = new OpenLayers.Layer.Vector("wfs", { strategies: [new OpenLayers.Strategy.Fixed()], visibility:true, protocol: new OpenLayers.Protocol.WFS({ url: "http://localhost:8081/geoserver/lzugis/wfs?", featureType: "capital", featurePrefix : "lzugis", featureNS: "http://www.lzugis.com.cn", srsName : "EPSG:4326", geometryName:"the_geom" }) }); map.addLayer(wfs);查询条件面板
<pre name="code" class="html"><div class="query-box"> <select id="field"> <option value="code">编码</option> <option value="pinyin">拼音</option> </select> <input type="text" id="val" value="100032" style="width: 80px;"/> <button id="query">属性查询</button> <button id="boxQuery">空间查询</button> </div>
执行属性查询查询
$("#query").on("click",function(){ var field = $("#field").val(); var val = $("#val").val(); var filter = new OpenLayers.Filter.Comparison({ type : OpenLayers.Filter.Comparison.EQUAL_TO, property : field, value : val }); console.log(wfs); wfs.filter = filter; wfs.refresh(); })
空间查询
var drawLayer = new OpenLayers.Layer.Vector("drawLayer",{ styleMap: new OpenLayers.StyleMap({'default':{ strokeColor: "#ff0000", strokeOpacity: 1, strokeWidth: 1, fillColor: "#000000", fillOpacity: 0.1 }}) }); map.addLayer(drawLayer); var drawBox = new OpenLayers.Control.DrawFeature(drawLayer, OpenLayers.Handler.RegularPolygon,{ handlerOptions: { sides: 4, irregular: true } } ); map.addControl(drawBox); drawBox.featureAdded = onEndDraw; function onEndDraw(feature){ drawBox.deactivate(); console.info(feature); var geometry = feature.geometry; var filter = new OpenLayers.Filter.Spatial({ type : OpenLayers.Filter.Spatial.INTERSECTS, value : geometry, projection : 'EPSG:4326' }); wfs.filter = filter; wfs.refresh(); map.zoomToExtent(wfs.getDataExtent()); } $("#boxQuery").on("click",function(){ drawLayer.removeAllFeatures(); wfs.filter = null; wfs.refresh(); drawBox.activate(); });
完整代码为:
<pre name="code" class="html"><html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>china EPSG:4326 image/png</title> <link rel="stylesheet" type="text/css" href="http://localhost/olapi/theme/default/style.css"/> <style type="text/css"> body { font-family: sans-serif; font-weight: bold; font-size: .8em; } body { border: 0px; margin: 0px; padding: 0px; } #map { width: 100%; height: 100%; border: 0px; padding: 0px; } .query-box{ position: absolute; top: 15pt; right: 15pt; z-index:1001; border: 1px solid #ff0000; border-radius: 3px; background: #f2f2f2; padding: 5px 8px; font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; } </style> <script type="text/javascript" src="http://localhost/olapi/OpenLayers.js"></script> <script type="text/javascript" src="http://localhost/olapi/lib/OpenLayers/Lang/zh-CN.js"></script> <script src="http://localhost/jquery/jquery-1.8.3.js"></script> <script type="text/javascript"> var map, wfs; function init(){ var bounds = new OpenLayers.Bounds( 87.57582859314434, 19.969920291221204, 126.56713756740385, 45.693810203800794 ); var options = { controls: [], maxExtent: bounds, maxResolution: 0.1523098006807012, projection: "EPSG:4326", units: 'degrees' }; map = new OpenLayers.Map('map', options); var tiled = new OpenLayers.Layer.WMS( "province", "http://localhost:8081/geoserver/lzugis/wms", { "LAYERS": 'province', "STYLES": '', format: 'image/png' }, { buffer: 0, displayOutsideMaxExtent: true, isBaseLayer: true, yx : {'EPSG:4326' : true} } ); map.addLayer(tiled); map.addControl(new OpenLayers.Control.PanZoomBar({ position: new OpenLayers.Pixel(2, 15) })); map.addControl(new OpenLayers.Control.Navigation()); map.zoomToExtent(bounds); wfs = new OpenLayers.Layer.Vector("wfs", { strategies: [new OpenLayers.Strategy.Fixed()], visibility:true, protocol: new OpenLayers.Protocol.WFS({ url: "http://localhost:8081/geoserver/lzugis/wfs?", featureType: "capital", featurePrefix : "lzugis", featureNS: "http://www.lzugis.com.cn", srsName : "EPSG:4326", geometryName:"the_geom" }) }); map.addLayer(wfs); var drawLayer = new OpenLayers.Layer.Vector("drawLayer",{ styleMap: new OpenLayers.StyleMap({'default':{ strokeColor: "#ff0000", strokeOpacity: 1, strokeWidth: 1, fillColor: "#000000", fillOpacity: 0.1 }}) }); map.addLayer(drawLayer); var drawBox = new OpenLayers.Control.DrawFeature(drawLayer, OpenLayers.Handler.RegularPolygon,{ handlerOptions: { sides: 4, irregular: true } } ); map.addControl(drawBox); drawBox.featureAdded = onEndDraw; function onEndDraw(feature){ drawBox.deactivate(); console.info(feature); var geometry = feature.geometry; var filter = new OpenLayers.Filter.Spatial({ type : OpenLayers.Filter.Spatial.INTERSECTS, value : geometry, projection : 'EPSG:4326' }); wfs.filter = filter; wfs.refresh(); map.zoomToExtent(wfs.getDataExtent()); } $("#boxQuery").on("click",function(){ drawLayer.removeAllFeatures(); wfs.filter = null; wfs.refresh(); drawBox.activate(); }); $("#query").on("click",function(){ var field = $("#field").val(); var val = $("#val").val(); var filter = new OpenLayers.Filter.Comparison({ type : OpenLayers.Filter.Comparison.EQUAL_TO, property : field, value : val }); wfs.filter = filter; wfs.refresh(); // map.zoomToExtent(wfs.getDataExtent()); }); } </script> </head> <body onLoad="init()"> <div class="query-box"> <select id="field"> <option value="code">编码</option> <option value="pinyin">拼音</option> </select> <input type="text" id="val" value="100032" style="width: 80px;"/> <button id="query">属性查询</button> <button id="boxQuery">空间查询</button> </div> <div id="map"></div> </body> </html>