本文介绍了使用JAVA中的geotools从线(GPS坐标)以定义的距离(公里)生成多边形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用geotools是否有可能从定义距离内的线(coords [])生成多边形?例如.(100,100),(101,100),(102,100),距离为1公里.因此,从每个点开始,它都会生成一个圆并变为sth.像:

With geotools would it be possible that generating a polygon from a line (coords[]) in a defined distance?E.g. (100,100), (101,100), (102,100) with distance 1km.So from each point it generates a circle and becomes sth. like:

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

-------------- before

(=========)

(========) after

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

Or I have to firstly convert GPS coordinates into orthogonal coordinates in km, and then generating a polygon using Trigonometric functions, and finally, convert it back into GPS?

推荐答案

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

At it's simplest you simply need to call the buffer(distance) method on the underlying JTS geometry. The tricky bit is handling the reprojection to and from a projection which is in meters (so you can specify your buffer in meters or kilometers).

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

The full code is at https://gist.github.com/ianturton/9a7cfee378e7072ec3cd which shows how to handle the whole thing.

这篇关于使用JAVA中的geotools从线(GPS坐标)以定义的距离(公里)生成多边形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-11 02:27