|
基于Geoserver發(fā)布的wfs服務,與Openlayers結合實現空間和屬性信息的查詢。wfs包含getFeature操作,用來檢索要素信息,支持返回gml格式的地理要素表達。 WFS的getFeature操作需要提供的參數:
舉例:
FILTER詳解:Filter是一種基于XML的并且符合OGC規(guī)范的語言。SLD用它來實現復雜的Rule選擇。WFS在所有需要定位操作對象的地方都會使用Filter。Filter的作用是構建一個表達式,返回值就是Feature的集合,換句話說Filter就如他的名字一般為我們從一個集合中過濾出一個滿足我們要求的子集。而過濾的方法就是Filter定義的操作符。Filter定義了三種操作符:地理操作符(Spatial operators),比較操作符(Comparison operators)和邏輯操作符(Logical operators)。 u Spatial operators定義了地理屬性的操作方式,他們有:Equals,Disjoint,Touches,Within,Overlaps,Crosses,Intersects,Contains,DWithin,Beyond,BBOX。
u Comparison operators定義了標量屬性的操作方式,他們有:PropertyIsEqualTo,PropertyIsNotEqualTo,PropertyIsLessThan,PropertyIsGreaterThan,PropertyIsLessThanOrEq,PropertyIsGreaterThanO,PropertyIsLike,PropertyIsNull,PropertyIsBetween。
u Logical operators邏輯操作符,定義了組合這些操作的方式,他們有:And,Or,Not。 舉例:構建一個表達式,人口在一千萬以上,并且在指定的空間范圍內的城市。 <Filter>
驗證實例:之前走了一些彎路,自己構建Filter的xml編碼,后來發(fā)現OpenLayers已經寫好了Filter過濾條件和轉成xml的類,這樣Filter標簽里的內容不用逐個編寫了。 1. 拓撲查詢(點與面相交- Intersects) 查詢條件設置如下: var XML; XML = '<?xml version="1.1.0" encoding="UTF-8"?>' + "/n"; XML = '<wfs:GetFeature service="WFS" version="1.0.0" outputFormat="GML2"' + "/n"; XML += ' xmlns:topp="http://www./topp"' + "/n"; XML += ' xmlns:wfs="http://www./wfs"' + "/n"; XML += ' xmlns:ogc="http://www./ogc"' + "/n"; XML += ' xmlns:gml="http://www./gml"' + "/n"; XML += ' xmlns:xsi="http://www./2001/XMLSchema-instance"' + "/n"; XML += ' xsi:schemaLocation="http://www./wfs' + "/n"; XML += ' http://schemas./wfs/1.1.0/WFS-basic.xsd">' + "/n";
//上面是查詢用的gml的前綴 XML += '<wfs:Query typeName="bj:xzqy">' + "/n"; XML += '<wfs:PropertyName>bj:ENTITY_ID</wfs:PropertyName>' + '/n'; XML += '<wfs:PropertyName>bj:the_geom</wfs:PropertyName>' + '/n';
XML += '<ogc:Filter>' + "/n"; XML += '<ogc:Intersects>' + "/n"; XML += '<ogc:PropertyName>bj:the_geom</ogc:PropertyName>' + "/n"; XML += ' <gml:Point srsName="http://www./gml/srs/epsg.xml#4326">' + "/n"; XML += '<gml:coordinates>116.817265,40.5296504</gml:coordinates>' + "/n"; XML += '</gml:Point>' + "/n"; XML += '</ogc:Intersects>' + "/n"; XML += '</ogc:Filter>' + "/n"; XML += '</wfs:Query>' + "/n"; XML += '</wfs:GetFeature>';
var xmlPara = XML; //返回結果無法解析為gml??-已解決(增加返回結果樣式標簽) var request = OpenLayers.Request.POST({ url: "http://localhost:8080/geoserver/wfs?", data: xmlPara, callback: onComplete }); 查詢結果展示:地圖上深色的部分為根據坐標點與行政區(qū)域面相交分析出的結果
2. 拓撲查詢(面與面相交- Intersects) 查詢條件設置: var XML; XML = '<?xml version="1.1.0" encoding="UTF-8"?>' + "/n"; XML = '<wfs:GetFeature service="WFS" version="1.0.0" outputFormat="GML2"' + "/n"; XML += ' xmlns:topp="http://www./topp"' + "/n"; XML += ' xmlns:wfs="http://www./wfs"' + "/n"; XML += ' xmlns:ogc="http://www./ogc"' + "/n"; XML += ' xmlns:gml="http://www./gml"' + "/n"; XML += ' xmlns:xsi="http://www./2001/XMLSchema-instance"' + "/n"; XML += ' xsi:schemaLocation="http://www./wfs' + "/n"; XML += ' http://schemas./wfs/1.1.0/WFS-basic.xsd">' + "/n";
//上面是查詢用的gml的前綴 XML += '<wfs:Query typeName="bj:xzqy">' + "/n"; XML += '<wfs:PropertyName>bj:ENTITY_ID</wfs:PropertyName>' + '/n'; XML += '<wfs:PropertyName>bj:the_geom</wfs:PropertyName>' + '/n';
XML += '<ogc:Filter>' + "/n"; XML += '<ogc:Intersects>' + "/n"; XML += '<ogc:PropertyName>bj:the_geom</ogc:PropertyName>' + "/n"; XML += '<gml:Polygon srsName="http://www./gml/srs/epsg.xml#4326">' + "/n";
XML += '<gml:outerBoundaryIs>' + "/n"; XML += '<gml:LinearRing>' + "/n"; XML += '<gml:coordinates>115.40316,39.425701 116.40316,39.425701 116.40316,40.245 115.40316,40.245 115.40316,39.425701</gml:coordinates>' + "/n"; //0,0 100,0 100,100 0,100 0,0 XML += '</gml:LinearRing>' + "/n"; XML += '</gml:outerBoundaryIs>' + "/n";
XML += '</gml:Polygon>' + "/n"; XML += '</ogc:Intersects>' + "/n"; XML += '</ogc:Filter>' + "/n"; XML += '</wfs:Query>' + "/n"; XML += '</wfs:GetFeature>';
var xmlPara = XML; //返回結果無法解析為gml??-已解決(增加返回結果樣式標簽) var request = OpenLayers.Request.POST({ url: "http://localhost:8080/geoserver/wfs?", data: xmlPara, callback: onComplete }); 查詢結果展現:地圖上深色的部分為查詢到的行政轄區(qū)面要素
3. 拓撲查詢(面與面包含- Contains) 使用Openlayers提供的方法構造過濾條件 1. 拓撲查詢(空間相交與屬性過濾) 查找指定空間范圍(傳入Geometry類型參數)內NAME字段以“幼兒園”結尾的要素。 或者NAME字段的值為“西羅園第三幼兒園”的要素。 或者OBJECTID字段的值的范圍是從0到1000。 //驗證利用Filter構建過濾條件 function conformationFilter(geo) { var filter_1_0 = new OpenLayers.Format.Filter.v1_0_0(); //也可以使用1.1版本構造過濾條件 //var filter_1_1 = new OpenLayers.Filter({ version: "1.1.0" }); var xml = new OpenLayers.Format.XML(); //構造xml格式的文件 var filter = new OpenLayers.Filter.Logical({//邏輯操作符 type: OpenLayers.Filter.Logical.AND, //并且更改為或者 filters: [ new OpenLayers.Filter.Spatial({ type: OpenLayers.Filter.Spatial.INTERSECTS, //INTERSECTS, //相交OK value: geo, projection: "EPSG:4326" }), //BBOX方式OK // new OpenLayers.Filter.Spatial({ // type: OpenLayers.Filter.Spatial.BBOX, // value: new OpenLayers.Bounds(115.40316, 39.425701, 116.40316, 40.245), // projection: "EPSG:4326" // }), new OpenLayers.Filter.Comparison({//比較操作符 type: OpenLayers.Filter.Comparison.LIKE, //模糊查詢(通配符:*/#/!),速度很慢 property: "bj:NAME", value: "*幼兒園"
}), new OpenLayers.Filter.Comparison({//比較操作符 type: OpenLayers.Filter.Comparison.EQUAL_TO, //精確查詢 property: "bj:NAME", value: "西羅園第三幼兒園"
}), new OpenLayers.Filter.Comparison({//比較操作符 type: OpenLayers.Filter.Comparison.BETWEEN, //在。。。之間(數值型) property: "bj:OBJECTID", lowerBoundary: 0, upperBoundary: 1000
}) ] });
//構造指定格式的xml return result = xml.write(filter_1_0.write(filter));
};
展示結果:
返回結果的高亮顯示和屬性信息展示: //AJAX請求結果處理函數(添加標注+屬性列表) function onComplete(req) { //openlayers的GML解析器 var gmlParse = new OpenLayers.Format.GML();//如果使用wfs1.1.0,則需要增加如下參數:{xy:false }//更改x,y坐標的讀取順序 var features = gmlParse.read(req.responseText);
var icon = new OpenLayers.Icon("img/marker-blue.png"); var feature, lonlat, marker; var attributes = []; //高亮顯示 for (var feat in features) { feature = features[feat]; //高亮顯示 switch (feature.geometry.CLASS_NAME) { case "OpenLayers.Geometry.MultiPolygon": { var polygon = feature.geometry.components[0].clone(); var vec = new OpenLayers.Feature.Vector(polygon); temVectorLayer.addFeatures([vec]); } break; case "OpenLayers.Geometry.Point": { //經度緯度是相反的,所以需要重新構建 var pt = feature.geometry.clone(); var vec = new OpenLayers.Feature.Vector(pt); temVectorLayer.addFeatures([vec]); } break; } attributes.push(feature.attributes); } var strAttributes = ""; if (!document.all("attr")) return; if (document.all("attr").firstChild) { document.all("attr").firstChild.removeNode(true); } for (var key in attributes) { var attr = attributes[key]; strAttributes += "["; var trHead = document.all("attr").insertRow(); var tdHead = trHead.insertCell(); tdHead.innerText = "編號:" + key;
for (var k in attr) { var tr = document.all("attr").insertRow(); var td0 = tr.insertCell(); td0.innerText = k; var td1 = tr.insertCell(); td1.innerText = attr[k];
strAttributes += k + ":" + attr[k]; } strAttributes += "]";
}; alert(strAttributes); };
|
|
|
來自: primivite_ > 《geoserver》