|
在地图中添加空间地图图层首先要定义Layer。
1. 如何定义Layer(使用DataProvider) 定义Layer的关键是Data Provider。 Layer对象有一个内部的对象叫做Data Provider,它不是直接由用户创建的,但是它的描述确实定义一个图层。要描述Data Provider通过如下接口: • TableDescHelper – 描述数据 • DataProviderHelper – 定义数据的源 • DataProviderRef – 描述获取数据的方式 MapXtreme提供一系列DataProvider,可以读取如下类型的数据: • MapInfo tab format (.tab) • Oracle8i with Spatial Option • Informix Universal Server SpatialWare DataBlade • DB2 SpatialWare Extender • JDBC compatible tables containing longitude and latitude columns • GeoTIFF and MIGrid Raster • ESRI Shapefiles • Data Binding :可以将两种数据源的数据绑定在一起,在一个图层显示信息 • Annotation :信息不是实际的数据表,信息存在内存中 MapXtreme读取不同数据的示意图: 下面介绍如何描述DataProvider: n TableDescHelpers TableDescHelpers描述要读取哪些数据,对于不同数据源有相应的TableDescHelpers,TableDescHelpers用几个参数描述数据。 如:访问MapInfo Table 需要使用TABTableDescHelper,需要table 名字参数。对于Oracle8i数据需要使用OraSoTableDescHelper ,需要表名或SQL语句参数。后面的相关部分有示例代码。 n DataProviderHelpers DataProviderHelpers定义数据源。对于MapInfo Table来说,使用TABDataProviderHelper描述Table的数据源,源就是.tab文件所在的目录。Oracle8i的数据使用OraSoDataProviderHelper描述数据源,需要主机名、用户名、密码等。 n DataProviderRef 有两种方式获取数据:一种是直接方式,如MapJ通过JDBC连接数据库取得数据,需要使用LocalDataProviderRef;另一种是间接方式,通过MapXtremeServlet获取数据,需要使用MapXtremeDataProviderRef。 直接方式示意: 间接方式示意: 在这个示意图中MapJ处于客户端(Client),有一个名为stub的 DataProvider,真正描述数据的DataProvider由MapXtremeServlet创建。所有访问数据的组件可以放在中间层 MapXtremeServlet处,这样客户端就不必都安装JDBC驱动。这是一个典型的三次应用:应用,数据处理逻辑,数据存储。 注意:何时读取数据? 定义获创建Layer后,并不立即读取数据。只有有数据请求时,才真正到数据源读取数据,如:使用Layer的getTableInfo,使用search或响应render请求。 2. 添加Layer 添加图层分几步: 创建TableDescHelpers 创建DataProviderHelpers 创建DataProviderRef 使用Layers.add添加图层到最后一层或使用Layers.insert插入到某一个位置 下表总结了连接不同数据源时使用的DataProviderHelpers和TableDescHelper: Data Source TableDescHelper DataProvider MapInfo Tables TABTableDescHelper TABDataProviderHelper Oracle8i with Spatial Option OraSoTableDescHelper OraSoDataProviderHelper Informix Universal Server SpatialWare DataBlade IusSpwTableDescHelper IusSpwDataProviderHelper DB2 SpatialWare Extender Db2SpwTableDescHelper Db2SpwDataProviderHelper JDBC compatible tables containing longitude and latitude columns XYTableDescHelper XYDataProviderHelper Annotation Layers AnnotationTableDescHelper AnnotationDataProviderHelper GeoTIFF Raster GeoTIFFTableDescHelper GeoTIFFDataProviderHelper ESRI Shapefiles ShapeTableDescHelper ShapeDataProviderHelper Data Binding 1 DataBindingTableDescHelper DataBindingDataProviderHelper ImageIO * ImageIOTableDescHelper ImageIODataProviderHelper * 需要JDK1.4 下面是添加Oracle8i图层的示例。 Oracle8i Data Provider示例: // specify the url to the MapXtreme servlet which remotely connects us to the map //engine String mapXtremeURL = " http://localhost:8080/mapxtreme40/servlet/mapxtreme"; // Create the Remote Dataprovider needed to access the Data // Using pooled connections (Recommended) CommonDataProviderHelpers // Using Database specific DataProviderHelper OraSoDataProviderHelper oraSoDPHelper=new OraSoDataProviderHelper("databasename",1000, "DBsid","tester", "tester", DriverType.thin); // Create a String array with the name(s) of the column(s) to use as a unique key for records in the TableName String[] idColumn = {"S_MEMBER"}; // Now create a Table Desc helper // This code uses the Constructor required when using a tablename OraSoTableDescHelper oraSoTDHelper = new OraSoTableDescHelper("STATES", false, idColumn,"S_GEOMETRY", null,RenditionType.none, null,RenditionType.none, CoordSys.longLatWGS84, 2,"TESTER"); // This code uses the Constructor required when using a QueryOraSoTableDescHelper oraSoTDHelper = new OraSoTableDescHelper("Select S_MEMBER, S_GEOMETRY, POP_1990 From STATES Where STATE = 'NY'", idColumn,"S_GEOMETRY", null,RenditionType.none, null,RenditionType.none ,CoordSys.longLatWGS84, 2); // Create the Remote Dataprovider needed to access the Data MapXtremeDataProviderRef mxtDPRef = new MapXtremeDataProviderRef(oraSoDPHelper, mapXtremeURL); //assign it to MapJ - note getLayers() m_myMap.getLayers().add(mxtDPRef, oraSoTDHelper, "OraSoLayer");
|