事实上WMS不仅仅可以用GetMap请求获得地图,还可以用GetFeatureInfo请求来直接获取Feature的属性。尽管在OGC WMS1.3.0的标准规范中,GetFeatureInfo是一个Optional的功能,不过GeoServer还是实现了这项功能。下面是GeoServer例子中用OpenLayers获得属性信息的方法:
imap.events.register('click',imap,function(e){
var url = imap.layers[0].getFullRequestString({
REQUEST: "GetFeatureInfo",
EXCEPTIONS: "application/vnd.ogc.se_xml",
BBOX: imap.getExtent().toBBOX(),
X: e.xy.x,
Y: e.xy.y,
INFO_FORMAT: 'text/plain',
QUERY_LAYERS: imap.layers[0].params.LAYERS,
FEATURE_COUNT: 50,
layers: 'winter:constructions',
styles: '',
srs: 'EPSG:4326',
WIDTH: imap.size.w,
HEIGHT: imap.size.h},
iwmsurl //my wms url
);
OpenLayers.loadURL(url, '', this, showFeatureInfo, showFeatureInfo);
});
WFS的GetFeature比较容易理解,在我的印象中WFS就是用来做这类事情的。不过我比较担心的是它的效率问题。用WFS进行属性的查询:首先我们要构建一个Filter,这个Filter中需要创建一个点击点的GML对象,在通过空间位置关系运算符查找到我们点击的多边形,用GML返回多边形的属性值。获得点击点的空间坐标已经可以有OpenLayers的getLonLatFromPixel方法实现。
现在还不知道WMS的要素查找是怎样实现的,所以不好判断两个方法究竟谁的效率高。影响效率的关键还是在于地物的查找吧,大家不妨讨论一下。

