用mapXtreme Java开发web gis应用 (下)
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();
}
}
第一步显示效果如下:
1.jpg
第二步:控制地图的显示(响应客户端对地图放大、缩小、重定位、平移的请求)
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();
}
第二步,点击放大后可看到主要城市的图层信息,效果如下:
2.jpg
进一步放大后,能看到更多的图层信息,效果如下:
3.jpg
第三步:查询图层信息(根据客户端点击的地图位置,展现不通的图层信息)
CODE:
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
String xmlInfo = "";
xmlInfo +="<LAYERS><CITY>";
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 +="<LACENAME>"+f.getAttribute(i)+"</PLACENAME>";
break;
case 1:
xmlInfo +="<LATITUDE>"+f.getAttribute(i)+"</LATITUDE>";
break;
case 2:
xmlInfo +="<LONGITUDE>"+f.getAttribute(i)+"</LONGITUDE>";
break;
}
}
}
fs.dispose();
}
} catch (Exception ex) {
ex.printStackTrace();
}
xmlInfo +="</CITY></LAYERS>";
out.print(xmlInfo);
第三步,点击右键菜单,查看城市坐标图层信息:
4.jpg
查询出一定范围内的城市的坐标信息,示例效果如下:
5.jpg
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;
相关推荐
MapXtreme Java 版是企业级的地图绘制开发工具,可实现数据的可视化和地图绘制,帮助企业作出更加出色的决策,并更加有效地进行...使用 MapXtreme Java 构建的应用程序既可适用于企业内部网,也可适用于 公共的因特网。
用MapXtream开发gis定位系统的资料,比较实用的
基于MapXtreme的Web GIS开发物流车辆监控系统
地图的初始化渲染,缩放功能,图层定位等API均有介绍.包括十个专题以及实例代码,对于初学者有很大帮助。 MXTJ主要由 MapXtremeServlet、MapJ、Renderers、Data Providers四部分构成。
MapXtreme Java 4.7 中文开发手册
MapXtreme Web GIS的关键技术
MapXtreme Java Developer Guide
mapxtreme java的开发教程,带有开发说明,初学者比较好的帮助文档
MapInfo MapXtreme Java 版开发人员指南
项目中已经把mapXtreme for Java的服务和应用jar包放到一起了,可以直接加载到eclipse中运行。 之前发布了一个相同的例子,只是地图用的是我安装mapXtreme for Java4.8.2后的mdf格式地图,这个地图中用了我电脑的...
目标 • 安装JDK 1.5 • 安装MapXtreme Java 4.8 • 安装Eclipse • 设置Eclipse • 创建第一个Servlet 程序 • 创建第一个MapXtreme Java Servlet 程序
mapxtreme for java开发人员指南,针对java的,个人觉得还不错
mapxtreme - java 8.4.2破解文件及破解方法,去除水印的方法
GIS开发利器-MapXtreme 2008
MapInfo MapXtreme Java 版4.7 开发人员指南
MapXtreme Java Edition 是企业级的地图绘制开发工具,可实现数据的可视化和 地图绘制,帮助企业作出更加出色的决策,并更加有效地进行运营和管理资产。
本书用于MAOINFO的二次开发,基于Mapxtremejava的研究与应用
MapXtreme Java 4.8 win 安装文件-2 文件较大,由于权限不够,分卷压缩,共3个文件,请点我的名字找到另外2个
MapXtreme for java 的学习 ppt,初学者可以看看
附件中有说明文档和mapXtreme for Java4.8.2下载地址,里面有我QQ,有需要mapXtreme for Java4.8.2安装程序和mapXtreme for Java4.8中文开发文档的可以加我QQ。哦 不好意思,例子中我用的是mapXtreme for Java自带的...