【问题标题】:Best way to convert JTS Geometry from 3D to 2D将 JTS Geometry 从 3D 转换为 2D 的最佳方法
【发布时间】:2013-11-13 19:41:31
【问题描述】:

我们正在使用 JTS Geometry Suite、GeoTools (ShapefileDataStore) 和 Hibernate Spatial 将具有 3D 坐标的多多边形 Shapefile 导入到 oracle 空间中。在 Oracle Spatial 中,我们希望它们以 2D 形式存储。

我发现的 onyl(非常慢)方法如下,使用 WKBWriter 和 WKBReader:

private static Geometry convert2D(Geometry geometry3D) {
    // create a 2D WKBWriter
    WKBWriter writer = new WKBWriter(2);
    byte[] binary = writer.write(geometry3D);
    WKBReader reader = new WKBReader(factory);
    Geometry geometry2D= null;
    try {
        geometry2D= reader.read(binary);
    } catch (ParseException e) {
        log.error("error reading wkb", e);
    }
    return geometry2D;
}

有人知道将几何图形从 3D 转换为 2D 的更有效方法吗?

【问题讨论】:

    标签: geospatial geotools jts hibernate-spatial


    【解决方案1】:

    我找到了办法:

    1. 创建一个新的CoordinateArraySequence 强制使用二维Coordinate 实例
    2. 创建一个新的CoordinateArraySequenceFactory,它会生成新的自定义CoodinateArraySequence
    3. 创建一个新的 GeometryFactory 实例,它使用新的 CoordinateFactory 并使用它重新创建几何:

      private static Geometry convert2D(Geometry geometry3D) {
          GeometryFactory geoFactory = new GeometryFactory(
              geometry3d.getPrecisionModel(), geometry3d.getSRID(), CoordinateArraySequence2DFactory.instance());
          if (geometry3D instanceOf Point) {
             return geoFactory.createPoint(geometry3D.getCoordinateSequence());
          } else if (geometry3D instanceOf Point) {
          //...  
          //...
          //...
          throw new IllegalArgumentException("Unsupported geometry type: ".concat(geometry3d.getClass().getName());
      }
      

    祝你好运!

    【讨论】:

      【解决方案2】:

      我没有测试WKBWriterWKBReader 但这是另一种简单的方法:

      • 创建几何的副本
      • 将所有坐标设置为二维

      简单代码:

      private static Geometry convert2D(Geometry g3D){
          // copy geometry
          Geometry g2D = (Geometry) g3D.clone();
          // set new 2D coordinates
          for(Coordinate c : g2D.getCoordinates()){
              c.setCoordinate(new Coordinate(c.x, c.y));
          }
          return g2D;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-11
        • 2013-03-28
        • 2017-09-04
        • 1970-01-01
        相关资源
        最近更新 更多