
使用OpenLayers以切片方式调用mapxtremejava渲染出的地图遇到的问题
---无法根据坐标范围获取精确范围的地图图片
想要达到的目的:使用OpenLayers以切片方式调用mapxtremejava渲染出的地图
环境:mapxtreme java 4.8.1 + apache tomcat5.5 + OpenLayers
具体情况:使用MapXtreme JA根据坐标范围渲染地图时,渲染出来地图的范围与程序Set进去的坐标范围不一致。这就导致以切片形式请求的地图不能正常显示。
图1:正常情况下mapxtreme显示的地图(singleTile=true)
图2:以切片形式请求返回的地图
图3:以切片形式请求返回的地图放大后
从上图可以看出切片地图的拼接出了问题,不能按正常情况显示,我开始检查自己写的代码,一行一行跟代码。
最终发现问题的所在,原来是mapxtreme对客户端的请求参数做了处理,它优化了客户端传进去的坐标范围,基本上我们无法获取我们想要的坐标范围的地图。
比如我们以坐标范围(45.0, 22.5, 67.5, 45.0)请求一张256*256像素大小的地图时,它使用坐标范围(37.06172554402468, 22.499855126681798, 78.20303563112182, 45.00029952050648)来渲染一张256*256的地图图片,也就是说mapxtreme java返回的图片对应的坐标范围包含了你请求的坐标范围,所有在使用OpenLayers进行请求时返回了无确组合的地图。
产生这种情况的可能原因:
1、这是mapxtreme对地图显示的优化。Mapxtreme java这样设计的初衷可能是以更友好的方式显示地图,防止用户请求的图片扭曲。mapxtreme

2、Mapxtreme java 在进行屏幕坐标与地理坐标转换的时候没有做到精确,从而影响了地图的输出。
个人认为时第一种原因可能性最大。至于第二种原因,如果mapinfo公司(现在应该是PB了)连屏幕坐标与地理坐标的转换都做不精确的话,那么mapinfo这个品牌也就该快退出GIS舞台了。
对应的参数值由servlet请求提供(这里没有贴出异常处理代码)
MapJ myMap = new MapJ();
myMap.loadMapDefinition(D:/temp/world.mdf);
System.out.println("User setBounds:" + new DoubleRect(x1, y1, x2, y2));
myMap.setBounds(new DoubleRect(x1, y1, x2, y2));
System.out.println("after setBounds: " + myMap.getBounds());
System.out.println("---------------------------------------");
myMap.setDeviceBounds(new DoubleRect(0, 0, width, height));
BufferedImage buffimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-28432-1.html
是狗天性多自负
你统计过双方伤亡数字吗