mapxtreme java_用mapXtreme Java开发web gis应用 (下)

本文详细介绍了如何利用MapJ API在Web服务器的servlet中编写生成地图服务端代码,包括响应客户端请求、控制地图显示、图层信息查询及与客户端的交互。实例展示了地图缩放、定位、图层显示切换和坐标查询功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gllhde 发表于: 2008-10-30 20:14 来源: 博客乐园

3.3.3 编写生成地图的服务端代码这里所指的生成地图的服务端代码是指web服务器中servlet响应客户端请求生成图片信息的代码,具体讲就是指servlet中重写的doGet( )方法中的代码。特别注意的是,这里所指的生成地图的代码是我们通过调用MapJ的API向地图服务器发送生成地图请求的代码;相对地图服务器而言,我们这里编写的又是地图服务的客户端代码;相当于web应用而言,我们这里编写的却又是服务端代码。

下面我们以一个实例来介绍如何调用MapJ API编写生成地图的服务端代码。

第一步:向地图服务器发送请求生成地图

CODE:

// 输出图片的格式

private static String mimeType = "image/gif";

// mapxtremeservlet地图服务器url

private static String m_mxtURL = "http://localhost:80/mapxtreme480/servlet/mapxtreme";

// 实现HttpServlet的doGet方法

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

// 设置ContentType

response.setContentType(mimeType);

// 返回响应的输出流

ServletOutputStream sos = response.getOutputStream();

// 创建MapJ对象

MapJ  m_mapj = new MapJ();

try {

// 加载地图

String  m_mapPath="E:\\gisapp\\MapData\\Others\\China.mdf";

m_mapj.loadMapDefinition(m_mapPath);

// 设置地图大小

m_mapj.setDeviceBounds(new DoubleRect(0, 0, 800, 600));

request.getSession().setAttribute("worldMap", m_mapj);

// 创建图像请求器(包装mapj对象,图片的色位,底色,格式信息)

ImageRequestComposer irc = ImageRequestComposer.create(m_mapj, 256,

Color.white, mimeType);

// 创建mxtj的图像渲染器

MapXtremeImageRenderer renderer = new MapXtremeImageRenderer(

m_mxtURL);

// 用渲染器渲染请求器

renderer.render(irc);

// 渲染器输出图片流到输出流,客户端显示之

renderer.toStream(sos);

// 释放渲染器对象

renderer.dispose();

} catch (Exception e) {

System.out.println("Error");

e.printStackTrace();

}

}第一步显示效果如下:

第二步:控制地图的显示(响应客户端对地图放大、缩小、重定位、平移的请求)

CODE:

int  xpoint=Integer.parseInt(request.getParameter("xpoint"));//鼠标left坐标

int  ypoint=Integer.parseInt(request.getParameter("ypoint"));//鼠标top坐标

double   zoomSize=Double.parseDouble(request.getParameter("zoomSize"));//缩放比

// 返回响应的输出流

ServletOutputStream sos = response.getOutputStream();

// 获取地图对象

MapJ m_mapj = (MapJ)request.getSession().getAttribute("worldMap");

try {

// 设置地图大小

DoublePoint  dpt=      m_mapj.transformScreenToNumeric(new DoublePoint(xpoint,ypoint));

m_mapj.setCenter(dpt);

// 创建图像请求器(包装mapj对象,图片的色位,底色,格式信息)

ImageRequestComposer irc = ImageRequestComposer.create(m_mapj, 256,

Color.white, mimeType);

// 创建mxtj的图像渲染器

MapXtremeImageRenderer renderer = new MapXtremeImageRenderer(

m_mxtURL);

// 用渲染器渲染请求器

renderer.render(irc);

// 渲染器输出图片流到输出流,客户端显示之

renderer.toStream(sos);

// 释放渲染器对象

renderer.dispose();

} catch (Exception e) {

e.printStackTrace();

}第二步,点击放大后可看到主要城市的图层信息,效果如下:

进一步放大后,能看到更多的图层信息,效果如下:

第三步:查询图层信息(根据客户端点击的地图位置,展现不通的图层信息)

CODE:

PrintWriter out = response.getWriter();

HttpSession session = request.getSession();

String xmlInfo = "";

xmlInfo +="";

try {

int    xpoint=Integer.parseInt(request.getParameter("xpoint"));

int    ypoint=Integer.parseInt(request.getParameter("ypoint"));

MapJ mainMap = (MapJ) session.getAttribute("worldMap");

FeatureLayer layer = (FeatureLayer) mainMap.getLayers().get("CHCTY_2K");

//创建一个图原层

if (layer.isVisibleAtCurrentZoom()) {

ArrayList columns = new ArrayList();

columns.add("lace_Name");

columns.add("Latitude");

columns.add("Longitude");

DoubleRect rect = mainMap.transformScreenToNumeric(new DoubleRect(new DoublePoint(xpoint-100, ypoint-100), new DoublePoint(xpoint+100, ypoint+100)));

FeatureSet fs = layer.searchWithinRectangle(columns, rect, QueryParams.EMPTY_PARAMS);//得到图元集

Feature f;

while ((f = fs.getNextFeature()) != null ) {

for (int i = 0; i < f.getAttributeCount(); i++) {

switch (i)

{

case 0:

xmlInfo +=""+f.getAttribute(i)+"";

break;

case 1:

xmlInfo +=""+f.getAttribute(i)+"";

break;

case 2:

xmlInfo +=""+f.getAttribute(i)+"";

break;

}

}

}

fs.dispose();

}

} catch (Exception ex) {

ex.printStackTrace();

}

xmlInfo +="";

out.print(xmlInfo);第三步,点击右键菜单,查看城市坐标图层信息:

查询出一定范围内的城市的坐标信息,示例效果如下:

3.3.4 控制页面与后台的交互获取客户端鼠标点击位置:

CODE:

/**

*获取地图的偏移量

*/

var xOffset=0;

var yOffset=0;

function getObjOffset(){

var obj=document.all('chinaMap');

var xOff, yOff;

xOff = 0;

yOff = 0;

while (null != obj) {

xOff += obj.offsetLeft;

yOff += obj.offsetTop;

obj = obj.offsetParent;

}

xOffset=xOff;

yOffset=yOff;

}

var xpoint=event.x- xOffset;//鼠标x坐标

vary point=event.y- yOffset;//鼠标y坐标设置鼠标指针样式:

element.style.cursor=”hand”;

element.style.cursor=”move”;

设置菜单位置(若有右键操作时可设置):

menuDiv.style.left=event.x;

menuDiv.style.top=event.y;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值