[英]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.