2008-08-11 70 views
7

搜索將WGS84座標系中的點轉換爲Google地圖中的地圖位置(像素位置)的一些示例代碼,同樣支持縮放級別。WGS84到Google地圖位置和返回的Java代碼

如果代碼評論得很好,那麼它也可以是其他語言。

您還可以點我一個開源Java項目:)

發現的一些資源:

OpenLayer實施。

JOSM項目

優秀Java Map Projection Library從JH LABS。這是一個純java PROJ.4端口。從WGS84投影到米。從那裏轉換米到像素是非常簡單的。

回答

4

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

0

有人從谷歌地圖拿着JavaScript代碼,並將其移植到Python:gmerc.py

我用這個和它的偉大工程。

3

GeoTools的代碼可以轉換爲任何您可以想象的座標系,也可以轉換爲Google Map的座標系。它也是開源的。但是,還應該指出的是,GeoTools是一個大型庫,所以如果你看起來小巧,快速和簡單,那很可能不是一條可行的路。

我強烈推薦它,但如果你要做其他GIS /座標轉換等。

如果使用GeoTools或類似的東西,你可能也有興趣知道,谷歌地圖座標系統被稱爲EPSG 3785.

+0

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

3

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

2

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

} 
+0

我已經看到一些公式將W GS84到EPSG 3785,他們也問半球和時區(子午線)? – 2013-06-06 02:49:34