现已知一幅地图的坐标数据(包括WKB_Geometry,以及这幅图的外接矩形的左下角和右上角的坐标),在和前台的交互过程中,前台传回窗口的大小width和height,通过width、height和地图的实际宽高计算出显示全图的比例尺scale,然后前台通过滚动鼠标滚轮缩放地图,后台实时根据新的比例尺生成地图,但有一个要求,就是不能按照坐标原点换算,而是按照前台地图窗口的中心换算,也就是说始终保持当前地图窗口的中心在缩放后仍然是地图窗口的中心,我现在有些想不明白如何计算新地图的xOffset和yOffset,才能够实现以地图中心点缩放的需求,所有的中间数据都保存在内存中,忘高手指点迷津。
我的显示全图的java代码如下
//获得地图离原点最远处坐标(maxX, maxY)和最近处坐标(minX, minY)
MapMinMax mmm = getMapMinMax(conn, oid);
//获得地图窗口宽高
int width = Integer.parseInt(request.getParameter("width"));
int height = Integer.parseInt(request.getParameter("height"));
//宽度比例尺(地图窗口宽度/图幅实际宽度)
double widthScale = width / (mmm.getMaxX() - mmm.getMinX());
//长度比例尺(地图窗口高度/图幅实际高度)
double heightScale = height / (mmm.getMaxY() - mmm.getMinY());
//为了显示全图,因此取两个比例尺中最小的一个
double scale = Math.min(widthScale, heightScale);
session.setAttribute("COM_PRE_SCALE", scale);
int xOffset = 0;
int yOffset = 0;
//如何计算新地图的xOffset和yOffset?
//获得地图中的多边形列表
List<CombineTable> clist = ProjectUtils.getCombineTableList(conn, oid, null, null);
BinaryParser bp = new BinaryParser();
Geometry geometry = null;
Point point = null;
for (int i = 0; i < clist.size(); i++) {
geometry = bp.parse(clist.get(i).getWKB_Geometry());
if (geometry.dimension == 2) {
if (geometry.getType() == Geometry.POLYGON) {
Polygon ploygon = (Polygon) geometry;
int numPoints = ploygon.numPoints();
int[] x = new int[numPoints];
int[] y = new int[numPoints];
for (int j = 0; j < numPoints; j++) {
point = ploygon.getPoint(j);
x[j] = xOffset + NumberUtils.doubleToInt((point.getX() - mmm.getMinX()) * scale);
y[j] = yOffset + NumberUtils.doubleToInt((point.getY() - mmm.getMinY()) * scale);
}
}
}
------解决方案--------------------
http://hi.baidu.com/geochenyj/blog/item/45bfc1c2967218190ef477ff.html
gis中控制地图显示的几个参数,也许对你有点帮助