2022年MapXtremeForJava开发教程 .pdf

上传人:Che****ry 文档编号:27266887 上传时间:2022-07-23 格式:PDF 页数:23 大小:220.26KB
返回 下载 相关 举报
2022年MapXtremeForJava开发教程 .pdf_第1页
第1页 / 共23页
2022年MapXtremeForJava开发教程 .pdf_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《2022年MapXtremeForJava开发教程 .pdf》由会员分享,可在线阅读,更多相关《2022年MapXtremeForJava开发教程 .pdf(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、MapXtreme for Java 开发教程1 概述MapXtreme for Java (以下简称MXTJ )是基于J2EE 技术、服务器端的为创建Web 地图服务应用的市场上第一个100%Java跨平台解决方案,使用它可实现瘦客户机/服务器、 中等客户机 /服务器、胖客户机/服务器三种Web GIS 模式。MXTJ 主要由 MapXtremeServlet 、 MapJ、Renderers、Data Providers 四部分构成。MapXtremeServlet 是系统的地图服务供给者,它提供如下服务:1 提供栅格地图数据服务, 2 提供矢量地图数据服务,3 提供图元文件数据服务(例:

2、tab 表里的属性信息) ;MapJ 位于 Mapxtreme 客户端应用程序开发包API 的最顶端作用有二:1 管理地图集的各种状态(例:地图中心位置、地图视野、地图坐标系等),2 通过向MapxtremeServlet 服务实例转发客户请求获得Servlet 响应的数据和图片;Renderer 用 来 生 成 返 回 客 户 端 地 图 数 据 的 组 件 , 有 四 种 : LocalRenderer 、MapXtremeImageRenderer 、.Intra-Servlet Container Renderer 、Composite Renderer。使用 MapXtremeIma

3、geRender 可以在远程产生地图图像,包含 MapJ 的应用程序和远程一个MapXtremeServlet 实例通讯, 产生地图图像; LocalRender 将地图输出为Java2D Graphics2D 对象,所有的 Render在客户端产生,也即所谓地图的矢量传输方式;使用IntraServletContainerRenderer 不需 socket connection,从而 MapXtremeSevlet 将地图直接传回给客户端;Composite Renderer 将地图分为动态与静态图层,当需要更新地图时,可只更新动态图层,而静态图层仅生成一次。Data Provider 是

4、 Layer(图层)对象的内部对象,它不是直接由用户创建的,但是它的描述是对图层的定义。要描述Data Provider通过如下接口:TableDescHelper 描述数据; DataProviderHelper 定义数据的源;ataProviderRef 描述获取数据的方式。以下我将分章节介绍MapXtreme for Java 2 怎样在应用中创建地图创建 Map 步骤:(1)创建 MapJ 对象;(2)加载地图数据;(3)设置地图尺寸;(4)生成图片以下分别描述:2.1 初始化地图对象执行: myMap = new MapJ(); 名师资料总结 - - -精品资料欢迎下载 - - -

5、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 23 页 - - - - - - - - - 2.2 加载地图数据可以打开GeoSet( *.gst)或 MapDefinition ( *.mdf )文件加载地图数据。MapXtreme没有默认的地图数据,所以必须人工加载地图数据。2.2.1 加载 GeoSet myMap.loadGeoset(geosetName, dataDir, servletURL); 其中:geosetName:geoset的完整文件名(包括路径);dataDir:geoset中引用的tab 地图

6、文件的位置;servletURL :mapxtremeservlet 的路径,如果MapJ 使用LocalDataProviderRef ,servletURL可以为 NULL 。示例: myMap.loadGeoset(c:mapxtrememapsworld.gst,c:mapxtrememaps, http:/localhost:8080/mapxtreme40/servlet/mapxtreme;); 2.2.2 加载 Map Definition 可以加载保存在文件中的地图定义(*.mdf )或者数据库中的地图定义记录(record) 。首先要创建MapDefContainer ,有

7、两种情况:一、地图定义在文件中: MapDefContainer mdc = new FileMapDefContainer(dir) 示例: MapDefContainer mdc = new FileMapDefContainer(c:mapxtrememaps) 二、地图定义在数据库中:MapDefContainer mdc = new JDBCMapDefContainer(driver, url, user, password) 其中, driver,url,user,password 都是数据库连接的参数。下面的示例是使用Oracle Spatial MapRefContainer

8、 ,地图定义保存在数据库的表中: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,

9、Asia); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 23 页 - - - - - - - - - 2.3 设置图象尺寸输出地图图像前需要设置地图尺寸,设置方法:MapJ.setDeviceBounds(). ,单位是象素。示例: myMap.setDeviceBounds(new DoubleRect(0, 0, 800, 600); 2.4 生成图片生成图片需要一下几步:(1)指定 MapXtremeServlet String mapxtremeServle

10、tUrl = http:/localhost:8080/mapxtreme47/mapxtreme; (2)创建 ImageRequestComposer ImageRequestComposer imageRC =ImageRequestComposer.create(myMap, 256, Color.blue,image/gif); 表示图片是256 色背景为蓝色的GIF 图。(3)创建 ImageRender MapXtremeImageRenderer renderer = new MapXtremeImageRenderer(mapxtremeServletURL); (4)生成图

11、片返回图像的唯一办法就是使用Render 对象。Renderer.render(imageRC); Renderer.toFile(comp.gif); 此外,还可以使用toStream,toImage 方法将图像返回。如 果 使 用MapJ 直 接 获 取 地 图 数 据 并 生 成 图 片 , 则 使 用LocalRender而 不 是MapXtremeImageRender 。MapXtremeImageRender 和 LocalRender 将在后面专门章节介绍。3 怎样操作地图 -控制地图显示看到地图图像后,你可能需要查看地图的其他部分,看看整体或地图细节。下面介绍一些控制地图显示

12、的方法。3.1 设置地图视野(Zoom )Zoom 值是地图的横向跨度,单位有地图的距离单位决定。设置zoom 可以放大或缩小地图。当地图加载时,zoom 就被设定了。改变 zoom 的方法是setZoom()。示例:/ Assuming that the current distance units are kilometers, this command will set the map zoom to 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 23 页 - -

13、 - - - - - - - 500 kilometers. myMap.setZoom(500); 3.2 设置地图中心有时会将地图中心定位在找到的目标上或将中心定位在鼠标所点击的图像上某一点。这时需要设置地图中心。设置地图中心的方法是setCenter()。下面的示例实现了将地图中心定位在鼠标点击的某一点。示例:/ 创建屏幕坐标的Point 对象screenpoint = new DoublePoint(event.getX(),event.getY(); / 将屏幕坐标转换为地理坐标worldpoint = myMap.transformScreenToNumeric(screenpoi

14、nt); / 设置地图中心myMap.setCenter(worldpoint); 3.3 设置地图边界地图边界不是图象的边界,而是地图坐标系的边界,所有的地图操作都在这个边界内进行。设置地图边界有两种方法:(1)方法 1 给定边界的左下角和右上角,设定边界。DoubleRect bounds = new DoubleRect(-180,-90,180,90); myMap.setBounds(bounds); (2)方法 2 给定地图的中心,宽度和高度,设定边界。DoubleRect bounds = new DoubleRect(new DoublePoint(0,0),360,180);

15、 myMap.setBounds(bounds); 3.4 设置地图投影坐标数据存储在servermapinfow.prj 文件中 ,包含上百种投影。可以按照如下方法,使用PRJ文件设置投影:String csProj = new String(Azimuthal Equidistant(North Pole), 5, 62, 7, 0, 90, 90); CoordSys ts = CoordSys.createFromPRJ(csProj); myMap.setDisplayCoordSys(ts); 也可以用 createFromMapBasic 读取 MapBasic 字符串来设置投影

16、。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 23 页 - - - - - - - - - 3.5 设置地图距离单位示例:distUnit = LinearUnit.kilometer; myMap.setDistanceUnits(distUnit); 3.6 添加图层使用 Layers.add 方法 (详见下一章 )向地图添加额外的图层,该图层可以来自文件或数据库。 MapXtreme 使用 DataProvider 来管理这些信息。4 专题三:怎样进行空间特征值

17、的搜索4.1 Search介绍有时可能做一些搜索,如搜索配送中心周围的零售店。MapXtreme提供了丰富的搜索功能。搜索的结果可以转换为被选中状态,从而显示在地图上。Search是 Layer 对象的方法,有:? searchAll ? searchWithinRadius ? searchWithinRegion ? searchWithinRectangle ? searchAtPoint ? searchByAttribute ? searchByPrimaryKey 使用这些查询都需要给出要返回的字段集合和执行的查询动作。返回的字段集合需要放在 Vector 对象中。下面的例子返回的

18、是表中所有的字段:/Assume myLayer is a Layer object. TableInfo myTableInfo = myLayer.getTableInfo( ); Vector columnNames = new Vector( ); int columnCount = myTableInfo.getColumnCount( ); String col; for (int j=0; j0,字段长度等问题,同时必须有权限修改数据库的这个表。MapXtreme Java 使用单独的事务处理对象编辑请求,如果请求成功马上向数据库提交,否则 rollback 。 如果使用addF

19、eatureSet, 则需要对Features集合中的每一个Feature 进行提交。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 23 页 - - - - - - - - - 在添加 Feature 或替换 Feature 时注意分配PrimaryKey 值。下面是针对Oracle8i Spatial ,IUS with SpatialWare DataBlade和 DB2 with Spatialware Extender的说明。Oracle8i Spatial 可

20、以使用自动分配或给定的值;PrimaryKey 的字段个数可以从1到 n;字段类型可以是整型或字符型;添加 Feature 是必须给定PrimaryKey ,替换时可选;在更新 Feature 时如果给定了PrimaryKey ,数据库将被更新,否则保持原值;提供给 Feature 的 PrimaryKey 会正确地赋值给数据库中的相应字段;使用 addFeature时如果执行成功,将返回PrimaryKey 。IUS with SpatialWare DataBlade IUS 仅识别 SW_MEMBER作为 PrimaryKey; PrimaryKey 的字段个数可以从1到 n;字段类型只

21、允许整型;使用 addFeature和 replaceFeature时都不用指定PrimaryKey ,即使指定了,也被忽略;SW-MEMBER会自动取最大值加1,描述 PrimaryKey 的字段如果不是SW_MEMBER根本就不会被设置;使用 addFeature时不会返回PrimaryKey 。DB2 with Spatial Extender PrimaryKey 由 Extender 设置;PrimaryKey 的字段个数可以从1到 n;字段类型只允许整型;使用 addFeature和 replaceFeature时都不用指定PrimaryKey ,即使指定了,也被忽略;如果没有指定

22、PrimaryKey ,就取 Primary 字段的最大值加一;使用 addFeature时如果执行成功,将返回PrimaryKey 。在向 JDBC 表图层添加Feature 时,按照MapJ 的 Numeric 投影进行, MapXtreme 可以进 行 相 应 的 投 影 转 换 。 在 创 建 图 层 时 , 在TableDescHelper中 如 果 指 定 了 保 存Feature Rendition 或 Label Rendition信息的字段,MapXtreme可以保存这些信息。另外,MapXtreme只能将Rendtion保存在RenditionType.mapxtreme格

23、式中,而不是保存在RenditionType.mapbasic 格式中,只能读。添加Feature(addFeature)时,如果Rendition 字段的类型是RenditionType.mapbasic, 保存时该字段将是null。若使用replaceFeature,上述字段将保留原值。6 专题五:怎样进行专题分析6.1 专题图概念使用专题地图可以将图层数据颜色、样式等形式表现在地图上,从而可以看到数据的分布发展趋势,这些是传统的数据报表所不能完成的。MapXtreme Java 支持如下几种专题图:1)OverrideTheme:可以改变整个图层的显示2)RangedTheme:按数据将

24、地图分组调整显示名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 23 页 - - - - - - - - - 3)IndividualvalueTheme :按数据调整每个图元显示4)SelectionTheme:控制选中图元的显示对于 RangedTheme 和 IndividualvalueTheme 可以生成对应于专题图的图例,图例会随专题的变化而更新。这两种专题可以通过AddTheme 向导 Bean 创建。和专题图相关有几个对象:ThemeList 通过 Lay

25、er 对象可以得到ThemeList,ThemeList 是一个集合,有添加、删除、排序等功能。一个图层可以有多个Theme 专题,如果它们是同一效果的专题(如都是填充)则只有最上面的专题决定地图的显示,也就是ThemeList 的最后一个。另外,一个图层不同效果的专题可以叠加在一起显示,例如,一个专题以不同颜色填充表现数据,另一个以不同图案 (如斜线)表示数据,则这两个专题都会在地图上显示。Theme 可以得到专题表现的字段或专题的名字。Rendition 可以控制专题的显示。6.2 创建不同类型专题图6.2.1 OverrideTheme 给一个 Rendition 就可以创建Overri

26、deTheme,如:/ Assume myLayer is a Layer object. / Assume myRend is a Rendition object. OverrideTheme myOTheme = new OverrideTheme(myRend,MyTheme); myLayer.getThemeList.add(myOTheme); 6.2.2 SelectionTheme 如下示例,将按点搜索的图元用红色显示:/ Assume layer as a Layer object Vector v = new Vector(); DoublePoint dp = new

27、DoublePoint(x, y); FeatureSet fs = null; / Select a feature at the specified location fs = layer.searchAtPoint(v, dp, null); / Create a SelectionTheme SelectionTheme selTheme = new SelectionTheme(PointSelection); / Create a Selection object, and add the selected features Selection sel = new Selectio

28、n(); sel.add(fs); / Assign the Selection object to the SelectionTheme selTheme.setSelection(sel); / Assign the display style of the SelectionTheme Rendition rend =RenditionImpl.getDefaultRendition(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 23 页 - - - -

29、- - - - - rend.setvalue(Rendition.FILL, Color.red); selTheme.setRendition(rend); / Add the SelectionTheme to the layers list of themes layer.getThemeList().add(selTheme) 6.2.3 RangedTheme 范围专题根据图层中数据的数值分成几个范围,然后将图元分为几组,每组有一个Rendition 控制图元的显示。MapXtreme 提供了一系列的对象用来控制范围专题。下面先介绍一个示例,然后介绍和范围专题相关的对象:示例:La

30、yer lyr=null; Rendition yellow=RenditionImpl.getDefaultRendition(); Rendition red=RenditionImpl.getDefaultRendition(); lyr = m_map.getLayers().getLayer(States.tab); String colName = Pop_1990; ColumnStatistics colStats =lyr.fetchColumnStatistics(colName); / Set number of breaks for data int numBreaks

31、=5; / Compute the distribution of data with 5 breaks and / Equal Ranges Vector rBreaks = BputeDistribution(numBreaks,colStats,Bucketer.DISTRIBUTION_TYPE_EQUAL_RANGES); / Set up a red and a yellow rendition and then / spread the colors yellow.setvalue(Rendition.FILL, Color.yellow); yellow.setvalue(Re

32、ndition.STROKE_WIDTH, 2); red.setvalue(Rendition.FILL, Color.red); red.setvalue(Rendition.STROKE_WIDTH, 4); Vector rends = LinearRenditionSpreader.spread(numBreaks, yellow, red); / Create Theme object RangedTheme rTheme = new RangedTheme(colName, rBreaks, rends, States by Pop_1990); / Get ThemeList

33、class object ThemeList tList=lyr.getThemeList(); / Add theme to Layers themeList tList.add(rTheme); 其中:ColumnStatistics 通过 fetchColumnStatistics 可以取得 ColumnStatistics 对象,该对象可以在使用Bucketer对象创建范围分割点时会用到。通过ColumnStatistics 对象可以得到数据的最大、最小和中间值,或者标准差等。Bucketer 该对象使用computeDistribution 来计算范围间的分割点。使用给方法时需要给出

34、范围总数、 ColumnStatistics 对象和范围分布的类型。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 23 页 - - - - - - - - - 范围分布的类型有以下几种:1)DISTRIBUTION_TYPE_EQUAL_COUNT(等个数)2)DISTRIBUTION_TYPE_EQUAL_RANGES(等范围)3)DISTRIBUTION_TYPE_STANDARD_DEVIATION(标准差):以中间值为中心将范围上下作标准差分布。RoundOf

35、f 给对象可以决定范围是从实际的字段数值靠着最小值还是最大值。LinearRenditionSpreader 范围专题显示时,需要用不同的颜色,的渐变表示这一情况。使用该对象的spread,给一个起始的Rendition 、最后一个Rendition 和范围数,中间每个范围的Rendition 会自动计算,最后spread返回一个 Rendition Vector 。自定义 RangedTheme 示例该示例自己定义Rendition,自己分割范围。/ Set up the ranges Vector rBreaks = new Vector(); rBreaks.addElement(new

36、 Attribute(1); rBreaks.addElement(new Attribute(5); rBreaks.addElement(new Attribute(7); / Set up the renditions Vector rends= new Vector(); rends.addElement(redRendition); rends.addElement(grayRendition); rends.addElement(greenRendition); / Create a ranged theme object RangedTheme rTheme = new Rang

37、edTheme(themeCol, rBreaks,rends, States by Pop_1994); / Assign theme to layers as element 1 myMap.getLayers().elementAt(1).getThemeList().add(rTheme); / Draw the map / Create an ImageRequestComposer ImageRequestComposer imageRC =ImageRequestComposer.create(myMap, 256, Color.blue,image/gif); / Create

38、 a MapXtremeImageRenderer MapXtremeImageRenderer renderer = new MapXtremeImageRenderer(http:/localhost:8080/mapxtreme40/servelet/mapxtreme;); / Render the map Renderer.render(imageRC); / Render the map to the file Renderer.toFile(comp.gif); 6.2.4 IndividualvalueTheme 示例:/ get a reference to the laye

39、r we will be applying theme to lyr = lyrs.add(dpr, ttdh, Territories); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 23 页 - - - - - - - - - / create a new theme object IndividualvalueTheme iValThm = new IndividualvalueTheme(CoverageTerritory, Sales Coverage B

40、reakdown); / create a rendition Rendition rend=RenditionImpl.getDefaultRendition(); / assign color to rendition add attribute to theme with previously set rendition rend.setvalue(Rendition.FILL, Color.red); iValThm.add(new Attribute(SouthWest), rend); / assign color to rendition add attribute to the

41、me with previously set rendition rend.setvalue(Rendition.FILL, Color.blue); iValThm.add(new Attribute(SouthEast), rend); / assign color to rendition add attribute to theme with previously set rendition rend.setvalue(Rendition.FILL, Color.green); iValThm.add(new Attribute(Central), rend); / Add the t

42、heme to layers theme list lyr.getThemeList().add(iValThm); / Store column name and type in hashtable Hashtable ht = new Hashtable(); ht.put(geomtype,IndividualvalueThemeLegend.REGION_GEOMETRY); ht.put(lableorder,IndividualvalueThemeLegend.ORDER_ASCENDING); / Create new legend passing theme and hasht

43、able. The set Theme Title. IndividualvalueThemeLegend iValThmLeg; iValThmLeg = new IndividualvalueThemeLegend(iValThm, ht); iValThmLeg.setTitle(Coverge Territory legend); / Generate gif image from legend iValThmLeg.toFile(c:tempterrLeg.gif, image/gif); 6.3 图例对于范围值和独立值专题图可以创建图例,并且可以修改图例的字体,标题等信息。 图例也

44、可以输出为一个栅格图文件,使用Bean 编程时也可以使用图例。每个专题图都有图例对象, 但只有范围值和独立值专题的图例对象不是空。如果要图例和专题图关联起来,需要调用 theme.setLegend。示例:/ Create Theme object / Assume rends as a Rendition object / Assume colName as a attributeName(String) / Assume rBreaks as a breakPoints Vector RangedTheme rTheme = new RangedTheme(colName,rBreaks,

45、 rends, States by Pop_1990); / Create a default legend RangedThemeLegend rThmLeg =rTheme.createDefaultLegend(null); / OR, Create a theme legend instance using theme and setting hashtable / Add theme settings to hashtable Hashtable ht = new Hashtable(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -

46、- - - - - 名师精心整理 - - - - - - - 第 13 页,共 23 页 - - - - - - - - - ht.put(geomtype,RangedThemeLegend.REGION_GEOMETRY); ht.put(lableorder,RangedThemeLegend.ORDER_ASCENDING); RangedThemeLegend rThmLeg = new RangedThemeLegend(rTheme, ht); / Set legend title rThmLeg.setTitle(Ranged Theme legend); / send leg

47、end to image file rThmLeg.toFile(c:temprangeLeg.gif, image/gif); 如果使用LegendContainerBean 可以将它放在VisualMapJ 中,图例都会显示在Bean 中,如果专题图改变,LegendContainerBean 中的图例也会调整。除了 专 题图 图例 外, 图 层中 的图 元 也有 一个 图例CatographicLegend , 可 以使 用com.mapinfo.legend.CatographicLegend 来创建。下面是一个示例:/ Assume mapJ is already initializ

48、ed Layer landmarks = mapJ.getLayers().getLayer(landmarks); / create the legend with title State Landmarks CartographicLegend legend = new CartographicLegend(StateLandmarks); / Perform a searchAll() on the layer to get its entire / FeatureSet - need to make sure we fetch the column that / we want to

49、label with in the legend Vector columns = new Vector(); columns.add(Name); FeatureSet fs = landmarks.searchAll(columns, null); / add the FeatureSet to the legend, and specify that we / want to label each features rendition with the value in the Name column legend.addFeatureSet(fs, Name); / always di

50、spose of FeatureSet once youre done with it! fs.dispose(); 6.4 专题图向导Bean 通过专题向导可以给当前地图里的图层创建范围值或独立值专题,现在支持为数字、 字符和日期型字段和点、线、面图层创建专题图,也可以创建一个默认的图例。通过Bean 还可以改变专题和图例的样式,范围划分等。 在同一个地图上的AddTheme Bean 和 VisualMapJ可以自动关联, 如果没有自动关联,可以使用 AddTheme Bean 的 setVisualMapJ(VisualMapJ)来指定。7 专题六: 怎样进行数据绑定-将数据库中的属性数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁