`
Classicning
  • 浏览: 250679 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

在JXMapKit上实现GetFeatureInfo

    博客分类:
  • Tech
阅读更多
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方法)传入即可。

代码如下

	@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有响应的封装,可以参考。
4
1
分享到:
评论
3 楼 houfeng0923 2011-05-24  

楼主,问个问题。除了geoserver这样完整的开源gis服务器,有没有开源的项目,只单独实现wms服务?(相对轻量级的,我只需要一个类似WMS中GetFeatureInfo功能的产品)。
2 楼 yjheeq 2009-12-07  
当然有了:
    public static DirectPosition2D worldToScreen(JMapPane mapPane, double x,
            double y) {
        AffineTransform tr = mapPane.getWorldToScreenTransform();
        DirectPosition2D mapPos = new DirectPosition2D(x, y);
        tr.transform(mapPos, mapPos);
        return mapPos;
    }

    public static DirectPosition2D screenToWorld(JMapPane mapPane, double x,
            double y) {
        AffineTransform tr = mapPane.getScreenToWorldTransform();
        DirectPosition2D mapPos = new DirectPosition2D(x, y);
        tr.transform(mapPos, mapPos);
        return mapPos;
    }
1 楼 xianglei 2009-05-03  
geotools有没有相关的方法把屏幕坐标转化为地图坐标的方法呢?谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics