百度地图的全景地图实现的过程

最近要弄百度,实现web上地图拖动标注,停下来的时候,搜索地图位置上的全景图。用户点击全景图后,进入全景模式。

这个需求看上去很简单。但是也费了我大半天的功夫。

主要问题是

1. 百度地图没有完整的例子

2. 百度地图的全景图在PC web 和移动 web 实现方式不一样

3. 百度地图的API 文档,个人感觉写得一般。

OK,不总结那么多了。声明下,我这个是用v2.0 版本的JS API。

首先,直接拿官方的例子

http://developer.baidu.com/map/jsdemo.htm#j1_0

这个例子很简单,具体代码就不说了。但是,这里有一个坑,就是PC上出现 下面红框所示的标注和Info窗口。 放到移动手机上就没了。

本以为是代码写错,但是最后了解到,PC上用的是Flash技术。 移动手机用的是JS技术。估计移动手机的js技术有Bug吧。

没办法了,只能自己画Marker,添加Label了。但是怎么根据经纬读,获取这个位置上的全景信息呢?

原来有这个对象

var panoramaService = new BMap.PanoramaService();

panoramaService.getPanoramaByLocation(new BMap.Point(lng, lat), function(data){
var panoramaInfo="";
if (data == null) {
$("#myDesc").html("");
return;
}
myData = data;
panoramaInfo +=‘全景id为:‘+data.id+‘\n‘;
panoramaInfo +=‘坐标为:‘+data.position.lng+‘:‘+data.position.lat+‘\n‘;
//alert(panoramaInfo);
getImg(data);
});

另外一个问题,又如何获取全景静态图片呢?

查了半天,原来有 "全景静态图API" (http://lbsyun.baidu.com/index.php?title=viewstatic)

于是写了一个函数,获取图片,这个函数太简单了

function getImg(data)
{
$("#myImg").attr(‘src‘,"http://api.map.baidu.com/panorama/v2?ak=你的key&width=120&height=100&location="+data.position.lng+","+data.position.lat+"&fov=180");
$("#myDesc").html(data.description);
}

但是获取图片,如何进入全景图呢,原来可以这样子

var panorama = map.getPanorama();//获取实例对象
panorama.setId(myData.id);  //全景ID
panorama.show(); //显示全景

基本思路搞定了,剩下的事情就好办了。直接上代码,童鞋自己改改用吧。

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
	<style type="text/css">
		body, html {width: 100%;height: 100%;margin:0;font-family:"微软雅黑";}
		#allmap{width:100%;height:500px;}
		p{margin-left:5px; font-size:14px;}
	</style>
	<script type="text/javascript" src="jquery.min.js"></script>
	<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=VsPrEgrXqDKD6lH56zzsEPFUztqvpI8H"></script>
	<title>显示全景控件</title>
	<style>
	.marker {float:left;width:120px;height:100px;}
	#myDesc{float:left;}
	#myImg{width:120px;height:80px;}
	</style>
</head>
<body>
	<div id="allmap"></div>
	<p>在地图上拖动标注,点击图片查看全景图</p>
</body>
</html>
<script type="text/javascript">
	var map = new BMap.Map(‘allmap‘);
	var panoramaService = new BMap.PanoramaService();
	var marker2;
	var myData;

    var geolocation = new BMap.Geolocation();
	geolocation.getCurrentPosition(function(r){
		if(this.getStatus() == BMAP_STATUS_SUCCESS){
			map.centerAndZoom(new BMap.Point(r.point.lng, r.point.lat), 16);
		}

		map.enableScrollWheelZoom(true);
		// 覆盖区域图层测试
		map.addTileLayer(new BMap.PanoramaCoverageLayer());		

		//var stCtrl = new BMap.PanoramaControl(); //构造全景控件
		//stCtrl.setOffset(new BMap.Size(20, 20));
		//map.addControl(stCtrl);//添加全景控件
		//stCtrl.addEventListener("click",function (t){alert("ok");});

		 //var panorama = new BMap.Panorama(‘panorama‘); //默认为显示导航控件
        //panorama.setPosition(new BMap.Point(r.point.lng,r.point.lat));

		//创建小狐狸
	var pt = new BMap.Point(r.point.lng, r.point.lat);
	var myIcon = new BMap.Icon("location.png",new BMap.Size(24,28));
	myIcon.setImageSize(new BMap.Size(24,28));
	marker2 = new BMap.Marker(pt,{icon:myIcon});  // 创建标注
	marker2.enableDragging();

	var opts = {
      position : pt,
	  offset   : new BMap.Size(-55, -105)    //设置文本偏移量
	}

	var lableContent="<div class=\"marker\"><img id=\"myImg\" src=\"noImg.png\"/><div id=\"myDesc\"></div></div>";

	var myLabel = new BMap.Label(lableContent,opts);
	marker2.setLabel(myLabel);

	map.addOverlay(marker2);

	myLabel.addEventListener("click",function (obj){
	        if (myData != null){
			   debugger;
			   var panorama = map.getPanorama();//获取实例对象
			   panorama.setId(myData.id);
                    panorama.show();
			}
	    });

marker2.addEventListener("dragend",function (t){
              myData = null;
              var p = marker2.getPosition();
              test( p.lng,p.lat);			  

              //alert("marker的位置是" + p.lng + "," + p.lat);

		 });	

	},{enableHighAccuracy: true});

	function test(lng,lat)
	{
        $("#myDesc").html("加载中......");
        panoramaService.getPanoramaByLocation(new BMap.Point(lng, lat), function(data){
			var panoramaInfo="";
			if (data == null) {
				$("#myDesc").html("");
				return;
			}
 		    myData = data;
			panoramaInfo +=‘全景id为:‘+data.id+‘\n‘;
			panoramaInfo +=‘坐标为:‘+data.position.lng+‘:‘+data.position.lat+‘\n‘;
			//alert(panoramaInfo);
            getImg(data);
       });
     }

	 function getImg(data)
	 {
         $("#myImg").attr(‘src‘,"http://api.map.baidu.com/panorama/v2?ak=你的key&width=120&height=100&location="+data.position.lng+","+data.position.lat+"&fov=180");
		 $("#myDesc").html(data.description);
	 }

</script>

  

时间: 2024-10-26 06:54:36

百度地图的全景地图实现的过程的相关文章

百度地图、高德地图的数据从哪里得到的?[声明我只是此文章的搬运工,从百度知道复制来的]

要说数据来源,首先得对地图数据做一个分类,因为不同分类的数据,其来源,采集方法都是有大不同的. 要明白地图的数据分类,必须先理解一个概念,就是地图图层的概念: 如上图,电子地图对我们实际空间的表达,事实上是通过不同的图层去描述,然后通过图层叠加显示来进行表达的过程. 对于我们地图应用目标的不同,叠加的图层也是不同的,用以展示我们针对目标所需要信息内容. 其次呢,我引入一下矢量模型和栅格模型的概念,GIS(电子地图)采用两种不同的数学模型来对现实世界进行模拟: 矢量模型:同多X,Y(或者X,Y,Z

百度地图、高德地图的数据从哪里得到的?

要说数据来源,首先得对地图数据做一个分类,因为不同分类的数据,其来源,采集方法都是有大不同的. 要明白地图的数据分类,必须先理解一个概念,就是地图图层的概念:        如上图,电子地图对我们实际空间的表达,事实上是通过不同的图层去描述,然后通过图层叠加显示来进行表达的过程. 对于我们地图应用目标的不同,叠加的图层也是不同的,用以展示我们针对目标所需要信息内容. 其次呢,我引入一下矢量模型和栅格模型的概念,GIS(电子地图)采用两种不同的数学模型来对现实世界进行模拟: 矢量模型:同多X,Y(

微信JS-SDK之地理位置的获取与在线导航,集成百度地图实现在线地图搜索

原创声明:本文来源于本人另一博客[微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索]原创作品,绝非他处摘取,转载请联系博主 本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与在线导航. 官方文档地址:https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.htm

ios 一步一步学会自定义地图吹出框(CalloutView)--&gt;(百度地图,高德地图,google地图)

前言 在 ios上边使用地图库的同学肯定遇到过这样的问题:吹出框只能设置title和subtitle和左右的view,不管是百度地图还是高德地图还是自带的 google地图,只提供了这四个属性,如果想添加更多的view,只能自定义.可是,类库只能看到.h文件,.m都看不到,这让新手比较蛋疼,庞大的地 图类库一时半会摸不着头脑,从头再学还需要时间,本文就教大家快速制作一个属于自己的 CalloutView!等你一步一步调通后,再回过头来使用系统自带的方法设置callout,就会领悟这个过程. 正文

[Baidu Map]添加全景地图

关键代码: /* 为地图添加全景 @map BMap.Map @divid 全景地图承载div @ylng,xlat 全景地图初始化经纬度 eg:panorama = addPanorama(map, 'panorama', ylng, xlat); */ function addPanorama(map, divid, ylng, xlat) { var panorama = new BMap.Panorama(divid); //全景图展示 panorama.setPosition(new

百度做各种各样的地图API教会你

注意api的密钥  ak在我的云盘里,您可以自己申请! 百度做各种各样的地图API教会你,布布扣,bubuko.com

百度地图API自定义地图

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

百度、高德开撕地图,手机地图第一争霸背后的阳谋

百度更多是C端用户使用频率更高,高德在B端用途更大,地图争霸,目标却是O2O 文/张书乐 这个周末,地图行业第一之争的舆论战打得火热.此次口水战的起源是高德单方面宣称"已成为行业第一",隔空喊话百度地图"不服来战",并宣称将允许第三方数据公司QuestMobile监测验证.百度地图第一时间发文回应,甩出三家权威机构数据和用户评测结果,吊打高德数据"掺水".不过,高德并未消停,仍放话坚持用第三方数据说话.面对友商如是挑衅,百度地图官方再度强势回应,

关于百度地图API的地图坐标转换问题

原文:关于百度地图API的地图坐标转换问题 我在之前的文章利用html5获取经纬度并且在百度地图中显示位置中使用了百度地图的API来显示html5获取的地理位置,在文中我说过这样的话,我说百度地图的准确度不怎么精确,偏差很大.这里我要更正下: 国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密.百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私.百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换. 由此