|
|
|

在JXMapKit上实现GetFeatureInfo

WMS的GetFeatureInfo用于通过屏幕坐标获取相应位置的要素信息,其效果就如同MapInfo或ArcView里的Info按钮,而通常WMS的GetFeatureInfo则是通过发送异步的请求完成的,通过GetFeatureInfo,我们在WMS上也可以获得要素的属性信息,这是非常有帮助的。 GetFe...

作者:javaeye来源:javaeye|2010年10月03日
WMS的GetFeatureInfo用于通过屏幕坐标获取相应位置的要素信息,其效果就如同MapInfo或ArcView里的Info按钮,而通常WMS的GetFeatureInfo则是通过发送异步的请求完成的,通过GetFeatureInfo,我们在WMS上也可以获得要素的属性信息,这是非常有帮助的。

GetFeatureInfo需要如下几个参数:
  • bbox: 当前视图的Bound,以地理坐标表示
  • styles:当前视图的样式表信息
  • format:当前视图的图象格式
  • info_format:返回要数信息的格式,GeoServer支持GML、PlainText和HTML的返回,此外还可以通过Freemarker自定义模版
  • request:请求类型,在此是getFeatureInfo
  • layers:当前视图的图层
  • query_layers:要查询getFeatureInfo的图层
  • width:视图的宽度,以屏幕坐标表示,在GeoServer中必需是整型
  • height:视图的高度,以屏幕坐标表示,在GeoServer中必需是整型
  • x:要查询的屏幕坐标,整型
  • y:要查询的屏幕坐标,整型


在Web上,OpenLayers对GetFeatureInfo实施了有效的封装,那么在Swing的JXMapKit上要想获得相同的效果则需要手动取得参数了,需要的参数包括bbox,width,height,x和y,这些参数都需要在事件触发时获得,因为视图的大小、位置随时都可能改变。

首先要给JXMapKit添加响应点击的事件,要注意的是,这个事件应该添加在一个JXMapViewer上,而不是JXMapKit本身。一个JXMapKit包含两个JXMapViewer,一个称为MainMap,是主视图,另一个称为MiniMap,即我们常说的鹰眼图。要捕捉点击事件,需要给MainMap添加一个鼠标事件的监听器,对于JXMapViewer来说,awt的MouseListener似乎没有作用,而应当使用swing的MouseInputAdapter。

接下来就需要计算各个坐标了。

首先最容易获取的是点击的屏幕坐标,通过MouseEvent的getPoint可以取得。
获取视图的宽高,通过JXMapViewer的getViewportBounds可以取得一个矩形,这个矩形的宽高就是视图的宽高,坐标都是采用屏幕坐标系,直接可以使用。
对于bbox,需要获得左下角和右上角的地理坐标。这需要通过TileFactory的pixelToGeo方法取得,分别将视图框矩形的minx,maxy和maxx,miny,以及当前视图的缩放级别(JXMapKit实例的getZoom方法)传入即可。

代码如下

Java代码 复制代码
  1. @Override  
  2. public void mouseClicked(MouseEvent e) {   
  3.     Point p = e.getPoint();   
  4.     Rectangle r = map.getViewportBounds();   
  5.     GeoPosition b1 = map.getTileFactory().pixelToGeo(new Point2D.Double(   
  6.             r.getMinX(), r.getMaxY()), map.getZoom());   
  7.     GeoPosition b2 = map.getTileFactory().pixelToGeo(new Point2D.Double(   
  8.             r.getMaxX(), r.getMinY()), map.getZoom());   
  9. //....     
  10. }  


用这些参数构造一个异步请求,发送即可。关于异步请求,swingx-ws有响应的封装,可以参考。

上一篇:OpenLayers项目分析

下一篇:没有了!