WGS84到Google地图位置和返回的Java代码

问题描述:

搜索将WGS84坐标系中的点转换为Google地图中的地图位置(像素位置)的一些示例代码,同样支持缩放级别。WGS84到Google地图位置和返回的Java代码

如果代码评论得很好,那么它也可以是其他语言。

您还可以点我一个开源Java项目:)

发现的一些资源:

OpenLayer实施。

JOSM项目

优秀Java Map Projection Library从JH LABS。这是一个纯java PROJ.4端口。从WGS84投影到米。从那里转换米到像素是非常简单的。

Tile utility code in Java上mapki.com(对于谷歌地图开发者巨大的资源)

+2

我用wayback机器找到了它:http://web.archive.org/web/20110809084551/http://mapki.com/wiki/Tile_utility_code_in_Java – 2013-03-05 15:50:34

有人从谷歌地图拿着JavaScript代码,并将其移植到Python:gmerc.py

我用这个和它的伟大工程。

GeoTools的代码可以转换为任何您可以想象的坐标系,也可以转换为Google Map的坐标系。它也是开源的。但是,还应该指出的是,GeoTools是一个大型库,所以如果你看起来小巧,快速和简单,那很可能不是一条可行的路。

我强烈推荐它,但如果你要做其他GIS /坐标转换等。

如果使用GeoTools或类似的东西,你可能也有兴趣知道,谷歌地图坐标系统被称为EPSG 3785.

+0

新的URL为http:// www.geotools.org/ – Jan 2018-03-06 09:20:46

下面是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

我移植这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; 
    } 

} 
+0

我已经看到一些公式将W GS84到EPSG 3785,他们也问半球和时区(子午线)? – 2013-06-06 02:49:34