2013-11-13 2 views
1

Мы импортируем многопользовательский файл Shapefile с 3D-координатами в пространственный оракул с использованием JTS Geometry Suite, GeoTools (ShapefileDataStore) и Hibernate Spatial. В Oracle Spatial мы хотим, чтобы они хранились в 2D.Лучший способ конвертировать JTS Geometry из 3D в 2D

онил (и очень медленно) подход, который я нашел, заключается в следующем, используя 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?

ответ

0

Я нашел способ:

  1. Создать новую CoordinateArraySequence, которое заставляет использовать 2D Coordinate экземпляры
  2. Создать новую CoordinateArraySequenceFactory, который генерирует новый пользовательский CoodinateArraySequence
  3. Создать новый экземпляр GeometryFactory который использует новый CoordinateFactory и использует его для recreate геометрия:

    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()); 
    } 
    

Удачи!

0

Я не проверял WKBWriter и WKBReader, но вот еще один простой подход:

  • Создать копию вашей геометрии
  • Установите все координаты в 2D

Простой код:

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; 
} 
Смежные вопросы