[英]How to Swap Coordinates of jts.geom.Geometry object from Lat, Long to Long,Lat in JTS
我有一个类型为(com.vividsolutions.jts.geom.Geometry)的几何对象。 它目前是经度,纬度形式,我想翻转坐标,使其经度纬度,以便可以将其以GeoJSON格式用于mongodb。
我看到的约束是:a)我想翻转坐标的输入是一个Geometry对象。 b)几何对象将是多边形类型或多多边形。 c)我想在将类型强制转换为Polygon / multipolygon之前翻转坐标
我已经尝试过geo.reverse(),但是它不起作用。
同样,我尝试使用:CRSAuthorityFactory factory = CRS.getAuthorityFactory(true); CoordinateReferenceSystem crs = factory.createCoordinateReferenceSystem(“ EPSG:4326”);
和另一个选择,我没有看到它的工作。
谢谢!
您可以使用CoordinateFilter反转给定几何图形中的所有x和y值。
private static class InvertCoordinateFilter implements CoordinateFilter {
public void filter(Coordinate coord) {
double oldX = coord.x;
coord.x = coord.y;
coord.y = oldX;
}
}
然后按以下方式应用过滤器:
// Invert Coordinates since GeoJSON likes them that way
myGeometryObj.apply(new InvertCoordinateFilter());
解决方案是Geometry.getCoordinates()提供了一个实时的Coordinate []数组。 因此,我可以使用以下内容:
其中myGeometryObject是Geometry对象:
Coordinate[] original = myGeometryobject.getCoordinates();
for(int i = 0; i < original.length; i++){
Double swapValue = original[i].x;
original[i].x = original[i].y;
original[i].y = swapValue;
}
对“坐标”对象的更改将永久影响基础几何。
一种可能的解决方案是扩展类,以提供一个附加功能,该功能可以通过一些便捷的方式输出所需的数据:
public Coordinate[] getReversedCoordinates(){
Coordinate[] original = this.getCoordinates();
Coordinate[] ret = new Coordinate[original.length];
for(int i =0; i<original.length; i++){
ret[i] = new Coordinate( original[i].x , original[i].y );
}
return ret;
}
或者,您可以更改数据的解释。 我很难为您提供一个代码段,因为我不确定您是如何使用这些信息的。
编辑:
一旦有了反向坐标,就可以创建线性环类型的重复几何。 一种方法是使用工厂使用几何工厂:
GeometryFactory gf = //However this was instantiated;
Coordinate[] reversedCoordinates = getReversedCoordinates();
gf.createLinearRing(reversedCoordinates);
祝您编程愉快,如果有任何疑问,请留下评论!
作为现有答案的重要附录:更改几何图形后,应始终调用yourGeometry.geometryChanged()!
请参阅http://www.vividsolutions.com/jts/javadoc/com/vividsolutions/jts/geom/Geometry.html#getCoordinates%28%29和http://www.vividsolutions.com/jts/javadoc/com/vividsolutions /jts/geom/Geometry.html#geometryChanged%28%29
正如JTS javadocs所建议的那样,最好使用CoordinateSequenceFilter
来更改几何的坐标。
/**
* Swaps the XY coordinates of a geometry.
*/
public void swapCoordinates(Geometry g) {
g.apply(new CoordinateSequenceFilter() {
@Override
public void filter(CoordinateSequence seq, int i) {
double oldX = seq.getCoordinate(i).x;
seq.getCoordinate(i).x = seq.getCoordinate(i).y;
seq.getCoordinate(i).y = oldX;
}
@Override
public boolean isGeometryChanged() {
return true;
}
@Override
public boolean isDone() {
return false;
}
});
}
注意:在某些讨厌的情况下,您可以访问的Coordinate
对象是内部存储的副本 (例如,参见PackedCoordinateSequence
)。 在这种情况下,如javadocs中建议的那样,您必须使用提供的setter,即setX() setY() 。
甚至在更糟糕的情况下,也根本无法更改坐标,例如。 当使用PostGIS从数据库中获取几何图形时,此Geolatte PackedPositionSequence
序列实现只是不允许您修改坐标(afaik)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.