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方法)传入即可。
代码如下
@Override public void mouseClicked(MouseEvent e) { Point p = e.getPoint(); Rectangle r = map.getViewportBounds(); GeoPosition b1 = map.getTileFactory().pixelToGeo(new Point2D.Double( r.getMinX(), r.getMaxY()), map.getZoom()); GeoPosition b2 = map.getTileFactory().pixelToGeo(new Point2D.Double( r.getMaxX(), r.getMinY()), map.getZoom()); //.... }
用这些参数构造一个异步请求,发送即可。关于异步请求,swingx-ws有响应的封装,可以参考。