Google Maps API 2.0解析(9-GProjection GMercatorProjection关于投影坐标系统)
//投影坐标接口,不能实例化,而必须通过继承来使用
function GProjection()
{
}
//从经纬度转化为像素,a是一个GLatLng,b是缩放等级
GProjection.prototype.fromLatLngToPixel=function(a,b)
{
throw GMsg_Implement;
};
//从像素转化为经纬度,a是GPoint点,b是缩放等级,c如果为true,将不会强制将返回结果限制在-180~180之间
GProjection.prototype.fromPixelToLatLng=function(a,b,c)
{
throw GMsg_Implement;
};
//返回指定的图片序号是否在正常的范围之内,如果经度不在范围内,则转化为范围之内,如果纬度不再范围之内,则返回false
GProjection.prototype.tileCheckRange=function(a,b,c)
{
return true
};
//返回某一缩放等级下地图的横向像素宽度
GProjection.prototype.getWrapWidth=function(a)
{
throw GMsg_Implement;
};
//本对象继承了GProjection接口,代表莫卡托投影坐标,参数a代表缩放等级的个数
//缩放等级为0的时候,刚好可以将全球在宽度为128的图片上展示出来
function GMercatorProjection(a)
{
var b=this;
b.pixelsPerLonDegree=[];
b.pixelsPerLonRadian=[];
b.bitmapOrigo=[];
b.numTiles=[];
var c=256;
for(var d=0;d<a;d++)
{
var e=c/2;
b.pixelsPerLonDegree.push(c/360);
b.pixelsPerLonRadian.push(c/(2*GMath_PI));
b.bitmapOrigo.push(new GPoint(e,e));
b.numTiles.push(c);
c*=2
}
}
GMercatorProjection.prototype=new GProjection(); //指定继承GProjection接口
//实现fromLatLngToPixel方法
GMercatorProjection.prototype.fromLatLngToPixel=function(a,b)
{
var c=this;
var d=c.bitmapOrigo[b];
var e=getMathRound(d.x+a.lng()*c.pixelsPerLonDegree[b]);
var f=GetNumberInRange(Math.sin(getRadianByDegree(a.lat())),-0.9999,0.9999);
var g=getMathRound(d.y+0.5*Math.log((1+f)/(1-f))*-c.pixelsPerLonRadian[b]);
return new GPoint(e,g)
};
//实现fromPixelToLatLng方法
GMercatorProjection.prototype.fromPixelToLatLng=function(a,b,c)
{
var d=this;
var e=d.bitmapOrigo[b];
var f=(a.x-e.x)/d.pixelsPerLonDegree[b];
var g=(a.y-e.y)/-d.pixelsPerLonRadian[b];
var h=getDegreeByRadian(2*Math.atan(Math.exp(g))-GMath_PI/2);
return new GLatLng(h,f,c)
};
//实现tileCheckRange方法
GMercatorProjection.prototype.tileCheckRange=function(a,b,c)
{
var d=this.numTiles[b];
if(a.y<0||a.y*c>=d)
{
return false
}
if(a.x<0||a.x*c>=d)
{
var e=getMathFloor(d/c);
a.x=a.x%e;
if(a.x<0)
{
a.x+=e
}
}
return true
};
//实现getWrapWidth方法
GMercatorProjection.prototype.getWrapWidth=function(a)
{
return this.numTiles[a]
};
function GProjection()
{
}
//从经纬度转化为像素,a是一个GLatLng,b是缩放等级
GProjection.prototype.fromLatLngToPixel=function(a,b)
{
throw GMsg_Implement;
};
//从像素转化为经纬度,a是GPoint点,b是缩放等级,c如果为true,将不会强制将返回结果限制在-180~180之间
GProjection.prototype.fromPixelToLatLng=function(a,b,c)
{
throw GMsg_Implement;
};
//返回指定的图片序号是否在正常的范围之内,如果经度不在范围内,则转化为范围之内,如果纬度不再范围之内,则返回false
GProjection.prototype.tileCheckRange=function(a,b,c)
{
return true
};
//返回某一缩放等级下地图的横向像素宽度
GProjection.prototype.getWrapWidth=function(a)
{
throw GMsg_Implement;
};
//本对象继承了GProjection接口,代表莫卡托投影坐标,参数a代表缩放等级的个数
//缩放等级为0的时候,刚好可以将全球在宽度为128的图片上展示出来
function GMercatorProjection(a)
{
var b=this;
b.pixelsPerLonDegree=[];
b.pixelsPerLonRadian=[];
b.bitmapOrigo=[];
b.numTiles=[];
var c=256;
for(var d=0;d<a;d++)
{
var e=c/2;
b.pixelsPerLonDegree.push(c/360);
b.pixelsPerLonRadian.push(c/(2*GMath_PI));
b.bitmapOrigo.push(new GPoint(e,e));
b.numTiles.push(c);
c*=2
}
}
GMercatorProjection.prototype=new GProjection(); //指定继承GProjection接口
//实现fromLatLngToPixel方法
GMercatorProjection.prototype.fromLatLngToPixel=function(a,b)
{
var c=this;
var d=c.bitmapOrigo[b];
var e=getMathRound(d.x+a.lng()*c.pixelsPerLonDegree[b]);
var f=GetNumberInRange(Math.sin(getRadianByDegree(a.lat())),-0.9999,0.9999);
var g=getMathRound(d.y+0.5*Math.log((1+f)/(1-f))*-c.pixelsPerLonRadian[b]);
return new GPoint(e,g)
};
//实现fromPixelToLatLng方法
GMercatorProjection.prototype.fromPixelToLatLng=function(a,b,c)
{
var d=this;
var e=d.bitmapOrigo[b];
var f=(a.x-e.x)/d.pixelsPerLonDegree[b];
var g=(a.y-e.y)/-d.pixelsPerLonRadian[b];
var h=getDegreeByRadian(2*Math.atan(Math.exp(g))-GMath_PI/2);
return new GLatLng(h,f,c)
};
//实现tileCheckRange方法
GMercatorProjection.prototype.tileCheckRange=function(a,b,c)
{
var d=this.numTiles[b];
if(a.y<0||a.y*c>=d)
{
return false
}
if(a.x<0||a.x*c>=d)
{
var e=getMathFloor(d/c);
a.x=a.x%e;
if(a.x<0)
{
a.x+=e
}
}
return true
};
//实现getWrapWidth方法
GMercatorProjection.prototype.getWrapWidth=function(a)
{
return this.numTiles[a]
};
这次Google将坐标系统和地图类型也进行了分离,这样似乎就更灵活一点了,可以通过实现GProjection开发自己的坐标系统,不过,我觉得在Google现有的图片显示模式下,似乎不大可能太灵活,具体的地方我还没有看到,下面会继续学习。
posted on 2006-05-14 12:22 K_Reverter 阅读(1852) 评论(1) 编辑 收藏 举报