我有一个类型为(com.vividsolutions.jts.geom.Geometry)的几何对象。它目前处于纬度,经度形式,我想翻转坐标使其经度纬度,以便我可以使用GeoJSON格式为mongodb。
我看到的约束是: a)我想要翻转坐标的输入是Geometry对象。 b)Geometry对象可以是Polygon类型或Multipolygon。 c)我想在类型转换为多边形/多边形
之前翻转坐标我尝试过geo.reverse()但它不起作用。
同样,我尝试过使用: CRSAuthorityFactory factory = CRS.getAuthorityFactory(true); CoordinateReferenceSystem crs = factory.createCoordinateReferenceSystem(" EPSG:4326");
另一种选择,我认为它不起作用。
谢谢!
答案 0 :(得分:8)
您可以使用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());
答案 1 :(得分:2)
解决方案是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;
}
对Coordinate对象的更改将永久影响基础Geometry。
答案 2 :(得分:1)
一个可能的解决方案是扩展该类以提供一个额外的功能,以便以某种方便的方式输出您需要的数据:
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);
如果您有任何问题,请尽快编码并发表评论!
答案 3 :(得分:1)
作为现有答案的重要附录:在更改几何体的几何体后,应始终调用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
答案 4 :(得分:1)
如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中建议的那样,您必须使用提供的设置器,即 setX() setY()。
甚至在更恶劣的情况下,也根本无法更改坐标,例如。在使用PostGIS从数据库中获取几何图形时,此Geolatte PackedPositionSequence
序列实现只是不允许您修改坐标(afaik)。