簡體   English   中英

如何在JTS中從緯度,經度到經度,緯度交換jts.geom.Geometry對象的坐標

[英]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);

祝您編程愉快,如果有任何疑問,請留下評論!

正如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM