当前位置:首页 > 网站应用

关于google map api中的球平投影算法接口

webgou17年前 (2009-10-10)网站应用170

偷懒了一个月,今天终于重新修改了mapeasy中的球平算法应用。
以前的mapeasy中使用google map data的例子不能正确使用经纬度,现在终于可以了。

google map api中有个很有用的接口:GProjection,官方对这个接口的解释是:
    This is the interface for map projections. A map projection instance is passed to the constructor of GMapType. This interface is implemented by the class GMercatorProjection, which is used by all predefined map types. You can implement this interface if you want to define map types with different map projections.

    这个接口最大的作用,就是允许你使用自己的球平算法去投影地图,其中的fromPixelToLatLng()和fromPixelToLatLng()非常重要,他们表示了从经纬度和pixel之间的转换算法。
 
   google做了一个默认的实现GMercatorProjection,使用的是麦卡托算法,google map提供的地图数据,就是根据这个算法投影转换而来的。
   如果你需要使用自己的投影地图,记得一定要自己实现GProjection接口。
 
   google使用的麦卡托算法很有意思,它并没有把整个地球都投影出来,只能投影纬度在85度内的地图。也就是说,最北极和最南极的那部分(纬度85以上),在google地图中是找不到的:)
  
    你可以运行一下这句代码:
alert(map.getCurrentMapType().getProjection().fromLatLngToPixel(new GLatLng(85,0),map.getZoom()));
   你会发现,对应的Y坐标就是0了:)

    如果运行:
alert(map.getCurrentMapType().getProjection().fromLatLngToPixel(new GLatLng(90,0),map.getZoom()));
    那么,Y坐标将为负数:)

    如果你只是希望使用google实现好的麦卡托算法,你还可以直接绕过GMap类,直接使用GMercatorProjection类:
    var zoom=17;
    var latLan=new  GLatLng(85,180);
    var gm=new GMercatorProjection(zoom+1);
    var x=gm.fromLatLngToPixel(latLan,zoom).x;
    var y=gm.fromLatLngToPixel(latLan,zoom).y;

   而后,你就可以把得到的x,y转换成自己应用的坐标系中的坐标。例如,在我的mapeasy中,坐标系范围是x:[-180,180], y:[-90,90],因此我使用如下的代码进行坐标转换:
/**
 * @param lat 经度
 * @param lan 纬度
 * @param zoom 放大比例
  */
function GoogleMapLatLan(lat,lan,zoom){
    this.lat=lat;
    this.lan=lan;
    this.zoom=zoom;
}

GoogleMapLatLan.prototype.fromLatLngToMapEasyPoint=function(){
   var latLan=new GLatLng(this.lat,this.lan);
     var zoom=this.zoom;

    var gm=new GMercatorProjection(zoom+1);

    //merX,merY:根据google提供的Mercator算法算出来的Pixel的
    var merX=gm.fromLatLngToPixel(latLan,zoom).x;
    var merY=gm.fromLatLngToPixel(latLan,zoom).y;

   //google使用的麦卡托投影法,并没有把整个地球投影出来,只是投影出纬度在85度以内的地球,也就是说,北纬85度的点,就是最北边的点。而最北极和最南极的那部分地图(纬度85以上),在google提供的地图中是找不到的:)
       //在zome=0时,如果地图的左上角的点对应的纬经度为:(85,-180),右下角对应的纬经度为(-85,180),此时,使用google提供的Mercator算法算出来的对应的坐标系 范围为:x[0,256],y[0,256],

    //坐标系的放大倍数
    var scale=Math.pow(2,zoom);
   
    var merXMin=0;
    var merXMax=256*scale;
     var merYCenter=128*scale;

    //meX,meY:MapEasyPoint中的x,y
    //MapEasy默认的坐标系范围为x:[-180,180],y:[-90,90],因此需要进行转换
    var meX=((merX-merXMin)-(merXMax-merXMin)/2)*180/((merXMax-merXMin)/2);
    var meY=(merYCenter-merY)*90/merYCenter;

    return new Point(meX,meY);
};

GoogleMapLatLan.prototype.getPoint=function(){
    return this.fromLatLngToMapEasyPoint();
}

    这次写这段代码,才发现google中GLatLan类的distanceFrom(other)函数,实现了计算两个经纬坐标间距离(米为单位)的算法,简单试用了一下,还8错。

     忘了交代 了,我参考的google map api的版本是maps2.48.api.js

 btw:
    今天还是偷懒,没有仔细研究GMercatorProjection的实现代码,留给team中有空的伙伴去研究吧。
    这儿有个Mercator不错的说明:http://en.wikipedia.org/wiki/Mercator_projection

   有兴趣的朋友可以来逛逛http://mapeasy.sf.net。项目问题还好多,包括javascript的memory leakage至今也还没去解决。项目组的成员最近都好忙,也不知道有没有朋友有兴趣加入的。 

[from:http://www.blogjava.net/tim-wu/archive/2006/05/11/45464.html]

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=50

标签: google
分享给朋友:

“关于google map api中的球平投影算法接口” 的相关文章

Thunderbird 最小化到系统托盘

下载地址:https://addons.mozilla.org/zh-CN/thunderbird/addon/12581 3.0 下载地址是:https://addons.mozilla.org/zh-CN/thunderbird/addon/5462 2.0…

zblog-模板文件与模板标签

首页与列表页相关模板 default.html 首页主模板文件catalog.html 列表页模板文件1)b_article-multi.html 摘要文章模板b_article-istop.html 置顶文章模板2)b_pagebar.html 页面底部分页条模板,可以改分页条样式 日…

复制Craigslist:“58同城”们的中国路径

导读:创始人Craig不设销售部,不拉广告,不要VC一分钱,创立了如日中天但又“不想长大”的美国生活信息门户网站Craigslist,中国同行们能够从中学到什么? 2010年4月,58同城对外宣布获得DCM和软银赛富的1500万美元融资;两个月之后,赶集网也对外宣布获得诺基亚…

使用 Gmail 拨打国内电话,通话双方均免费的方法

我们知道使用 Gmail 给美国和加拿大拨打电话是完全免费的,现在 Google 则再一次震撼到了我们!只要使用 Gmail 拨打国内电话,通话双方均全部免费! 操作的步骤如下: 1、确保登录 Gmail 后可以看到在 Chat 列表中看到 "Call phone"按钮。这有2个…

iphone使用全攻略

iphone使用全攻略…

在Z-Blog中添加广告的详细方法

在每一篇文章的正文添加广告,主要是修改TEMPLATE文件夹里的b_article-single.html模板。这一句是文张正文部分,</div> 前边直接添加广告代码就可以了,但这样并不好管理,建议用一下介绍的方法。zblog是div+css构架,我们可以在css里随意控制广告的显示位…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。