WGS84 到 Google 地图位置和返回的 Java 代码
Posted
技术标签:
【中文标题】WGS84 到 Google 地图位置和返回的 Java 代码【英文标题】:Java code for WGS84 to Google map position and back 【发布时间】:2010-09-05 16:17:59 【问题描述】:正在搜索一些示例代码,用于将 WGS84 坐标系中的点转换为 Google 地图中的地图位置(像素位置),也支持缩放级别。
如果代码有很好的注释,那么它也可以是其他语言。
你也可以指点我一个开源的 Java 项目:)
找到一些资源:
OpenLayer 实现。
JOSM项目
来自 JH LABS 的优秀 Java Map Projection Library 。这是一个纯 java PROJ.4 端口。从 WGS84 投影到米。从那里将米转换为平铺像素非常简单。
【问题讨论】:
【参考方案1】:Tile utility code in Java on mapki.com(谷歌地图开发者的绝佳资源)
【讨论】:
我用回程机找到的:web.archive.org/web/20110809084551/http://mapki.com/wiki/…【参考方案2】:这里是 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 相当简单
【讨论】:
【参考方案3】:GeoTools 有代码可以在你能想象到的任何坐标系之间转换,其中还有谷歌地图。它也是开源的。但是,还应该指出的是,GeoTools 是一个大型库,所以如果您正在寻找小型、快速和简单的东西,那么它可能不是正确的选择。
如果您还要进行其他 GIS/坐标转换等,我强烈推荐它。
如果您使用 GeoTools 或类似工具,您可能还想知道 Google 地图坐标系称为 EPSG 3785。
【讨论】:
【参考方案4】:我将它移植到 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);
【讨论】:
【参考方案5】:/*
* 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 的公式,他们还要求提供半球和时区(子午线)? 这不起作用例如 double[] c = MercatorTransform.forward(558832.516608631,180065.50201851176);返回:7291651.346660811 2.3810769326496765E8【参考方案6】:有人从 Google 地图中获取了 javascript 代码并将其移植到 python:gmerc.py
我用过这个,效果很好。
【讨论】:
以上是关于WGS84 到 Google 地图位置和返回的 Java 代码的主要内容,如果未能解决你的问题,请参考以下文章
经纬度之间互相转换(高德转百度,高德转wgs84,百度转高德,百度转wgs84,wgs84转百度,wgs84转高德)