2015-05-24 4 views
1

С помощью геотекстов можно создать многоугольник из линии (коордов []) на определенном расстоянии? . (100 100), (101 100), (102 100) с расстоянием 1 км. Итак, из каждой точки он генерирует круг и становится sth. как:Создайте многоугольник из линии (координаты GPS) на заданном расстоянии (км) с геотаблицами в JAVA

-------------- Перед

(========) после того, как

Или я должен в первую очередь преобразовать GPS-координаты в ортогональной координаты в км, а затем генерирование многоугольника с использованием тригонометрических функций и, наконец, преобразование его обратно в GPS?

ответ

0

Да, это было бы возможно сделать без преобразования координат. Но если вы ищете определенные свойства, такие как прямолинейные, тогда может потребоваться преобразование координат.

2

В простейшем случае вам просто нужно вызвать метод буфера (расстояния) на основе геометрии JTS. Сложный бит обрабатывает перерисовку на и от проекции, которая находится в метрах (так что вы можете указать свой буфер в метрах или километрах).

public SimpleFeature bufferFeature(SimpleFeature feature, 
     Measure<Double, Length> distance) { 
    // extract the geometry 
    GeometryAttribute gProp = feature.getDefaultGeometryProperty(); 
    CoordinateReferenceSystem origCRS = gProp.getDescriptor() 
     .getCoordinateReferenceSystem(); 

    Geometry geom = (Geometry) feature.getDefaultGeometry(); 
    Geometry pGeom = geom; 
    MathTransform toTransform,fromTransform = null; 
    // reproject the geometry to a local projection 
    if (!(origCRS instanceof ProjectedCRS)) { 

     Point c = geom.getCentroid(); 
     double x = c.getCoordinate().x; 
     double y = c.getCoordinate().y; 

     String code = "AUTO:42001," + x + "," + y; 
     // System.out.println(code); 
     CoordinateReferenceSystem auto; 
     try { 
     auto = CRS.decode(code); 
     toTransform = CRS.findMathTransform(
      DefaultGeographicCRS.WGS84, auto); 
     fromTransform = CRS.findMathTransform(auto, 
      DefaultGeographicCRS.WGS84); 
     pGeom = JTS.transform(geom, toTransform); 
     } catch (MismatchedDimensionException | TransformException 
      | FactoryException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 

    } 

    // buffer 
    Geometry out = buffer(pGeom, distance.doubleValue(SI.METER)); 
    Geometry retGeom = out; 
    // reproject the geometry to the original projection 
    if (!(origCRS instanceof ProjectedCRS)) { 
     try { 
     retGeom = JTS.transform(out, fromTransform); 
     } catch (MismatchedDimensionException | TransformException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
    } 
    // return a new feature containing the geom 
    SimpleFeatureType schema = feature.getFeatureType(); 
    SimpleFeatureTypeBuilder ftBuilder = new SimpleFeatureTypeBuilder(); 
    ftBuilder.setCRS(origCRS); 
    //ftBuilder.setDefaultGeometry("buffer"); 
    ftBuilder.addAll(schema.getAttributeDescriptors()); 
    ftBuilder.setName(schema.getName()); 

    SimpleFeatureType nSchema = ftBuilder.buildFeatureType(); 
    SimpleFeatureBuilder builder = new SimpleFeatureBuilder(nSchema); 
    List<Object> atts = feature.getAttributes(); 
    for(int i=0;i<atts.size();i++) { 
     if(atts.get(i) instanceof Geometry) { 
     atts.set(i, retGeom); 
     } 
    } 
    SimpleFeature nFeature = builder.buildFeature(null, atts.toArray()); 
    return nFeature; 
    } 

Полный код находится на https://gist.github.com/ianturton/9a7cfee378e7072ec3cd, который показывает, как обрабатывать все это.