Log4Classicning

好读书 不求甚解 每有会意 便欣然忘食

客户端两种获取要素属性的方法
2007年10月16日

目标:在浏览器中点击一个地图要素(绝大多数情况下仅限于多边形)立刻得到该要素的属性信息。在Web端获得要素的信息通常情况下有两种方法可以使用,一是WMS的GetFeatureInfo,另一个是WFS的GetFeature。

事实上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);    
  });

其中imap是OpenLayers的Map对象实例。向服务器发送一个GetFeatureInfo请求,只需传入当前Web地图中的象素坐标x,y就可以让GeoServer找到点击的空间对象,这是WMS GetFeatureInfo的最大特点。GeoServer支持多种格式的结果输出,这里选择纯文本后可以用正则表达式进行匹配,取出我们真正想要的那些属性信息。

WFS的GetFeature比较容易理解,在我的印象中WFS就是用来做这类事情的。不过我比较担心的是它的效率问题。用WFS进行属性的查询:首先我们要构建一个Filter,这个Filter中需要创建一个点击点的GML对象,在通过空间位置关系运算符查找到我们点击的多边形,用GML返回多边形的属性值。获得点击点的空间坐标已经可以有OpenLayers的getLonLatFromPixel方法实现。

现在还不知道WMS的要素查找是怎样实现的,所以不好判断两个方法究竟谁的效率高。影响效率的关键还是在于地物的查找吧,大家不妨讨论一下。

« 地图配色免费文件管理器 »
  • quote 1.SHG
  • GetFeatureInfo只能传点坐标?
    那如果拉框能不能用这个?
    WFS应该可以拉框的吧
  • 2007-10-17 12:02:06 回复该留言
  • quote 3.寒风
  • 我用mapbuilder 客户端控件集成了地理信息的查询。他是用XSL解析GML得到地理信息的。我想扩展他的功能用JS解析GML得到对象的ID属性值。怎么实现啊!高手指点!
  • 2007-10-21 15:11:22 回复该留言
  • quote 4.Classicning
  • http://www.classicning.com
  • 引自 寒风
    我用mapbuilder 客户端控件集成了地理信息的查询。他是用XSL解析GML得到地理信息的。我想扩展他的功能用JS解析GML得到对象的ID属性值。怎么实现啊!高手指点!

    直接解析responseXML的DOM即可,查一下网上的例子吧。MapBuilder我没有用过,不过料想应该类似。
  • 2007-10-21 15:57:02 回复该留言
  • quote 5.lidong
  • "WFS就灵活多了,可以自己构建gmlObject,点、线、多边形都可以"
    能不能说的详细一点,自己构建gmlObject,url = imap.layers[0].getFullRequestString({....该如何写呢
  • 2008-3-26 21:18:30 回复该留言
  • quote 6.Classicning
  • http://www.classicning.com
  • 如果要用WMS的话就不能用getFullRequestString了,那个是GetFeatureInfo的,OpenLayers有没有封装我不太清楚。可以自己琢磨一下Filter的xml形式,然后构建一个Filter。请参考OGC Filter标准吧。
  • 2008-3-26 21:48:57 回复该留言
  • quote 8.gzasor
  • 大家好,我现在遇到一个问题,就是不管用wfs还是wms请求信息
    在客户端点击获取详细信息,我非要很准确的点到某个坐标才会返回详细信息,我想实现如果哪个点是一个圆,我只要点到圆的任何部分,都可以返回信息
    请给个思路,谢谢大家
  • 2008-11-10 9:24:05 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Search

站点统计

  • 文章总数:750
  • 评论总数:2657
  • 引用总数:4
  • 浏览总数:5693
  • 留言总数:42
  • 当前主题:ClassicningDailyLog Style
  • 当前样式:footoo

网站收藏

图标汇集

  • Creative Commons License
  • Widgetize!
  • visitor stats

Powered By Z-Blog 1.8 Spirit Build 80722

2004 - 2007 Classicning.com. 苏ICP备06039259号.