如何在JTS中交换来自Lat,Long到Long,Lat的jts.geom.Geometry对象的坐标

时间:2014-12-23 15:46:23

标签: java geotools jts

我有一个类型为(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");

另一种选择,我认为它不起作用。

谢谢!

5 个答案:

答案 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)

答案 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)。