使用JAVA中的geotools从定义距离(km)内的线(GPS坐标)生成多边形

Posted

技术标签:

【中文标题】使用JAVA中的geotools从定义距离(km)内的线(GPS坐标)生成多边形【英文标题】:Generate a polygon from a line(GPS coordinate) in a defined distance(km) with geotools in JAVA 【发布时间】:2015-05-24 18:30:41 【问题描述】:

使用 geotools 是否有可能从定义距离内的线 (coords[]) 生成多边形? 例如。 (100,100), (101,100), (102,100) 距离 1 公里。 所以从每一点它生成一个圆圈并变成某事。喜欢:

-------------之前

(========) 之后

或者我必须先将 GPS 坐标转换为以 km 为单位的正交坐标,然后使用三角函数生成多边形,最后再将其转换回 GPS?

【问题讨论】:

【参考方案1】:

最简单的是,您只需在底层 JTS 几何体上调用 buffer(distance) 方法。棘手的一点是处理与以米为单位的投影之间的重投影(因此您可以以米或公里为单位指定缓冲区)。

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,它展示了如何处理整个事情。

【讨论】:

【参考方案2】:

是的,这绝对可以在不转换坐标的情况下这样做。但是,如果您正在查看某些属性,例如直线,则可能需要进行坐标转换。

【讨论】:

以上是关于使用JAVA中的geotools从定义距离(km)内的线(GPS坐标)生成多边形的主要内容,如果未能解决你的问题,请参考以下文章

java geotools

java 利用工具包Geotools实现不同坐标系之间坐标转换

java 利用工具包Geotools实现不同坐标系之间坐标转换

以km c#计算两个地理点的距离

GeoTools的AStar算法实现,自定义Node及Edge

将 ECQL 从 geotools 转换为 SQL