Javaで、地表の位置を緯度、経度からUTMに変換する方法を知っている人はいますか(WGS84など)? 私は現在 Geotools を見ていますが、残念ながら解決策は明らかではありません。
5 に答える
いくつかのサンプル コードに基づいて、Geotools 2.4 を使用して機能するものを取得できました。
double utmZoneCenterLongitude = ... // Center lon of zone, example: zone 10 = -123
int zoneNumber = ... // zone number, example: 10
double latitude, longitude = ... // lat, lon in degrees
MathTransformFactory mtFactory = ReferencingFactoryFinder.getMathTransformFactory(null);
ReferencingFactoryContainer factories = new ReferencingFactoryContainer(null);
GeographicCRS geoCRS = org.geotools.referencing.crs.DefaultGeographicCRS.WGS84;
CartesianCS cartCS = org.geotools.referencing.cs.DefaultCartesianCS.GENERIC_2D;
ParameterValueGroup parameters = mtFactory.getDefaultParameters("Transverse_Mercator");
parameters.parameter("central_meridian").setValue(utmZoneCenterLongitude);
parameters.parameter("latitude_of_origin").setValue(0.0);
parameters.parameter("scale_factor").setValue(0.9996);
parameters.parameter("false_easting").setValue(500000.0);
parameters.parameter("false_northing").setValue(0.0);
Map properties = Collections.singletonMap("name", "WGS 84 / UTM Zone " + zoneNumber);
ProjectedCRS projCRS = factories.createProjectedCRS(properties, geoCRS, null, parameters, cartCS);
MathTransform transform = CRS.findMathTransform(geoCRS, projCRS);
double[] dest = new double[2];
transform.transform(new double[] {longitude, latitude}, 0, dest, 0, 1);
int easting = (int)Math.round(dest[0]);
int northing = (int)Math.round(dest[1]);
座標の変換は、実際には数行のコードで実行できます。
Coordinate coordinate = new Coordinate(x, y);
MathTransform transform = CRS.findMathTransform(CRS.decode("EPSG:4326"), CRS.decode("EPSG:3857"), false);
JTS.transform(coordinate, coordinate, transform);
これにより、経度/緯度座標 (EPSG:4326) が Web メルカトル図法 (EPSG:3857) 座標に変換されます。
ビルド ツール (maven など) で次の 2 つの GeoTools ライブラリに依存する必要があります。
<repositories>
<repository>
<id>osgeo</id>
<name>Open Source Geospatial Foundation Repository</name>
<url>http://download.osgeo.org/webdav/geotools/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
</dependencies>
この回答は、gis.stackexchange.comの質問/回答に基づいています。ここでの現在の回答は非常に冗長であるように思われるため、返信を投稿しました。
このプロジェクトhttps://github.com/Berico-Technologies/Geo-Coordinate-Conversion-Java/を使用して、jitpack を使用して既存の pom.xml に追加できます。
UTM 座標 (30N、これは 30 ゾーンと北半球) を緯度と経度に変換することに成功しました。以下の私の例を参照してください。
public void setPunto(Point punto) {
this.punto = punto;
LatLon latlon = UTMCoord.locationFromUTMCoord(30, AVKey.NORTH, punto.getX(), punto.getY());
this.latitud = latlon.getLatitude().degrees;
this.longitud = latlon.getLongitude().degrees;
}
Point クラスは com.vividsolutions.jts.geom.Point クラス タイプであることに注意してください。
私のプロジェクトでは、Ahmed TahaのライブラリLatLongLibを使用しています。座標を UTM システムから緯度経度システムに、またはその逆に変換するのは非常に簡単だと思います。クラス UTMUtils、UTMPoint、LatLonPoint をいじるだけです。
以前、私もJcoordを選択することを検討しました。それも簡単で、要点がわかりました。ただし、WGS84 楕円体を使用する必要があり、当時は LatLongLib だけがその機能を持っているようでした。