发表用户:LongRiver
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?BoardID=11&id=3696
信息原始来源:不祥

文章标题:MapXtreme for Java开发专题一:怎样在应用中创建地图?


概述
MapXtreme for Java(以下简称MXTJ)是基于J2EE技术、服务器端的为创建Web地图服务应用的市场上第一个100%Java跨平台解决方案,使用它可实现瘦客户机/服务器、中等客户机/服务器、胖客户机/服务器三种Web GIS模式。

MXTJ主要由 MapXtremeServlet、MapJ、Renderers、Data Providers四部分构成。

MapXtremeServlet是系统的地图服务供给者,它提供如下服务:1 提供栅格地图数据服务,2 提供矢量地图数据服务,3 提供图元文件数据服务(例:tab表里的属性信息);

MapJ位于Mapxtreme客户端应用程序开发包API的最顶端作用有二:1 管理地图集的各种状态(例:地图中心位置、地图视野、地图坐标系等),2通过向MapxtremeServlet服务实例转发客户请求获得Servlet响应的数据和图片;

Renderer用来生成返回客户端地图数据的组件,有四种:LocalRenderer、MapXtremeImageRenderer、.Intra-Servlet Container Renderer、Composite Renderer。使用MapXtremeImageRender可以在远程产生地图图像,包含MapJ的应用程序和远程一个MapXtremeServlet实例通讯,产生地图图像;LocalRender将地图输出为Java2D Graphics2D对象,所有的Render在客户端产生,也即所谓地图的矢量传输方式;使用IntraServletContainerRenderer不需socket connection,从而MapXtremeSevlet将地图直接传回给客户端;Composite Renderer将地图分为动态与静态图层,当需要更新地图时,可只更新动态图层,而静态图层仅生成一次。

Data Provider是Layer(图层)对象的内部对象,它不是直接由用户创建的,但是它的描述是对图层的定义。要描述Data Provider通过如下接口:TableDescHelper – 描述数据; DataProviderHelper – 定义数据的源;ataProviderRef – 描述获取数据的方式。

以下我将分章节介绍MapXtreme for Java


专题一:怎样在应用中创建地图?
创建Map步骤:

n         创建 MapJ 对象

n         加载地图数据

n         设置地图尺寸

n         生成图片

以下分别描述:

1.                    初始化地图对象

执行:

myMap = new MapJ();

 

2.                    加载地图数据

可以打开GeoSet( *.gst)或MapDefinition( *.mdf )文件加载地图数据。MapXtreme没有默认的地图数据,所以必须人工加载地图数据。

         加载GeoSet

              myMap.loadGeoset(geosetName, dataDir, servletURL);

              其中:

                     geosetName:geoset的完整文件名(包括路径);

                     dataDir:geoset中引用的tab地图文件的位置;

                     servletURL:mapxtremeservlet的路径,如果MapJ使用LocalDataProviderRef,                                servletURL可以为NULL。

              示例:

              myMap.loadGeoset("c:\\mapxtreme\\maps\\world.gst",

"c:\\mapxtreme\\maps", 

"http://localhost:8080/mapxtreme40/servlet/mapxtreme";);

       加载 Map Definition

       可以加载保存在文件中的地图定义(*.mdf)或者数据库中的地图定义记录(record)。首先要创建MapDefContainer,有两种情况:

       地图定义在文件中:    

              MapDefContainer mdc = new FileMapDefContainer(dir)

       示例:

       MapDefContainer mdc = new FileMapDefContainer("c:\\mapxtreme\maps")

       地图定义在数据库中:

MapDefContainer mdc = new JDBCMapDefContainer(driver,url, user,                                                                                        password)

其中,driver,url,user,password都是数据库连接的参数。

下面的示例是使用Oracle Spatial MapRefContainer,地图定义保存在数据库的表中:

OraSoMapDefContainer mdc = 

new OraSoMapDefContainer("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@machinename:1521:dbSid",

"username", "password", "tableName", "Name",

"Map_Definition");

然后加载地图定义:

       myMap.loadMapDefinition(mapDefContainer, name)

              name 是 地图定义的名字,如:

              myMap.loadMapDefinition(mdc, "Asia");

 

 

3.                    设置图象尺寸

输出地图图像前需要设置地图尺寸,设置方法:MapJ.setDeviceBounds().,单位是象素。

示例:

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

 

4.                    生成图片 

生成图片需要一下几步:

n                   指定MapXtremeServlet

String mapxtremeServletUrl = "http://localhost:8080/mapxtreme47/mapxtreme";;

 

n                   创建ImageRequestComposer

ImageRequestComposer imageRC =ImageRequestComposer.create(myMap, 256, Color.blue,"image/gif");

表示图片是256色背景为蓝色的GIF图。

n                   创建ImageRender

MapXtremeImageRenderer renderer = 

new MapXtremeImageRenderer(mapxtremeServletURL);

 

n                   生成图片

返回图像的唯一办法就是使用Render对象。

Renderer.render(imageRC);

Renderer.toFile("comp.gif");

此外,还可以使用toStream,toImage方法将图像返回。

如果使用MapJ直接获取地图数据并生成图片,则使用LocalRender而不是MapXtremeImageRender。MapXtremeImageRender和LocalRender将在后面专门章节介绍。