使用标准的格式:WKT、WKB和GML(1)
2014-05-29 23:20
916 查看
7.2.4 使用标准的格式:WKT、WKB和GML(1)
在第5章中我们讨论了能够在SDO_GEOMETRY类型和开放地理信息系统联盟(OGC)定义的标准格式之间进行转换的PL/SQL函数和方法。OGC的标准格式有:WKT(熟知文本)、WKB(熟知二进制)和GML(地理标识语言)。我们将对怎样在Java中执行这些转换做简要解释。
对这些格式进行操作的类都在oracle.spatial.util包中。SdoExport.java和SdoImport.java程序(可以从Apress站点下载)对WKT、WKB和GML格式的读写提供了功能齐全的例子。
1. 对WKT的读写
WKT格式是对几何体编码的一个结构化文本格式。它最初被设计为在不同环境间交换几何体的一种标准方法。点在WKT中可以被编码为:
一个简单多边形可以编码为:
我们将使用oracle.spatial.util包中WKT类的fromJGeometry()方法将JGeometry对象转换为WKT格式。注意,这个方法将生成一个字节数组,在将其写入到文件前,需要把它转换成一个字符串。如下所示:
也可以用WKT类中的toJGeometry方法把WKT字符串转回为JGeometry对象。这个方法的输入也是一个字节数组。过程如下所示:
警告:
WKT和WKB格式没有提供任何的机制用来表示几何投影;也就是说,在将几何体转换成另一种格式时,这类信息将丢失。如果想保留这些信息,需要单独对其进行处理,同时用setSRID()方法把它回添到几何体中。
2. 对WKB的读写
顾名思义,WKB编码就是把几何体以二进制的方式编码,是一种比WKT更紧凑的格式。它的使用方法与前面的处理相似。WKB类中的fromJGeometry()方法也产生一个字节数组,你可以把该数组写到文件中。我们将向你展示怎样将其写入java DataOutputStream(在例子中称为ds)中,以便以便携的方式写入原始Java数据类型。
首先把JGeometry转换为WKB。这将产生一个字节数组。然后把字节数组的大小和几何体的SRID写入输出流。最后以适当的方式写入字节数组。
注意,ByteOrder.BIG_ENDIAN参数表明要使用的二进制编码的类型:大尾段(big endian)或小尾段(litle endian)。默认生成大尾段编码。你需要使其与用来处理WKB工具所接受的编码相适应。注意,其中选择的编码方法本身是在二进制结果的第一个字节被标记的。
用WKB类中的toJGeometry()方法可以把WKB转换成JGeometry对象。这个方法仍用字节数组作为输入。下面的例子展示了这个过程。假设我们从先前的文件中读取数据,首先读取WKB的长度,然后读取几何体的SRID。接下来读取重建WKB所需的字节数。最后把WKB转换为JGeometry对象并用setSRID方法把SRID写回。
我们不需要指定将要使用的二进制编码的格式(大尾段或小尾段),因为toJGeometry()方法能够自动对编码进行识别并可以对两者进行透明的处理。
在第5章中我们讨论了能够在SDO_GEOMETRY类型和开放地理信息系统联盟(OGC)定义的标准格式之间进行转换的PL/SQL函数和方法。OGC的标准格式有:WKT(熟知文本)、WKB(熟知二进制)和GML(地理标识语言)。我们将对怎样在Java中执行这些转换做简要解释。
对这些格式进行操作的类都在oracle.spatial.util包中。SdoExport.java和SdoImport.java程序(可以从Apress站点下载)对WKT、WKB和GML格式的读写提供了功能齐全的例子。
1. 对WKT的读写
WKT格式是对几何体编码的一个结构化文本格式。它最初被设计为在不同环境间交换几何体的一种标准方法。点在WKT中可以被编码为:
POINT(-111.870478 33.685992)
一个简单多边形可以编码为:
POLYGON ((-119.308006 37.778061,..., -119.308006 37.778061))
我们将使用oracle.spatial.util包中WKT类的fromJGeometry()方法将JGeometry对象转换为WKT格式。注意,这个方法将生成一个字节数组,在将其写入到文件前,需要把它转换成一个字符串。如下所示:
// Create a WKT processor WKT wkt = new WKT(); ... // Convert the geometry to WKT String s = new String(wkt.fromJGeometry(geom));
也可以用WKT类中的toJGeometry方法把WKT字符串转回为JGeometry对象。这个方法的输入也是一个字节数组。过程如下所示:
// Create a WKT processor WKT wkt = new WKT(); ... // Convert the WKT to geometry JGeometry geom = wkt.toJGeometry(s.getBytes());
警告:
WKT和WKB格式没有提供任何的机制用来表示几何投影;也就是说,在将几何体转换成另一种格式时,这类信息将丢失。如果想保留这些信息,需要单独对其进行处理,同时用setSRID()方法把它回添到几何体中。
2. 对WKB的读写
顾名思义,WKB编码就是把几何体以二进制的方式编码,是一种比WKT更紧凑的格式。它的使用方法与前面的处理相似。WKB类中的fromJGeometry()方法也产生一个字节数组,你可以把该数组写到文件中。我们将向你展示怎样将其写入java DataOutputStream(在例子中称为ds)中,以便以便携的方式写入原始Java数据类型。
首先把JGeometry转换为WKB。这将产生一个字节数组。然后把字节数组的大小和几何体的SRID写入输出流。最后以适当的方式写入字节数组。
// Create a WKB processor WKB wkb = new WKB(ByteOrder.BIG_ENDIAN); ... // Convert JGeometry to WKB byte[] b = wkb.fromJGeometry(geom); // First write the number of bytes in the array ds.writeInt(b.length); // Then write the SRID of the geometry ds.writeInt(geom.getSRID()); // Then write the binary array ds.write(b);
注意,ByteOrder.BIG_ENDIAN参数表明要使用的二进制编码的类型:大尾段(big endian)或小尾段(litle endian)。默认生成大尾段编码。你需要使其与用来处理WKB工具所接受的编码相适应。注意,其中选择的编码方法本身是在二进制结果的第一个字节被标记的。
用WKB类中的toJGeometry()方法可以把WKB转换成JGeometry对象。这个方法仍用字节数组作为输入。下面的例子展示了这个过程。假设我们从先前的文件中读取数据,首先读取WKB的长度,然后读取几何体的SRID。接下来读取重建WKB所需的字节数。最后把WKB转换为JGeometry对象并用setSRID方法把SRID写回。
// Create a WKB processor WKB wkb = new WKB(); ... // Read the size of the byte array int n = ds.readInt(); // Read the SRID of the geometry int srid = ds.readInt(); // Read the byte array that contains the WKB byte[] b = new byte ; int l = ds.read (b, 0, n); // Convert to JGeometry geom = wkb.toJGeometry(b); // Add the SRID geom.setSRID(srid);
我们不需要指定将要使用的二进制编码的格式(大尾段或小尾段),因为toJGeometry()方法能够自动对编码进行识别并可以对两者进行透明的处理。
相关文章推荐
- 地理空间数据格式——OGC简单要素标准(WKT/WKB)
- 使用Google学术自动生成标准的参考文献格式(Word版+LaTex版)
- 使用FileSystem以标准输出格式显示HDFS当中的文件
- 使用jackson将java对象转换成标准的json格式,便于与easyui的datagrid交互
- spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
- Hadoop学习----直接使用FileSystem以标准输出格式显示Hadoop文件系统中的文件
- 直接使用FileSystem以标准输出格式显示hadoop文件系统中的文件
- 使用jacksonjava对象转换成标准的json格式,便于与easyui...
- 使用Google学术自动生成标准的参考文献格式:
- spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
- Hive 使用RegexSerDe来处理标准格式Apache Web日志
- Hive 使用RegexSerDe来处理标准格式Apache Web日志
- Hive 使用RegexSerDe来处理标准格式Apache Web日志
- Hadoop实验:用java直接使用FileSystem以标准输出格式显示Hadoop文件系统中的文件
- 使用Google学术自动生成标准的参考文献格式(Word版+LaTex版)
- 使用jsp实现word、excel格式报表打印
- [转载][Boost]如何将UNIX风格时间转换为标准格式
- 使用IFormattable接口为自定 4000 义类定义格式字符串
- 使用ADO.net转换数据到Excel格式并提供下载
- 使用jsp实现word、excel格式报表打印