BMap js API遇到的问题 实例 海量点、标注不同颜色、标注点添加文本

1.百度地图标记点上添加数字
	// 创建文本标注对象
	var label = new BMap.Label('content', {
	    // 设置文本偏移量
	    offset : new BMap.Size(11, 8)
	});
	// 自定义文本标注样式
	label.setStyle({
	    background:'none',
		color:'#fff',
		border:'none'
	});
	// 显示在标记点
	marker.setLabel(label);
2.百度地图标注多个不同颜色样式坐标点
	// 创建icon对象
	var center_dot = new BMapGL.Icon("images/center_dot.png", new BMap.Size(30, 35));
	center_dot.setImageSize(new BMap.Size(30, 35));
	// 创建Marker标注,使用小车图标
	var point = new BMapGL.Point(116.417, 39.909);
	var marker = new BMapGL.Marker(point, {
	    icon: center_dot
	});
	// 将标注添加到地图
	map.addOverlay(marker);
3.加载海量点,并携带数据显示信息窗口
	// 海量默认点
    var pointsArray = [
					{lng: '120.13194', lat: '30.225157', info: 'point1'},
					{lng: '120.218471', lat: '30.214333', info: 'point2'},
					{lng: '120.270471', lat: '30.187511', info: 'point3'}]
	var options = {
      size: BMAP_POINT_SIZE_BIGGER,
      shape: BMAP_POINT_SHAPE_CIRCLE,
      color: '#EA0000'
    };
    // 添加海量点数据
    var points = [];
    for(var i = 0; i < pointsArray.length; i++){
      let point = new BMap.Point(pointsArray[i].lng, pointsArray[i].lat);
	  // JavaScript是弱类型的,我们可以让point在加入到点集合PointCollection之前携带数据
	  point.info = pointsArray[i].info;
      points.push(point);
    }

    // 初始化PointCollection
    var pointCollection = new BMap.PointCollection(points, options);
    // 实现pointCollection鼠标悬浮事件
    pointCollection.addEventListener('mouseover', function (e) {
      // 显示信息窗口
      var opts = {
        width : 250,     //信息窗口宽度
        height: 50,     //信息窗口高度
        title : ""  //信息窗口标题
      };
      map.openInfoWindow(new BMap.InfoWindow(e.point.info, opts), e.point);
    });
    pointCollection.addEventListener('mouseout', function (e) {
      // 关闭信息窗口
      map.closeInfoWindow();
    });

    // 添加Overlay
    map.addOverlay(pointCollection);
4.阻止marker点事件冒泡

地图上有一个标记点,当点击标记点的时候,会执行覆盖物绑定的事件;执行完之后,仍然会触发地图绑定的事件,也就是事件冒泡穿透了。

bmap进行了封装,将原始的事件放到了domEvent中。

	marker.addEventListener("click", function(e){
        // 阻止覆盖物事件冒泡到地图上
        e.domEvent.stopPropagation();
        // ...
    });
5.信息窗口openInfoWindow 关闭
	// 关闭信息窗口
    map.closeInfoWindow();
代码实例(包含求海量坐标中心坐标,最佳目标点距离计算)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=1.0,user-scalable=no" />
<title>百度地图API</title>
<style type="text/css">
body, html {
	width: 100%;
	height: 100%;
	margin: 0;
	font-size: 16px;
}

#b-map {
	height: 100%;
	width: 100%;
}

</style>
	<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
</head>
<body>
	<div id="b-map"></div>

	<script type="text/javascript">
    const EARTH_RADIUS = 6378.137
		// 手动mark的点集合
    var dotInfoArray = []
		// 默认点
    var pointsArray = [
									{lng: '120.13194', lat: '30.225157', info: 'point1'},
									{lng: '120.218471', lat: '30.214333', info: 'point2'},
									{lng: '120.270471', lat: '30.187511', info: 'point3'}]
    // 创建地图实例
    var map = new BMap.Map('b-map', {
      restrictCenter: false,
      enableMapClick:false
    });
    // 地址解析类
    var gc = new BMap.Geocoder();
    // 开启鼠标滚轮缩放
    map.enableScrollWheelZoom(true);

    var options = {
      size: BMAP_POINT_SIZE_BIGGER,
      shape: BMAP_POINT_SHAPE_CIRCLE,
      color: '#EA0000'
    };
    // 添加海量点数据
    var points = [];
    for(var i = 0; i < pointsArray.length; i++){
      let point = new BMap.Point(pointsArray[i].lng, pointsArray[i].lat);
			// JavaScript是弱类型的,我们可以让point在加入到点集合PointCollection之前携带数据
			point.info = pointsArray[i].info;
      points.push(point);
    }

    // 初始化PointCollection
    var pointCollection = new BMap.PointCollection(points, options);
    // 实现pointCollection鼠标悬浮事件
    pointCollection.addEventListener('mouseover', function (e) {
      // 显示信息窗口
      var opts = {
        width : 250,     //信息窗口宽度
        height: 50,     //信息窗口高度
        title : ""  //信息窗口标题
      };
      map.openInfoWindow(new BMap.InfoWindow(e.point.info, opts), e.point);
    });
    pointCollection.addEventListener('mouseout', function (e) {
      // 关闭信息窗口
      map.closeInfoWindow();
    });

    // 添加Overlay
    map.addOverlay(pointCollection);
		// 手动添加点标记
    map.addEventListener('click', function (e) {
      //
      var select_dot = new BMap.Icon("images/select_dot.png", new BMap.Size(30, 35));
      select_dot.setImageSize(new BMap.Size(30, 35));
      // 创建点标记
      var marker = new BMap.Marker(new BMap.Point(e.point.lng, e.point.lat), {icon: select_dot});

      // 在地图上添加点标记
      map.addOverlay(marker);

      marker.addEventListener("click", function(e){
        // 阻止覆盖物事件冒泡到地图上
        e.domEvent.stopPropagation();
        // 显示手动标记点位置信息窗口
        gc.getLocation(marker.point, function(rs){
          showLocationInfo(marker.point, rs, marker);
        });
      });

      gc.getLocation(marker.point, function(rs){
        // 获取该标记点到其他所有默认点的平均距离
        let averDistance = getTotalDistance(marker)
        // 获取该标记点的位置信息
        var addComp = rs.addressComponents;
        var address = "位置:" + addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber + "<br/>";

        let dotItem = {'marker': marker, 'averDistance': averDistance, 'address': address}
        dotInfoArray.push(dotItem)

				// 按照平均距离排名
        showRanking()
      });
    });

    // 根据所有默认点得到中心坐标点
    processCenter();

    function getTotalDistance(dot) {
      var distance = 0
			console.time('计时器1');
      for (let j = 0; j < pointsArray.length; j++) {
        let point = pointsArray[j];
        distance = distance + getDistance(dot.point.lng, dot.point.lat, parseFloat(point.lng), parseFloat(point.lat));
      }
      console.timeEnd('计时器1');
      return distance / pointsArray.length
    }

    function showRanking() {
      // 排序
      dotInfoArray = sort(dotInfoArray, 'averDistance')
      console.log('点信息:', dotInfoArray)

      for(let i = 0; i< dotInfoArray.length; i++) {
        let dot = dotInfoArray[i];
        let ranking = i + 1
        // 创建文本标注对象
        var label = new BMap.Label(ranking, {
          // 设置文本偏移量
          offset : new BMap.Size(11, 8)
        });
        // 自定义文本标注样式
        label.setStyle({
          background:'none',
					color:'#fff',
					border:'none'
        });
        map.removeOverlay(dot.marker.getLabel());
        // 显示名次数字
        dot.marker.setLabel(label);
      }
    }

    function rad(d){
      return d * Math.PI / 180.0;
    }

    // 根据经纬度坐标计算两点间距离
    function getDistance(lng1, lat1, lng2, lat2) {
      var radLat1 = rad(lat1);
      var radLat2 = rad(lat2);
      var a = radLat1 - radLat2;
      var b = rad(lng1) - rad(lng2);
      var s = 2 * Math.asin(Math.sqrt(
        Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
      s = s * EARTH_RADIUS;
      s = (s * 10000) / 10;
      return s;
    }
    // 显示地址信息窗口
    function showLocationInfo(pt, rs, marker){
      var opts = {
        width : 250,
        height: 100,
        title : "当前位置:"
      }

      var addComp = rs.addressComponents;
      var addr =  "地址:" + addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber + "<br/>";
      addr += "纬度: " + pt.lat + ", " + "经度:" + pt.lng;

      //创建信息窗口对象
      var infoWindow = new BMap.InfoWindow(addr, opts);
      marker.openInfoWindow(infoWindow);
    }
    // 排序
    function sort(arr, key){
      for(var i = 0; i < arr.length - 1; i++){
        for(var j = 0; j < arr.length - i - 1; j++){
          // 相邻元素两两对比
          if(arr[j][key] > arr[j+1][key]) {
            var hand = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = hand;

          }
        }
      }
      return arr;
    }


		function processCenter(){
			var tmp_center = getPointsCenter();

			// 最优的点 弹跳动画
			var point = new BMap.Point(tmp_center[1], tmp_center[0]);
			map.centerAndZoom(point, 15);

      var center_dot = new BMap.Icon("images/center_dot.png", new BMap.Size(30, 35))
      center_dot.setImageSize(new BMap.Size(30, 35));

			var marker = new BMap.Marker(point, {icon: center_dot});
      // 跳动的动画
			marker.setAnimation(BMAP_ANIMATION_BOUNCE);

      marker.addEventListener("click", function(e){
        gc.getLocation(e.point, function(rs){
          showLocationInfo(e.point, rs, marker);
        });
      });
			// 将标注添加到地图中
			map.addOverlay(marker);


			// 设置最优点文本显示
			var opts = {
				width: 50,
				height: 20,
				title: '最优区域'
			};
			var infoWindow = new BMap.InfoWindow('2KM最优区域', opts);
			map.openInfoWindow(infoWindow, new BMap.Point(tmp_center[1], tmp_center[0]));

			// 绘制最优点区域
			var circle = new BMap.Circle(new BMap.Point(tmp_center[1], tmp_center[0]), 2000, {
				fillColor: 'blue',
				strokeWeight: 3,
				fillOpacity: 0.3,
				strokeOpacity: 0.3
			});
			map.addOverlay(circle);
		}

		// 地理中心点
		function getPointsCenter() {
      // 坐标点个数
			var point_num = pointsArray.length;
			var X = 0, Y = 0, Z = 0;
			for(let i = 0; i< pointsArray.length; i++) {
				let point = pointsArray[i];
				var lat, lng, x, y, z;
				lat = parseFloat(parseFloat(point.lat)) * Math.PI / 180;
				lng = parseFloat(parseFloat(point.lng)) * Math.PI / 180;
				x = Math.cos(lat) * Math.cos(lng);
				y = Math.cos(lat) * Math.sin(lng);
				z = Math.sin(lat);
				X += x;
				Y += y;
				Z += z;
			}
      console.log(X, Y)
			X = X / point_num;
			Y = Y / point_num;
			Z = Z / point_num;

			var tmp_lng = Math.atan2(Y, X);
			var tmp_lat = Math.atan2(Z, Math.sqrt(X * X + Y * Y));

			return [tmp_lat * 180 / Math.PI, tmp_lng * 180 / Math.PI];
		}

	</script>

</body>
</html>
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值