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

使用JAVA中的geotools从定义距离(km)内的直线(GPS坐标)生成多边形,java,gps,geolocation,gis,geotools,Java,Gps,Geolocation,Gis,Geotools,使用geotools,是否可以从定义距离内的直线(坐标[])生成多边形? 例如(100100),(101100),(102100),距离为1km。 因此,从每个点开始,它生成一个圆,并变成如下: --------------以前 (==========)之后 或者我必须先把GPS坐标转换成以千米为单位的正交坐标,然后用三角函数生成一个多边形,最后再把它转换成GPS 是的,这绝对可以在不转换坐标的情况下实现。但是,如果要查看某些属性,例如直线,则可能需要进行坐标转换。最简单的方法是,只需对底层JT

使用geotools,是否可以从定义距离内的直线(坐标[])生成多边形? 例如(100100),(101100),(102100),距离为1km。 因此,从每个点开始,它生成一个圆,并变成如下:

--------------以前

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


或者我必须先把GPS坐标转换成以千米为单位的正交坐标,然后用三角函数生成一个多边形,最后再把它转换成GPS

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

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

公共SimpleFeature缓冲区功能(SimpleFeature功能, 测量距离){ //提取几何体 GeometryAttribute gProp=feature.getDefaultGeometryProperty(); CoordinateReferenceSystem origCRS=gProp.getDescriptor() .getCoordinateReferenceSystem(); 几何图形几何图形=(几何图形)特征。getDefaultGeometry(); 几何图形pGeom=几何图形; MathTransform-toTransform,fromTransform=null; //将几何体重新投影到局部投影 如果(!(项目CRS的原始CRS实例)){ 点c=geom.getCentroid(); double x=c.getCoordinate().x; 双y=c.getCoordinate().y; 字符串代码=“自动:42001,”+x+,“+y; //System.out.println(代码); 自动协调参考系统; 试一试{ 自动=CRS.解码(代码); toTransform=CRS.findMathTransform( 默认地理位置(CCRS.WGS84,自动); fromTransform=CRS.findMathTransform(自动, (CCRS.WGS84); pGeom=JTS.变换(geom,toTransform); }捕获(不匹配DimensionException | TransformException |工厂(e){ //TODO自动生成的捕捉块 e、 printStackTrace(); } } //缓冲区 几何输出=缓冲区(pGeom,距离.双值(SI.米)); 几何retGeom=输出; //将几何体重新投影到原始投影 如果(!(项目CRS的原始CRS实例)){ 试一试{ retGeom=JTS.transform(out,fromTransform); }捕获(不匹配的DimensionException | TransformException e){ //TODO自动生成的捕捉块 e、 printStackTrace(); } } //返回包含几何图形的新特征 SimpleFeatureType架构=feature.getFeatureType(); SimpleFeatureTypeBuilder ftBuilder=新SimpleFeatureTypeBuilder(); ftBuilder.SETCR(原始GCR); //ftBuilder.setDefaultGeometry(“缓冲区”); ftBuilder.addAll(schema.getAttributeDescriptors()); ftBuilder.setName(schema.getName()); SimpleFeatureType nSchema=ftBuilder.buildFeatureType(); SimpleFeatureBuilder=新SimpleFeatureBuilder(nSchema); List atts=feature.getAttributes(); for(int i=0;i)表示如何处理整个问题

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