百度地图零基础入门到精通

227 阅读12分钟

百度地图

1. 开发者账号申请

2. 入门

1. 基本使用

  1. 引入 js 库,注意需要附带申请的密钥 ak
  2. 编写容器组件
  3. 初始化 Map 对象
  4. 初始化 Point 对象
  5. 设置中心点和地图级别
<!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%;
      overflow: hidden;
      margin: 0;
    }

    #allmap {
      width: 50%;
      height: 50%;
      margin: 100px auto;
    }

    /* 隐藏地图下方的logo与版权声明 */
    .anchorBL, .BMap_cpyCtrl  {
      display: none;  
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <title>地图展示</title>
</head>

<body>
  <div id="allmap"></div>
</body>

</html>
<script type="text/javascript">
  var map = new BMapGL.Map("allmap"); // 创建Map实例
  var point = new BMapGL.Point(116.404, 39.915); // 初始化中心点坐标 
  map.centerAndZoom(point, 12);  // 初始化地图,设置中心点坐标和地图级别
  map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
</script>

image.png

2. 异步加载地图

在对性能敏感的场景下,我们可以选择异步加载百度地图,从而加快首屏的渲染速度

<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%;
      overflow: hidden;
      margin: 0;
    }

    #allmap {
      width: 50%;
      height: 50%;
      margin: 100px auto;
    }
  </style>
  <title>异步地图展示</title>
</head>

<body>
  <div id="allmap"></div>
</body>

</html>
<script type="text/javascript">
  function init() {
    var map = new BMapGL.Map('allmap');
    var point = new BMapGL.Point(116.404, 39.915);
    map.centerAndZoom(point, 12);
    map.enableScrollWheelZoom(true);
  }

  function loadScript() {
    var script = document.createElement("script");
    script.src = "https://api.map.baidu.com/api?v=1.0&type=webgl&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb&callback=init";
    document.body.appendChild(script);
  }

  window.onload = loadScript;
</script>

image.png

3. 3D地图

我们可以使用 heading 和 tilt 属性控制地图的旋转角度和俯角

<!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%;
      overflow: hidden;
      margin: 0;
    }

    #allmap {
      width: 100%;
      height: 100%;
    }

    #allmap {
      position: relative;
    }

    #tools {
      position: absolute;
      left: 0;
      top: 0;
      z-index: 1000;
    }

    .tools-bar {
      display: flex;
    }

    .label {
      width: 80px;
      text-align: right;
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <title>地图展示</title>
</head>

<body>
  <div id="allmap"></div>
  <div id="tools">
    <div class="tools-bar">
      <div class="label">heading:</div>
      <button id="heading-add">+</button>
      <input type="text" id="heading" value="40">
      <button id="heading-minus">-</button>
    </div>
    <div class="tools-bar">
      <div class="label">tilt:</div>
      <button id="tilt-add">+</button>
      <input type="text" id="tilt" value="70">
      <button id="tilt-minus">-</button>
    </div>
    <div class="tools-bar">
      <button id="loop">loop</button>
      <button id="stop">stop</button>
    </div>
  </div>
</body>

</html>
<script type="text/javascript">
  // GL版命名空间为BMapGL
  // 按住鼠标右键,修改倾斜角和角度
  var map = new BMapGL.Map("allmap");    // 创建Map实例
  var point = new BMapGL.Point(116.280190, 40.049191);
  map.centerAndZoom(point, 19);  // 初始化地图,设置中心点坐标和地图级别
  map.enableScrollWheelZoom(true);     // 开启鼠标滚轮缩放
  map.setHeading(40);   // 设置地图旋转角度
  map.setTilt(70);       // 设置地图的倾斜角度

  var heading = document.getElementById('heading');
  var headingAdd = document.getElementById('heading-add');
  var headingMinus = document.getElementById('heading-minus');
  var tilt = document.getElementById('tilt');
  var tiltAdd = document.getElementById('tilt-add');
  var tiltMinus = document.getElementById('tilt-minus');
  heading.addEventListener('input', function (e) {
    map.setHeading(e.target.value);
  });
  tilt.addEventListener('input', function (e) {
    map.setTilt(e.target.value);
  });
  headingAdd.addEventListener('click', function (e) {
    heading.value++;
    map.setHeading(heading.value);
  });
  headingMinus.addEventListener('click', function (e) {
    heading.value--;
    map.setHeading(heading.value);
  });
  tiltAdd.addEventListener('click', function (e) {
    tilt.value++;
    map.setTilt(tilt.value);
  });
  tiltMinus.addEventListener('click', function (e) {
    tilt.value--;
    map.setTilt(tilt.value);
  });
  var task;
  document.getElementById('loop').addEventListener('click', function (e) {
    task = setInterval(() => {
      if (loop) {
        heading.value++;
        map.setHeading(heading.value);
      }
    }, 100);
  });
  document.getElementById('stop').addEventListener('click', function (e) {
    task && clearInterval(task);
  })
</script>

image.png

4. 控件与事件的使用

3D地球官方文档

控件官方文档

<!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,
    #allmap {
      width: 100%;
      height: 100%;
      overflow: hidden;
      margin: 0;
      font-family: "微软雅黑";
    }

    /* 隐藏地图下方的logo与版权声明 */
    .anchorBL,
    .BMap_cpyCtrl {
      display: none;
    }

    /* 显示控件zoomCtrl控件 */
    .BMap_stdMpZoom {
      display: block;
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <title>地图展示</title>
</head>

<body>
  <div id="allmap"></div>
</body>

</html>
<script type="text/javascript">
  // GL版命名空间为BMapGL
  // 按住鼠标右键,修改倾斜角和角度
  var map = new BMapGL.Map("allmap", {
    minZoom: 8, // 地图最小级别
    maxZoom: 12, // 地图最大级别
    // mapType: BMAP_EARTH_MAP // 设置地图类型为地球模式, 和setMapType用一个即可
  });
  map.centerAndZoom(new BMapGL.Point(118.5, 27.5), 10);
  map.enableScrollWheelZoom(true);
  map.setMapType(BMAP_NORMAL_MAP);      // BMAP_EARTH_MAP/BMAP_NORMAL_MAP

  /**
   * 控件
   */
  var scaleCtrl = new BMapGL.ScaleControl({
    anchor: BMAP_ANCHOR_TOP_LEFT,
    offset: new BMapGL.Size(100, 10)
  });  // 添加比例尺控件
  map.addControl(scaleCtrl);

  var zoomCtrl = new BMapGL.ZoomControl({
    anchor: BMAP_ANCHOR_BOTTOM_LEFT, // 缩放控件的位置
    offset: new BMapGL.Size(100, 100) // 缩放控件的偏移值
  });  // 添加比例尺控件
  map.addControl(zoomCtrl);

  /**
   * 事件
   */
  map.addEventListener('zoomstart', function (e) { // 缩放开始
    console.log('zoomstart', map.getZoom());
  });
  map.addEventListener('zoomend', function (e) { // 缩放结束
    console.log('zoomend', map.getZoom());
  });
</script>

image.png

5. 自定义地图

官方文档

image.png

<!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,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
	</style>
	<script type="text/javascript" src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
	<title>地图展示</title>
</head>
<body>
	<div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
    // GL版命名空间为BMapGL
    // 按住鼠标右键,修改倾斜角和角度
	var map = new BMapGL.Map("allmap");    // 创建Map实例
  var point = new BMapGL.Point(116.404, 39.915);
	map.centerAndZoom(point, 9);  // 初始化地图,设置中心点坐标和地图级别
	map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
	map.setMapStyleV2({     
  	styleId: 'a0c43e8c7279db0a4a032712d0e4c32c'
	});
</script>

image.png

3. 进阶

1. 绘制图标

  • 绘制图标
  • 绘制线段
  • 绘制文本
  • 绘制弹窗
<!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,
		#allmap {
			width: 100%;
			height: 100%;
			overflow: hidden;
			margin: 0;
			font-family: "微软雅黑";
		}
	</style>
	<script type="text/javascript"
		src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
	<title>地图展示</title>
</head>

<body>
	<div id="allmap"></div>
</body>

</html>
<script type="text/javascript">
	var map = new BMapGL.Map("allmap"); // 创建Map实例
	var point = new BMapGL.Point(116.404, 39.915);
	map.centerAndZoom(point, 12);
	map.enableScrollWheelZoom(true);
	map.setMapStyleV2({
		styleId: "556b6c846f130ec3ad0016f2eba410f6",
	});

	// 创建图标对象
	var myIcon = new BMapGL.Icon(
		"https://www.youbaobao.xyz/datav-res/datav/location.png",
		new BMapGL.Size(60, 60),
		{
			anchor: new BMapGL.Size(0, 0),
			imageOffset: new BMapGL.Size(0, 0),
		}
	);

	// 创建标注对象并添加到地图
	var marker = new BMapGL.Marker(point, { icon: myIcon }); // 创建标注
	marker.addEventListener("click", function () { // 点击添加弹框
		var opts = {
			width: 250, // 信息窗口宽度
			height: 100, // 信息窗口高度
			title: "标题", // 信息窗口标题
		};
		// var infoWindow = new BMapGL.InfoWindow("我是内容", opts); // 创建信息窗口对象
		var infoWindow = new BMapGL.InfoWindow("<div style='color: red;'>欢迎</div>", opts); // 创建信息窗口对象
		map.openInfoWindow(infoWindow, point); // 打开信息窗口
	});
	map.addOverlay(marker); // 将标注添加到地图中

	// 创建线段对象
	var polyline = new BMapGL.Polyline(
		[
			new BMapGL.Point(116.4, 39.8),
			new BMapGL.Point(116.43, 39.8),
			new BMapGL.Point(116.43, 39.83),
			new BMapGL.Point(116.4, 39.83),
			// new BMapGL.Point(116.4, 39.8),
		],
		{
			strokeColor: "blue",
			strokeWeight: 2,
			strokeOpacity: 0.5,
		}
	);
	map.addOverlay(polyline);

	// 创建区域对象
	var polygon = new BMapGL.Polygon(
		[
			new BMapGL.Point(116.60, 39.920),
			new BMapGL.Point(116.80, 39.920),
			new BMapGL.Point(116.80, 40.00),
		],
		{
			strokeColor: "blue",
			strokeWeight: 2,
			fillColor: 'green'
		}
	);
	map.addOverlay(polygon);

	// 创建文本标注对象
	var content = "欢迎学习数据可视化";
	var label = new BMapGL.Label(content, {
		// 创建文本标注
		position: point, // 设置标注的地理位置
		offset: new BMapGL.Size(200, 20), // 设置标注的偏移量
	});
	label.setStyle({
		// 设置label的样式
		width: "140px",
		height: "20px",
		padding: "20px",
		color: "#fff",
		fontSize: "14px",
		lineHeight: '14px',
		border: "2px solid #1E90FF",
		background: "red",
		whiteSpace: "wrap",
		overflow: "hidden",
		lineHeight: "20px",
	});
	label.addEventListener("click", function (e) {
		alert(e.target.content);
	});
	map.addOverlay(label); // 将标注添加到地图中
</script>

image.png

2. ViewAnimation视图动画

<!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,
    #allmap {
      width: 100%;
      height: 100%;
      overflow: hidden;
      margin: 0;
      font-family: "微软雅黑";
    }

    #allmap {
      position: relative;
    }

    #tools {
      position: absolute;
      left: 0;
      top: 0;
      z-index: 1000;
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <title>地图展示</title>
</head>

<body>
  <div id="allmap"></div>
  <div id="tools">
    <button id="start">播放动画</button>
    <button id="end">停止播放</button>
  </div>
</body>

</html>
<script type="text/javascript">
  var bmap = new BMapGL.Map("allmap");                          // 创建Map实例
  bmap.centerAndZoom(new BMapGL.Point(116.414, 39.915), 20);    // 初始化地图,设置中心点坐标和地图级别
  bmap.enableScrollWheelZoom(true);                             // 开启鼠标滚轮缩放
  bmap.setTilt(20);                              // 设置地图初始倾斜角度

  var keyFrames = [
    {
      center: new BMapGL.Point(116.307092, 40.054922),
      zoom: 20,
      tilt: 50,
      heading: 0,
      percentage: 0
    },
    {
      center: new BMapGL.Point(116.307631, 40.055391),
      zoom: 21,
      tilt: 70,
      heading: 0,
      percentage: 0.1
    },
    {
      center: new BMapGL.Point(116.306858, 40.057887),
      zoom: 21,
      tilt: 70,
      heading: 0,
      percentage: 0.25
    },
    {
      center: new BMapGL.Point(116.306858, 40.057887),
      zoom: 21,
      tilt: 70,
      heading: -90,
      percentage: 0.35
    },
    {
      center: new BMapGL.Point(116.307904, 40.058118),
      zoom: 21,
      tilt: 70,
      heading: -90,
      percentage: 0.45
    },
    {
      center: new BMapGL.Point(116.307904, 40.058118),
      zoom: 21,
      tilt: 70,
      heading: -180,
      percentage: 0.55
    },
    {
      center: new BMapGL.Point(116.308902, 40.055954),
      zoom: 21,
      tilt: 70,
      heading: -180,
      percentage: 0.75
    },
    {
      center: new BMapGL.Point(116.308902, 40.055954),
      zoom: 21,
      tilt: 70,
      heading: -270,
      percentage: 0.85
    },
    {
      center: new BMapGL.Point(116.307779, 40.055754),
      zoom: 21,
      tilt: 70,
      heading: -360,
      percentage: 0.95
    },
    {
      center: new BMapGL.Point(116.307092, 40.054922),
      zoom: 20,
      tilt: 50,
      heading: -360,
      percentage: 1
    },
  ];

  var opts = {
    duration: 20000,     // 设置每次迭代动画持续时间
    delay: 1000,         // 设置动画延迟开始时间
    interation: 'INFINITE'        // 设置动画迭代次数
  };

  var animation = new BMapGL.ViewAnimation(keyFrames, opts);        // 初始化动画实例

  animation.addEventListener('animationstart', function (e) {        // 监听动画开始事件
    console.log('start');
  });
  animation.addEventListener('animationiterations', function (e) {   // 监听动画迭代事件
    console.log('onanimationiterations');
  });
  animation.addEventListener('animationend', function (e) {        // 监听动画结束事件
    console.log('end');
  });
  animation.addEventListener('animationcancel', function (e) {       // 监听动画中途被终止事件
    console.log('cancel');
  });
  document.getElementById('start').addEventListener('click', function () {
    bmap.startViewAnimation(animation);         // 开始播放动画
  });
  document.getElementById('end').addEventListener('click', function () {
    bmap.cancelViewAnimation(animation);         // 强制停止动画
  });
</script>

image.png

3. TrackAnimation轨迹动画

<!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,
    #allmap {
      width: 100%;
      height: 100%;
      overflow: hidden;
      margin: 0;
      font-family: "微软雅黑";
    }

    #allmap {
      position: relative;
    }

    #tools {
      position: absolute;
      left: 0;
      top: 0;
      z-index: 1000;
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <script type="text/javascript"
    src="https://api.map.baidu.com/library/TrackAnimation/src/TrackAnimation_min.js"></script>
  <title>地图展示</title>
</head>

<body>
  <div id="allmap"></div>
  <div id="tools">
    <button id="start">播放动画</button>
    <button id="end">停止播放</button>
  </div>
</body>

</html>
<script type="text/javascript">
  var bmap = new BMapGL.Map("allmap");                          // 创建Map实例
  bmap.centerAndZoom(new BMapGL.Point(116.297611, 40.047363), 17);    // 初始化地图,设置中心点坐标和地图级别
  bmap.enableScrollWheelZoom(true);                             // 开启鼠标滚轮缩放

  var path = [{
    'lng': 116.297611,
    'lat': 40.047363
  }, {
    'lng': 116.302839,
    'lat': 40.048219
  }, {
    'lng': 116.308301,
    'lat': 40.050566
  }, {
    'lng': 116.305732,
    'lat': 40.054957
  }, {
    'lng': 116.304754,
    'lat': 40.057953
  }, {
    'lng': 116.306487,
    'lat': 40.058312
  }, {
    'lng': 116.307223,
    'lat': 40.056379
  }];
  var point = [];
  for (var i = 0; i < path.length; i++) {
    point.push(new BMapGL.Point(path[i].lng, path[i].lat));
  }
  var pl = new BMapGL.Polyline(point);
  var trackAni = new BMapGLLib.TrackAnimation(bmap, pl, {
    overallView: true, // 动画完成后自动调整视野到总览
    tilt: 30,          // 轨迹播放的角度,默认为55
    duration: 20000,   // 动画持续时长,默认为10000,单位ms
    delay: 1000        // 动画开始的延迟,默认0,单位ms
  });
  document.getElementById('start').addEventListener('click', function () {
    trackAni.start();
  });
  document.getElementById('end').addEventListener('click', function () {
    trackAni.cancel();         // 强制停止动画
  });
</script>

image.png

3. 可视化

百度地图可视化通过 mapv 和 mapvgl 解决

1. 散点图

<!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">
    html,
    body {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
    }

    #map_container {
      width: 100%;
      height: 100%;
      margin: 0;
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
  <script src="https://mapv.baidu.com/build/mapv.js"></script>
  <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>
  <title>地图展示</title>
</head>

<body>
  <div id="map_container"></div>
  <script type="text/javascript">
    var map = initMap({
      tilt: 0,
      heading: 0,
      center: [103.438656, 25.753594],
      zoom: 8,
      style: snowStyle,
      skyColors: [
        // 地面颜色
        'rgba(226, 237, 248, 0)',
        // 天空颜色
        'rgba(186, 211, 252, 1)'
      ]
    });

    setData(initData());

    // 初始化数据
    function initData() {
      var data = [];
      var citys = [
        '北京', '天津', '上海', '重庆', '石家庄', '太原', '呼和浩特', '哈尔滨', '长春',
        '沈阳', '济南', '南京', '合肥', '杭州', '南昌', '福州', '郑州', '武汉', '长沙', '广州',
        '南宁', '西安', '银川', '兰州', '西宁', '乌鲁木齐', '成都', '贵阳', '昆明', '拉萨', '海口'
      ];
      var randomCount = 700;
      // 构造数据
      while (randomCount--) {
        var cityCenter = mapv.utilCityCenter.getCenterByCityName(citys[parseInt(Math.random() * citys.length, 10)]);
        data.push({
          geometry: {
            type: 'Point',
            coordinates: [cityCenter.lng - 2 + Math.random() * 4, cityCenter.lat - 2 + Math.random() * 4]
          },
          properties: {
            count: Math.random() * 100
          }
        });
      }
      return data;
    }

    // 绘制数据源
    function setData(data) {
      // 1. 生成 mapvgl 视图 View
      var view = new mapvgl.View({
        map: map
      });

      // 2. 初始化 mapvgl 的 Intensity 对象
      var intensity = new mapvgl.Intensity({
        max: 100,
        min: 0,
        gradient: {
          0: 'rgb(25, 66, 102, 0.8)',
          0.3: 'rgb(145, 102, 129, 0.8)',
          0.7: 'rgb(210, 131, 137, 0.8)',
          1: 'rgb(248, 177, 149, 0.8)'
        },
        maxSize: 30,
        minSize: 5
      });

      // 3. 初始化 mapvgl 的 PointLayer 对象
      var pointLayer = new mapvgl.PointLayer({
        // blend: 'lighter',
        size: function (data) {
          return intensity.getSize(data.properties.count);
        },
        color: function (data) {
          return intensity.getColor(data.properties.count);
        }
      });

      // 4. 将 PointLayer 添加到 View 中
      view.addLayer(pointLayer);

      // 5. 将 data 数据添加到 PointLayer 中
      pointLayer.setData(data);
    }
  </script>
</body>

</html>

image.png

2. 点聚合

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="utf-8">
  <title>地图展示</title>
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
  <style>
    html,
    body {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
    }

    #map_container {
      width: 100%;
      height: 100%;
      margin: 0;
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
  <script src="https://mapv.baidu.com/build/mapv.js"></script>
  <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.189/dist/mapvgl.min.js"></script>
</head>

<body>
  <div id="map_container"></div>
  <script>
    /* global BMapGL */

    /* global mapv */

    /* global mapvgl */

    /* global initMap */

    /* global whiteStyle */

    var map = initMap({
      style: whiteStyle,
      tilt: 10,
      center: [109.792816, 27.702774],
      zoom: 5,
      skyColors: [
        // 地面颜色
        'rgba(226, 237, 248, 0)',
        // 天空颜色
        'rgba(186, 211, 252, 1)'
      ],
    });

    var data = [];

    var citys = [
      '北京',
      '天津',
      '上海',
      '重庆',
      '石家庄',
      '太原',
      '呼和浩特',
      '哈尔滨',
      '长春',
      '沈阳',
      '济南',
      '南京',
      '合肥',
      '杭州',
      '南昌',
      '福州',
      '郑州',
      '武汉',
      '长沙',
      '广州',
      '南宁',
      '西安',
      '银川',
      '兰州',
      '西宁',
      '乌鲁木齐',
      '成都',
      '贵阳',
      '昆明',
      '拉萨',
      '海口'
    ];

    var randomCount = 100000;

    // 构造数据
    while (randomCount--) {
      var cityCenter = mapv.utilCityCenter.getCenterByCityName(
        citys[parseInt(Math.random() * citys.length, 10)]
      );
      data.push({
        geometry: {
          type: 'Point',
          coordinates: [cityCenter.lng - 2 + Math.random() * 4, cityCenter.lat - 2 + Math.random() * 4]
        },
        properties: {
          icon: 'https://www.youbaobao.xyz/datav-res/datav/location.png',
          width: 20,
          height: 30
        }
      });
    }

    var view = new mapvgl.View({
      map: map
    });

    var clusterLayer = new mapvgl.ClusterLayer({
      minSize: 50, // 聚合点显示的最小直径
      maxSize: 70, // 聚合点显示的最大直径
      clusterRadius: 150, // 聚合范围半径
      gradient: { 0: 'blue', 0.5: 'green', 1.0: 'red' }, // 聚合点颜色梯度
      maxZoom: 15, // 聚合的最大级别,当地图放大级别高于此值将不再聚合
      minZoom: 5, // 聚合的最小级别,当地图放大级别低于此值将不再聚合
      // 是否显示文字
      showText: true,
      // 开始聚合的最少点数,点数多于此值才会被聚合
      minPoints: 5,
      // 设置文字样式
      textOptions: {
        fontSize: 12,
        color: 'white',
        // 格式化数字显示
        format: function (count) {
          console.log('count', count);
          return count >= 10000 ? Math.round(count / 1000) + 'k'
            : count >= 1000 ? Math.round(count / 100) / 10 + 'k' : count;
        }
      },
      enablePicked: true,
      onClick(e) {
        if (e.dataItem) {
          // 可通过dataItem下面的children属性拿到被聚合的所有点
          console.log(e.dataItem)
        }
      },
    });

    view.addLayer(clusterLayer);
    clusterLayer.setData(data);
  </script>
</body>

</html>

image.png

3. 飞线动画

<!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">
    html,
    body {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
    }

    #map_container {
      width: 100%;
      height: 100%;
      margin: 0;
    }
  </style>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
  <script src="https://mapv.baidu.com/build/mapv.js"></script>
  <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>
  <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.threelayers.min.js"></script>
  <title>地图展示</title>
</head>

<body>
  <div id="map_container"></div>
  <script type="text/javascript">
    var map = initMap({
      tilt: 50,
      heading: 0,
      center: [103.438656, 25.753594],
      zoom: 6,
      style: purpleStyle
    });

    setData(initData());

    function initData() {
      var data = [];
      var citys = [
        '北京', '天津', '上海', '重庆', '石家庄', '太原', '呼和浩特', '哈尔滨', '长春',
        '沈阳', '济南', '南京', '合肥', '杭州', '南昌', '福州', '郑州', '武汉', '长沙', '广州',
        '南宁', '西安', '银川', '兰州', '西宁', '乌鲁木齐', '成都', '贵阳', '昆明', '拉萨', '海口'
      ];
      var randomCount = 100; // 模拟的飞线的数量
      // 生成贝塞尔曲线对象
      var curve = new mapvgl.BezierCurve();
      // 构造数据
      while (randomCount--) {
        var startPoint = mapv.utilCityCenter.getCenterByCityName(citys[parseInt(Math.random() * citys.length, 10)]);
        var endPoint = mapv.utilCityCenter.getCenterByCityName(citys[parseInt(Math.random() * citys.length, 10)])
        // 设置起点和终点坐标
        curve.setOptions({
          start: [startPoint.lng, startPoint.lat], // 起点坐标
          end: [endPoint.lng, endPoint.lat] // 终点坐标
        });
        // 生成坐标集
        var curveModelData = curve.getPoints();
        data.push({
          geometry: {
            type: 'LineString',
            coordinates: curveModelData
          },
          properties: {
            count: Math.random(),
            name: 'zgc'
          }
        });
      }
      return data;
    }

    function setData(data) {
      var view = new mapvgl.View({
        map: map
      });

      // 初始化飞线对象
      var flylineLayer = new mapvgl.FlyLineLayer({
        style: 'chaos',
        step: 0.3,
        color: 'rgba(33, 242, 214, 0.3)',
        textureColor: function (data) {
          console.log('data',data);
          return data.properties.count > 0.5 ? '#ff0000' : '#56ccdd';
        },
        textureWidth: 20,
        textureLength: 10
      });
      view.addLayer(flylineLayer);
      flylineLayer.setData(data);
    }
  </script>
</body>

</html>

image.png

4. 炫酷线图

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title></title>
  <script type="text/javascript"
    src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
  <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
  <script type="text/javascript" src="https://mapv.baidu.com/build/mapv.js"></script>
  <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>
  <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.53/dist/mapvgl.threelayers.min.js"></script>
  <style type="text/css">
    html,
    body {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }

    #map_container {
      width: 100%;
      height: 100%;
    }
  </style>
</head>

<body>
  <div id="map_container"></div>
  <script type="text/javascript">
    var map = initBMap()
    var data = initData()
    setData(data)

    // 初始化百度地图
    function initBMap() {
      var map = initMap({
        tilt: 0,
        center: [108.154518, 36.643346],
        zoom: 5,
        style: darkStyle
      })
      return map
    }

    function initData() {
      var targetCity = mapv.utilCityCenter.getCenterByCityName('北京')

      var randomCount = 500
      var node_data = [ // 节点数据
        { // 目标点
          x: targetCity.lng,
          y: targetCity.lat
        }
      ]
      var edge_data = [ // 边数据
        {
          source: 0, // node_data的起始点索引
          target: 0 // node_data的目标点索引
        }
      ]
      var cities = [
        '北京', '天津', '上海', '重庆', '石家庄', '太原', '呼和浩特', '哈尔滨', '长春', '沈阳', '济南', '南京', '合肥', '杭州', '南昌', '福州', '郑州', '武汉', '长沙', '广州', '南宁', '西安', '银川', '兰州', '西宁', '乌鲁木齐', '成都', '贵阳', '昆明', '拉萨', '海口'
      ]
      // 构造数据
      for (var i = 0; i < randomCount; i++) {
        var cityCenter = mapv.utilCityCenter.getCenterByCityName(cities[parseInt(Math.random() * cities.length)])
        node_data.push({
          x: cityCenter.lng - 5 + Math.random() * 10,
          y: cityCenter.lat - 5 + Math.random() * 10
        })
        edge_data.push({
          source: i + 1,
          target: 0
        })
      }
      var fbundling = mapv.utilForceEdgeBundling()
        .nodes(node_data)
        .edges(edge_data)

      var results = fbundling()
      console.log('results', results);
      var data = []
      var timeData = []

      for (var i = 0; i < results.length; i++) {
        var line = results[i]
        // console.log('line', line);
        var coordinates = []
        for (var j = 0; j < line.length; j++) {
          coordinates.push([line[j].x, line[j].y])
          // timeData.push({
          //   geometry: {
          //     type: 'LineString',
          //     coordinates: [line[j].x, line[j].y]
          //   },
          //   count: 1,
          //   time: j
          // })
        }
        data.push({
          geometry: {
            type: 'LineString',
            coordinates: coordinates
          }
        })
      }
      return {
        pointData: timeData,
        lineData: data
      }
    }

    function setData({ pointData, lineData }) {
      // console.log(pointData)
      var view = new mapvgl.View({ map })
      var lineLayer = new mapvgl.LineLayer({
        color: 'rgba(55, 50, 250, 0.3)',
        blend: 'lighter' // 线重叠时高亮
      })
      view.addLayer(lineLayer)
      lineLayer.setData(lineData)

      var linePointLayer = new mapvgl.LinePointLayer({
        size: 8, // 线点的大小
        speed: 20, // 线点的速度
        color: 'rgba(255, 255, 0, 0.6)', // 线点的颜色
        animationType: mapvgl.LinePointLayer.ANIMATION_TYPE_SMOOTH,  // 线点的动画类型
        shapeType: mapvgl.LinePointLayer.SHAPE_TYPE_CIRCLE, // 线点的形状
        blend: 'lighter' // 线点的重叠时高亮
      })
      view.addLayer(linePointLayer)
      linePointLayer.setData(lineData)
    }

  </script>

</body>

</html>

image.png

5. 3D建筑

<!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">
		html,
    body {
			width: 100%;
			height: 100%;
			margin: 0;
			padding: 0;
    }
    #map_container {
			width: 100%;
			height: 100%;
			margin: 0;
    }
	</style>
	<script type="text/javascript" src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=G1LFyjrNGIkns5OfpZnrCGAKxpycPLwb"></script>
	<script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
	<script src="https://mapv.baidu.com/build/mapv.js"></script>
	<script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>
	<title>地图展示</title>
</head>
<body>
	<div id="map_container"></div>
	<script type="text/javascript">
		var map = initMap({
			tilt: 80,
			heading: -45.3,
			center: [106.540547,29.564858],
			zoom: 17
    });
		initData();
		function initData() {
			fetch('https://www.youbaobao.xyz/datav-res/examples/chongqing.json')
				.then(res => res.json())
				.then(res => {
					var data = res;
					var polygons = [];
        	var len = data.length;
        	for (var i = 0; i < len; i++) {
            var line = data[i];
            var polygon = [];
            var pt = [line[1] * 512, line[2] * 512];
            for (var j = 3; j < line.length; j += 2) {
							pt[0] += line[j] / 100 / 2;
							pt[1] += line[j + 1] / 100 / 2;
							polygon.push([pt[0], pt[1]]);
            }
            polygons.push({
							geometry: {
								type: 'Polygon',
								coordinates: [polygon] // 三位数组
							},
							properties: {
								height: line[0] / 2 // 图形的高度
							}
            });
					}
					setData(polygons);
				});
		}
		function setData(data) {
			console.log(data);
			var view = new mapvgl.View({
        map: map
    	});

			var shaperLayer = new mapvgl.ShapeLayer({
				color: 'rgb(0, 255, 255)',
    		style: 'normal',
				// opacity: 1.0, // 透明度
				riseTime: 2000, // 楼房升起动画
				opacity: 0.3, // 透明度
				enablePicked: true, // 是否可以拾取
				selectedIndex: -1, // 选中项
				selectedColor: '#ee1111', // 选中项颜色
				autoSelect: true, // 根据鼠标位置来自动设置选中项
				onClick: (e) => { // 点击事件
					console.log(e);
				}
			});

			view.addLayer(shaperLayer);
			shaperLayer.setData(data);
		}
	</script>	
</body>
</html>

image.png