ESRI shapefile格式是进行地理数据传输的流行格式。在第2章中,曾用了一个简单的命令行工具对shapefile进行转换并把它们加载到空间表中。现在要展示的是怎样在Java中对它进行读写。为此,将要用到Oracle.spatial.util包中的一些类。如果仅需把ESRI shapefile加载到数据库表中,那么Oracle.spatial.util就能够满足需求。调用其中的SampleShapefile-ToJGeomFeature类并向它传递合适的参数即可。该类将创建表,加载该表并在USER_SDO_GEOM_METADATA中插入合适的元数据。
7.2.6.1 对shapefile的简单说明
每个shapefile至少由三个文件构成,它们的文件名都相同,只是扩展名互不相同。
xxx.shp:这个文件中保存了对实际几何体的定义。
xxx.shx:在形状上的空间索引。
xxx.dbf:一个dBASE文件,包含每个几何体的属性。
有些shapefile中也有其他一些文件,如xxx.prj或xxx.sbn。这些都会被Oracle Spatial Java类所忽略。在为shapefile命名的时候不要包含.shp扩展名。所有组成同一个shapefile的文件都应该被存储在同一个目录下。
7.2.6.2 在程序中加载shapefile
Oracle.spatial.util包中包含了三个可以用来在程序中读取和加载shapefile的类。表7-9是对它们的总结。
表7-9 Shapefile处理类
下面的例子展示了怎样使用shapefile处理类,把shapefile加载器合并到应用中。首先打开输入文件并设置辅助类。要注意的是,shapeFileName中包含的是没用扩展名的shapefile名称。
然后,提取shapefile的维度,也就是在文件中所有维度上的几何体坐标的最大值和最小值。(www.xing528.com)
现在,可以构建空间元数据了。getDimArray()方法将根据shapefile中数据的限制和维度来生成合适的元数据定义。注意,在使用该方法的一个特殊现象:X维和Y维上的最大值和最小值必须以字符串的形式传递,Z维和M维上的最大值和最小值以数字的形式传递。代码如下:
接下来,就可以在数据库中创建表了。该方法会先删除已经存在的表,然后用合适的Oracle数据类型(与DBF文件中的属性类型都相匹配)创建一个新表。它也会向USER_SOD_GEOM_METADATA中插入空间数据元素。指定SDO_GEOMETRY列的名称(geoColumn),该列将在加载的过程中被自动填充序列号:
现在,可以从shapefile中把数据加载到刚刚创建的数据库表中了。insertFeatures方法有很多参数:列标识名(idColumn)、起始数据值(firstId)、提交的频率(commitFrequency)和载入期间打印进度消息的频率(printFrequency)。
最后,记得关闭输入文件:
7.2.6.3 构建自定义加载器
如果想要更大的灵活性,如选择要加载的属性、对其重命名或在加载前对几何体进行一些处理,就可以使用ShapefileReaderJGeom和DBFReaderJGeom类中较低层次的方法。表7-10和表7-11对它作了总结。
表7-10 ShapefileReaderJGeom方法
表7-11 DBFReaderJGeom方法
使用这些方法可以从DBF文件中提取属性的名称、类型和属性大小。根据获得的信息,在创建数据表时就有了充分的灵活性。以下代码展示了如何把DBF数据类型等价地映射到Oracle中。
可以很容易地创建相应的表。仅向CREATE TABLE语句添加属性名称就可以实现。代码如下:
最后,通过循环向数据库中读取和插入数据,以便对SHP和DBF记录逐个地进行获取和处理。假设已经构建并准备了相应的INSERT语句,每个待填充的列都有一个绑定变量。代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。