配色: 字号:
最全面的百度地图JavaScript离线版开发
2016-09-10 | 阅:  转:  |  分享 
  
最全面的百度地图JavaScript离线版开发



项目要求web版百度地图要离线开发。这里总结下自己的开发过程和经验。



大概需求是:每辆车上安装有公司接收机,会实时反馈车辆的坐标、速度、转向等信息,接收到各车辆信息后在百度地图上实时画出车辆位置。作业点不一定都有网络,所以要求离线开发。



此过程主要有三个技术点:



1.如何获取离线的API



2.如何获取离线瓦片图



3.如何在离线状态下将WGS坐标转换成百度地图坐标



解决问题过程:



1.既然百度地图官方不支持离线地图,那么我们需要想办法把在线的代码改成离线的代码。



这里可以参考:http://my.oschina.net/smzd/blog/548538



这里整理好了一份,其中也按照示例Demo写了一份离线的Demo。当然离线的不可能做到和在线一样完美,毕竟还是有些功能用不了的。(此版本是基于百度地图APIV2.0)







使用方法:



复制代码

1.确定你用的瓦片的图片后缀,如.png,.jpg。修改baidumap_offline_v2_load.js中的imgext

varbdmapcfg={

''imgext'':''.jpg'',//瓦片图的后缀------根据需要修改,一般是.png.jpg

''tiles_dir'':''''//瓦片图的目录,为空默认在baidumap_v2/tiles/目录

};



2.确定你用的瓦片的目录,默认在baidumap_v2/tiles/目录下,你也可以改成其他地址。修改baidumap_offline_v2_load.js中的tiles_dir



3.参考demo编写代码,要点如下:

1)只需要加载load文件



2)加载css文件(貌似可不需要)



3)定义个放置地图的容器,并用css控制高度和宽度



4)书写js代码



//百度地图API功能

varmap=newBMap.Map("map_demo");//创建Map实例

map.centerAndZoom(newBMap.Point(116.404,39.915),8);//初始化地图,设置中心点坐标和地图级别

//map.addControl(newBMap.MapTypeControl());//添加地图类型控件离线只支持电子地图,卫星/三维不支持

//map.setCurrentCity("北京");//设置地图显示的城市离线地图不支持!!

map.www.wang027.comenableScrollWheelZoom(true);//开启鼠标滚轮缩放

map.addControl(newBMap.NavigationControl());//缩放按钮



复制代码

2.获取瓦片图



这里可以参考:http://my.oschina.net/smzd/blog/619397



当然网上也有下载工具,比如:全能电子地图下载器



3.直接将接收机接收到的坐标(WGS)放入百度地图中是有偏差的,这是因为百度地图为了安全做了特殊处理。其Web服务API中提供了坐标转换API,但是它是以HTTP形式提供的坐标转换接口,所以说还是无法脱离网络。这里通过一些专业的知识将WGS坐标转GCJ,再将GCJ坐标转BD百度坐标,经验证精确度几乎算很准确的了。



复制代码

publicclassCoorConvertUtil{

//圆周率

staticdoublepi=3.14159265358979324;

//卫星椭球坐标投影到平面坐标系的投影因子

staticdoublea=6378245.0;

//椭球的偏心率

staticdoubleee=0.00669342162296594323;

//圆周率转换量

publicfinalstaticdoublex_pi=3.141592653589793243000.0/180.0;



publicstaticdouble[]wgs2bd(doublelat,doublelon){

double[]wgs2gcj=wgs2gcj(lat,lon);

double[]gcj2bd=gcj2bd(wgs2gcj[0],wgs2gcj[1]);

returngcj2bd;

}



/

GCJ坐标转百度坐标

@paramlat

@paramlon

@return

/

publicstaticdouble[]gcj2bd(doublelat,doublelon){

doublex=lon,y=lat;

doublez=Math.sqrt(xx+yy)+0.00002Math.sin(yx_pi);

doubletheta=Math.atan2(y,x)+0.000003Math.cos(xx_pi);

doublebd_lon=zMath.cos(theta)+0.0065;

doublebd_lat=zMath.sin(theta)+0.006;

returnnewdouble[]{bd_lat,bd_lon};

}



publicstaticdouble[]bd2gcj(doublelat,doublelon){

doublex=lon-0.0065,y=lat-0.006;

doublez=Math.sqrt(xx+yy)-0.00002Math.sin(yx_pi);

doubletheta=Math.atan2(y,x)-0.000003Math.cos(xx_pi);

doublegg_lon=zMath.cos(theta);

doublegg_lat=zMath.sin(theta);

returnnewdouble[]{gg_lat,gg_lon};

}



/

WGS坐标转GCJ坐标

@paramlat

@paramlon

@return

/

publicstaticdouble[]wgs2gcj(doublelat,doublelon){

doubledLat=transformLat(lon-105.0,lat-35.0);

doubledLon=transformLon(lon-105.0,lat-35.0);

doubleradLat=lat/180.0pi;

doublemagic=Math.sin(radLat);

magic=1-eemagicmagic;

doublesqrtMagic=Math.sqrt(magic);

dLat=(dLat180.0)/((a(1-ee))/(magicsqrtMagic)pi);

dLon=(dLon180.0)/(a/sqrtMagicMath.cos(radLat)pi);

doublemgLat=lat+dLat;

doublemgLon=lon+dLon;

double[]loc={mgLat,mgLon};

returnloc;

}



privatestaticdoubletransformLat(doublelat,doublelon){

doubleret=-100.0+2.0lat+3.0lon+0.2lonlon+0.1latlon+0.2Math.sqrt(Math.abs(lat));

ret+=(20.0Math.sin(6.0latpi)+20.0Math.sin(2.0latpi))2.0/3.0;

ret+=(20.0Math.sin(lonpi)+40.0Math.sin(lon/3.0pi))2.0/3.0;

ret+=(160.0Math.sin(lon/12.0pi)+320Math.sin(lonpi/30.0))2.0/3.0;

returnret;

}



privatestaticdoubletransformLon(doublelat,doublelon){

doubleret=300.0+lat+2.0lon+0.1latlat+0.1latlon+0.1Math.sqrt(Math.abs(lat));

ret+=(20.0Math.sin(6.0latpi)+20.0Math.sin(2.0latpi))2.0/3.0;

ret+=(20.0Math.sin(latpi)+40.0Math.sin(lat/3.0pi))2.0/3.0;

ret+=(150.0Math.sin(lat/12.0pi)+300.0Math.sin(lat/30.0pi))2.0/3.0;

returnret;

}



/

度分转度

@paramlat纬度ddmm.mmmm

@paramlon经度dddmm.mmmm

@return

/

publicstaticdouble[]dufen2du(Stringlat,Stringlon){

doublelatD=Double.parseDouble(lat.substring(0,2));

doublelatM=Double.parseDouble(lat.substring(2));

doublelatNew=latD+www.wang027.comlatM/60;

doublelonD=Double.parseDouble(lon.substring(0,3));

doublelonM=Double.parseDouble(lon.substring(3));

doublelonNew=lonD+lonM/60;

returnnewdouble[]{latNew,lonNew};

}

}

献花(0)
+1
(本文系thedust79首藏)