WGS84和谷歌地图位置之间的Java代码转换及反向转换

10

寻找一些示例代码,将WGS84坐标系中的点转换为Google Maps中的地图位置(像素位置),还支持缩放级别。

如果这些代码有良好的注释,那么也可以使用其他语言编写。

您还可以指向一个开源的Java项目:)

找到一些资源:

OpenLayer 实现。

JOSM 项目。

来自JH LABS的优秀Java地图投影库。 这是一个纯java PROJ.4端口。 它可以将WGS84投影到米。 从那里,将米转换为瓦片像素非常简单。

6个回答

5

以下是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比较简单。

5

2
我在Wayback Machine上找到了它:http://web.archive.org/web/20110809084551/http://mapki.com/wiki/Tile_utility_code_in_Java - Arthur Dent

3

GeoTools拥有转换到和从几乎任何你能想象到的坐标系的代码,其中也包括Google地图的。它也是开源的。然而,需要指出的是,GeoTools是一个庞大的库,因此如果你正在寻找某些小型、快速且易于使用的东西,那么这可能不是一个好选择。

然而,如果你还要进行其他GIS/坐标转换等操作,我强烈推荐使用它。

如果你使用GeoTools或类似工具,你可能也会对知道Google地图的坐标系统叫做EPSG 3785感兴趣。


2
我将这个转换为PHP代码 - 如果有人需要,下面是代码:
对于mercator:
$lon = ($lon * 20037508.34) / 180;
$lat = log(tan((90 + $lat) * M_PI / 360)) / (M_PI / 180);
$lat = $lat * 20037508.34 / 180;

来自Mercator:

$lon = ($lon / 20037508.34) * 180;
$lat = ($lat / 20037508.34) * 180;
$lat = 180/M_PI * (2 * atan(exp($lat * M_PI / 180)) - M_PI / 2);

1
/*
 * 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;
    }

}

我看过一些将WGS84转换为EPSG 3785的公式,它们还要求半球和时区(子午线)是什么? - Juan Diego
这个例子无法运行,例如 double[] c = MercatorTransform.forward(558832.516608631,180065.50201851176); 返回:7291651.346660811 2.3810769326496765E8。 - Jeryl Cook

0

有人将Google Maps的JavaScript代码移植到Python中:gmerc.py

我使用过它,效果非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接