OpenLayers+Geoserver点要素,获取查询结果
在Geoserver中用SLD配置点要素的样式用图片表现时,订阅map的单击事件,往往会发生点击渲染图片无效,只有在单击点要素的时候才能触发事件。解决方案如下:(假设SLD配置文件中图片大小设为12px。)
(1)订阅MAP的单击事件:
map.events.register(‘click’, map, function (e) {
// 以当前点击点的坐标作为中心,图片大小一半为”半径”,构造一BOX,
// 应注意构造BOX的两点的关系,我这里采用EPSG:4326–》左下角为大,右上角为小
// 得到当前点的坐标,生成box
var lonlatMin = map.getLonLatFromPixel(new OpenLayers.Pixel(e.xy.x+6,e.xy.y-6));
var lonlatMax = map.getLonLatFromPixel(new OpenLayers.Pixel(e.xy.x-6,e.xy.y+6));
var strBBOX = lonlatMax.lon + “,” +
lonlatMax.lat + “,” +
lonlatMin.lon + “,” +
lonlatMin.lat + “,EPSG:4326”; // 注意投影参数
window.alert(strBBOX);
var params = {
REQUEST: “GetFeature”,
versiion: “1.1.0”,
// 请求的图层,可以多图层,以逗号分隔,第一个排在最上面,后面的依次往下排列
// 多图层时会先检测最上面的图层,无附合条件的再依次往下检测
typeName: “topp:jinggai”,
// 不写特定的propertyName时,会获得全部的属性
// 一般我们是获得FID再进行相关查询,有以下两种方法获得:
// (1)可以通过propertyName:”the_geom”,然后在setHTML中通过features[feat].FID获得
// (2)也可以通过获得全部属性,然后处理获得FID
//propertyName: “FID”,
// 记得采用GML2输出方式,才能使用OpenLayers.Format.GML().read()进行处理
outputFormat: “GML2”,
BBOX: strBBOX
};
OpenLayers.loadURL(“http://localhost:8080/geoserver/wfs“, params, this, setHTML, setHTML);
OpenLayers.Event.stop(e);
});
function setHTML(response){
//获得要素结果集
g = new OpenLayers.Format.GML();
features = g.read(response.responseText);
//遍历要素集
for(var feat in features) {
// 获得FID属性
nfid = features[feat].fid;
// 访问属性数据:features[feat].attributes.id — id 为自定义的属性名
// 判断是哪一层的要素
if(nfid.indexOf(“jinggai”) != -1){
// 通过FID请求非空间属性信息
//RequestDevInfo(nfid);
//这里可以通过nfid进行属性数据查询,我们项目中用Sqlserver存储要素属性数据,通过fid关联
// 当然也可以通过上面说的features[feat].attributes.xxx-获得存储在要素中的属性数据
showJinggaiInfo(nfid);
break;
}
}
注:此方法通过WFS::GetFeature方法进行要素查询,也可以用WMS::GetFeatureInfo进行,Geoserver中默认用wfs::GetFeatureInfo方法获得.
转载自:https://blog.csdn.net/iteye_16284/article/details/82363365