您的位置:首页 > 编程语言 > Go语言

Google Map API学习记录

2011-10-11 11:57 309 查看
去年年底用GoogleMapAPI做了一个GIS系统,以下简称GMA,初看GMA的时候感觉写GMA工程师确实挺强的,把Javascript运用的如火纯清,不愧是全球顶尖的公司;

下面我就把我平时遇到的问题,总结一下,顺便做个记录备忘一下,如果在这能发现解决你问题的解决方案,那就更好!

1,限制地图的缩放级别

我们知道GMA的地图的缩放级别是1-20,如果我们只是让用户在4-15范围内操作地图,那怎么办呢?下面就是一个解决方案!

//限制缩放级别

//Min

G_PHYSICAL_MAP.getMinimumResolution=
function(){
return_zoomMinLevel;};

G_NORMAL_MAP.getMinimumResolution=
function(){
return_zoomMinLevel;};

G_SATELLITE_MAP.getMinimumResolution=
function(){
return_zoomMinLevel;};

G_HYBRID_MAP.getMinimumResolution=
function(){
return_zoomMinLevel;};

//Max

G_PHYSICAL_MAP.getMaximumResolution=
function(){
return_zoomMaxLevel;};

G_NORMAL_MAP.getMaximumResolution=
function(){
return_zoomMaxLevel;};

G_SATELLITE_MAP.getMaximumResolution=
function(){
return_zoomMaxLevel;};

G_HYBRID_MAP.getMaximumResolution=
function(){
return_zoomMaxLevel;};

2,绑定鼠标右键操作

我们在用Google地图查某一个地方的时候,如果你右击鼠标,就会出现一个菜单,包含一些“以此为出发点”、“以此为终点”、“放大”、“缩小”等操作,那我们怎么实现定义自己的右键操作呢?当时为了实现这个功能,还费了好长时间。不多说了,直接看代码:

/*InitGoogleMapMouseRightContextMenuStart*/
functioninitializeGoogleMapContextMenu(){
/*contextMenu*/
_contextMenu=document.createElement("div");
$(_contextMenu).css({display:"none"});
varcontextMenuImage=document.createElement("img");
$(contextMenuImage).css({cursor:"pointer"});
$(contextMenuImage).click(clickContextMenuEvent);
contextMenuImage.src="/images/btn_mouse_right_upload.png";
_contextMenu.appendChild(contextMenuImage);
map.getContainer().appendChild(_contextMenu);

//BindEvent

GEvent.addListener(map,"singlerightclick",function(pixel,tile){
_contextMenuClickPixel=pixel;
varx=_contextMenuClickPixel.x;
vary=_contextMenuClickPixel.y;

if(x>map.getSize().width-120){x=map.getSize().width-120}
if(y>map.getSize().height-100){y=map.getSize().height-100}
//判断是否登陆

if(!checkLogin()){
alert("请先登录,在上传视频");
return;
}
//设置菜单位置

varpos=newGControlPosition(G_ANCHOR_TOP_LEFT,newGSize(x,y));
pos.apply(_contextMenu);
displayContextMenu();
});
}
functionclickContextMenuEvent(){
//Googlemapapi内置像素转坐标函数

varpoint=map.fromContainerPixelToLatLng(newGPoint(_contextMenuClickPixel.x,_contextMenuClickPixel.y));
var_params={
lat:point.lat(),
lng:point.lng()
};
//弹出一个窗口

varmyHtml=createIframeHtml(310,310,"upload.aspx",_params);
map.openInfoWindowHtml(point,myHtml)
}
//显示菜单

functiondisplayContextMenu(){
$(_contextMenu).show();
//点击任意位置,隐藏菜单

$(document).one('click',hideContextMenu);
}
//隐藏菜单

functionhideContextMenu(){
$(_contextMenu).hide();
}
/*InitGoogleMapMouseRightContextMenuEnd*/


我们在初始化GoogleMap的时候,直接调用initializeGoogleMapContextMenu()方法就行了,其中,我的右键菜单只是一张图片,你可以根据你的实际情况,任意设计。

3,自定义GroundOverlay

GMA中有一个GGroundOverlay类,用它可以在地图上任意位置贴图或划线,但是当我用它贴雷达图或云图的时候,发现它老是给我把位置贴错,我的雷达图或云图首先根据当前视窗获得西南角和东北角两个点的坐标以及中心点的坐标,然后计算出当前视窗对应的最大维度值和最小维度值,来生成雷达图或云图,最后把生成的雷达图或云图贴在当前的视窗口上。实验了好几次,用它老是给我贴错,好像是把我的图给我缩小了。

实在没有办法了,就索性按照GMA的教程写了一个,虽然我感觉他给出的例子和他内置的应该一样,但是用自己写的就可以正确的贴上去,十分不解!

//GISGroundOverlay
functionGISGroundOverlay(imageUrl,bounds,opacity){
this.imageUrl_=imageUrl;
this.bounds_=bounds;
this.opacity_=opacity||1;
this.overlayImgId_="__groundoverlay_img";
}
GISGroundOverlay.prototype=newGOverlay();
GISGroundOverlay.prototype.initialize=function(map){
varpane=map.getPane(G_MAP_MAP_PANE);
$(pane).empty();
vardiv=document.createElement("div");
div.style.position="absolute";
varimg=document.createElement("img");
img.id=this.overlayImgId_;
img.src=this.imageUrl_;
$(img).css({"opacity":this.opacity_});
if(this.imageUrl_){
$(div).append(img);
}
pane.appendChild(div);

this.div_=div;
this.map_=map;
this.img_=img;
}
GISGroundOverlay.prototype.setOverlayImage=function(src){
if(src){
$("#"+this.overlayImgId_).attr("src",src);
}
}
GISGroundOverlay.prototype.remove=function(){
if(this.div_.parentNode)
this.div_.parentNode.removeChild(this.div_);
}
GISGroundOverlay.prototype.copy=function(){
returnnewGISOverlay(this.bounds_);
}
GISGroundOverlay.prototype.setOpacity=function(opacity){
$(this.img_).css({"opacity":opacity});
}
GISGroundOverlay.prototype.redraw=function(force){
if(!force)return;

//CalculatetheDIVcoordinatesoftwooppositecornersofourboundsto
//getthesizeandpositionofourrectangle
varc1=this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());
varc2=this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());
varwidth=Math.abs(c2.x-c1.x);
varheight=Math.abs(c2.y-c1.y);
varleft=Math.min(c2.x,c1.x);
vartop=Math.min(c2.y,c1.y);

//NowpositionourDIVbasedontheDIVcoordinatesofourbounds

this.div_.style.width=width+"px";
this.div_.style.height=height+"px";
this.div_.style.left=left+"px";
this.div_.style.top=top+"px";
}



下面列出一些Googlemapapi的参考站点:

http://econym.org.uk/gmap/

http://maps.forum.nu/
http://koti.mbnet.fi/ojalesa/exam/index.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: