1

我有一个类型的几何对象(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");

还有另一种选择,我没有看到它起作用。

谢谢!

4

5 回答 5

9

您可以使用 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());
于 2015-04-14T18:04:43.027 回答
3

解决方案是 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;
}

对坐标对象的更改将永久影响基础几何。

于 2014-12-23T16:54:54.690 回答
2

作为现有答案的重要附录:更改几何图形后,您应该始终调用 yourGeometry.geometryChanged() !

请参阅http://www.vividsolutions.com/jts/javadoc/com/vividsolutions/jts/geom/Geometry.html#getCoordinates%28%29http://www.vividsolutions.com/jts/javadoc/com/vividsolutions /jts/geom/Geometry.html#geometryChanged%28%29

于 2015-05-04T16:50:02.290 回答
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);

快乐编码,如果您有任何问题,请发表评论!

于 2014-12-23T16:11:16.130 回答
1

正如 JTS javadocs建议的那样,最好使用 aCoordinateSequenceFilter来更改几何图形的坐标。

/**
 * 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 从数据库中获取几何图形时,此 GeolattePackedPositionSequence序列实现不会让您修改坐标(afaik)。

于 2018-11-30T09:36:06.357 回答