WGS84 から Google マップの位置に戻るための Java コード
-
08-06-2019 - |
質問
WGS84 座標系の点を Google マップの地図位置 (ピクセル位置) に変換するためのサンプル コードを検索します。ズーム レベルもサポートしています。
コードに適切なコメントが付いている場合は、他の言語でも構いません。
オープンソースの Java プロジェクトを教えてもらうこともできます :)
いくつかのリソースが見つかりました:
オープンレイヤー 実装。
ジョズム プロジェクト
素晴らしい Java地図投影ライブラリ JH LABSより。これは純粋な Java PROJ.4 ポートです。WGS84 からメートルへの投影を行います。そこから、メートルをタイル ピクセルに変換するのは非常に簡単です。
解決
Java のタイル ユーティリティ コード mapki.com 上 (Google マップ開発者向けの優れたリソース)
他のヒント
JavaSCriptの関数は次のとおりです...OpenLayers から抜粋
function toMercator (lon, lat) {
var x = lon * 20037508.34 / 180;
var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
y = y * 20037508.34 / 180;
return [x, y];
}
function inverseMercator (x, y) {
var lon = (x / 20037508.34) * 180;
var lat = (y / 20037508.34) * 180;
lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
return [lon, lat];
}
Java への変換は非常に簡単
ジオツール には、想像できるあらゆる座標系と相互に変換するコードが含まれており、その中には Google マップのものも含まれます。これもオープンソースです。ただし、GeoTools は 大きい ライブラリなので、小さくて早くて簡単なものを探している場合は、おそらくそれは適さない方法です。
ただし、他の GIS/座標変換などを行う場合には、これを強くお勧めします。同じように。
GeoTools などを使用している場合は、Google マップの座標系が EPSG 3785 と呼ばれることも知りたいかもしれません。
これを PHP に移植しました。必要な人のためにコードを示します。
メルカトル図法に:
$lon = ($lon * 20037508.34) / 180;
$lat = log(tan((90 + $lat) * M_PI / 360)) / (M_PI / 180);
$lat = $lat * 20037508.34 / 180;
メルカトル図法から:
$lon = ($lon / 20037508.34) * 180;
$lat = ($lat / 20037508.34) * 180;
$lat = 180/M_PI * (2 * atan(exp($lat * M_PI / 180)) - M_PI / 2);
/*
* Utility functions to transform between wgs84 and google projection coordinates
* Derived from openmap http://openmap.bbn.com/
*/
public class MercatorTransform {
public final static double NORTH_POLE = 90.0;
public final static double SOUTH_POLE = -NORTH_POLE;
public final static double DATELINE = 180.0;
public final static double LON_RANGE = 360.0;
final public static transient double wgs84_earthEquatorialRadiusMeters_D = 6378137.0;
private static double latfac = wgs84_earthEquatorialRadiusMeters_D;
private static double lonfac = wgs84_earthEquatorialRadiusMeters_D;
final public static transient double HALF_PI_D = Math.PI / 2.0d;
/**
* Returns google projection coordinates from wgs84 lat,long coordinates
*/
public static double[] forward(double lat, double lon) {
lat = normalizeLatitude(lat);
lon = wrapLongitude(lon);
double latrad = Math.toRadians(lat);
double lonrad = Math.toRadians(lon);
double lat_m = latfac * Math.log(Math.tan(((latrad + HALF_PI_D) / 2d)));
double lon_m = lonfac * lonrad;
double[] x = { lon_m, lat_m };
return x;
}
/**
* Returns wgs84 lat,long coordinates from google projection coordinates
*/
public static float[] inverse(float lon_m, float lat_m) {
double latrad = (2d * Math.atan(Math.exp(lat_m / latfac))) - HALF_PI_D;
double lonrad = lon_m / lonfac;
double lat = Math.toDegrees(latrad);
double lon = Math.toDegrees(lonrad);
lat = normalizeLatitude(lat);
lon = wrapLongitude(lon);
float[] x = { (float) lat, (float) lon };
return x;
}
private static double wrapLongitude(double lon) {
if ((lon < -DATELINE) || (lon > DATELINE)) {
lon += DATELINE;
lon = lon % LON_RANGE;
lon = (lon < 0) ? DATELINE + lon : -DATELINE + lon;
}
return lon;
}
private static double normalizeLatitude(double lat) {
if (lat > NORTH_POLE) {
lat = NORTH_POLE;
}
if (lat < SOUTH_POLE) {
lat = SOUTH_POLE;
}
return lat;
}
}
誰かが Google マップから JavaScript コードを取得して Python に移植しました。 gmerc.py
私はこれを使用しましたが、とてもうまくいきました。