使用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实现不同坐标系之间坐标转换