天地图 多个标注及点击弹出用户自定义信息窗口

天地图3.0 web api JavaScript 标注 用户自定义信息窗口

很多使用天地图WEB API的朋友都会问为什么循环添加的标注点,注册点击事件总是响应最后添加的marker?

这里介绍一个如何循环添加标注点,并且正确响应,还有自定义marker属性问题,直接上代码。
map.html

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
<title>天地图-地图API-范例-自定义信息窗口</title> 
<script type="text/javascript" src="http://api.tianditu.gov.cn/api?v=3.0&tk=您的密钥"></script> 

</head> 
<body onLoad="onLoad()"> 
	<div id="mapDiv" style="position:absolute;width:600px; height:500px;"></div> 
	<div style="position:absolute;left:620px;"> 
		<ul> 
			<li>本示例演示如何在地图上显示多个自定义信息浮窗。</li> 
		</ul> 
	</div> 
</body> 
</html>
<script type="text/javascript" src="js/map.js"></script> 

map.js

var map, zoom = 12,marker,markerclick;
var customerWinInfo = null;

function onLoad() {
    //初始化地图对象
    map = new TMap("mapDiv");
    //设置显示地图的中心点和级别
    map.centerAndZoom(new TLngLat(121.44623, 31.2395), zoom);
    map.enableDoubleClickZoom();
    map.enableHandleMouseScroll();
    map.enableInertia();

    var data_info = [[121.4658, 31.22629], [121.44795, 31.22702], [121.48434, 31.22658], [121.47284, 31.221]];
    for (var i = 0; i < data_info.length; i++) {
        marker = new TMarker(new TLngLat(data_info[i][0], data_info[i][1]));
        //为marker添加属性,属性名可以自定义
        marker.id=i;
        marker.info = Math.random();
        (function(){
            var m = marker;
            markerclick = TEvent.addListener(m,"click",function (p) {
                onClose()
                var html = [];
                html.push('<div style="background:#CCCC99;height:20px;color:#000;width:135px;">');
                html.push('     <span style="width:100px;float:left;margin-left:2px;background:">自定义信息窗口</span><span  style="width:30px;float:right;margin-right:2px;" οnclick="onClose();">关闭</span>');
                html.push('</div>');
                html.push('<div id="deliver-legend-ctrl" style="background:#fff;border:1px solid #C0C0C0;">');
                html.push(' <table cellspacing="0" cellspadding="0" style="width:130px;border:1px solid #ff0000;">');
                html.push('     <tr align="center" style="height:10px;">');
                html.push('         <td></td>');
                html.push('         <td><a herf="javascript:void(0);"></a></td>');
                html.push('     </tr>');
                html.push('     <tr align="center">');
                html.push('         <td>经度:</td>');
                html.push('         <td>'+m.getLngLat().getLng()+'</td>');
                html.push('     </tr>');
                html.push('     <tr align="center">');
                html.push('         <td>纬度:</td>');
                html.push('         <td>'+m.getLngLat().getLat()+'</td>');
                html.push('     </tr>');
                html.push('     <tr style="height:10px;">');
                html.push('         <td></td>');
                html.push('         <td><a herf="javascript:void(0);"></a></td>');
                html.push('     </tr>');
                html.push(' </table>');
                html.push('</div>');
                var config = {
                    offset:new TPixel(0,0),
                    position:m.getLngLat()
                }
                customerWinInfo=new TLabel(config);
                customerWinInfo.setTitle('');
                customerWinInfo.setLabel(html.join(''));
                customerWinInfo.getObject().style.zIndex = 10000;
                map.addOverLay(customerWinInfo);
                var obj = customerWinInfo.getObject();
                var width = parseInt(obj.offsetWidth);
                var height = parseInt(obj.offsetHeight);
                var icon = this.getIcon();
                var anchor_icon = icon.getAnchor();
                var pixel = new TPixel(width/-2,height/-2-anchor_icon[1]);
                customerWinInfo.setOffset(pixel);

            })

        })();
        map.addOverLay(marker)
    }
}
function onClose(){
    map.removeOverLay(customerWinInfo);
}

onLoad();

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果要在百度地图上同时展示多个信息窗口,可以使用覆盖物群组(MarkerClusterer)来实现。具体步骤如下: 1. 创建一个地图实例,并地图中心和缩放级别 ```javascript var map = new BMap.Map("map-container"); var point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 12); ``` 2. 创建多个标注点,并将它们添加到地图上 ```javascript // 假有10个标注点 var markers = [ new BMap.Marker(new BMap.Point(116.405, 39.915)), new BMap.Marker(new BMap.Point(116.406, 39.915)), new BMap.Marker(new BMap.Point(116.407, 39.915)), // ... new BMap.Marker(new BMap.Point(116.414, 39.915)) ]; map.addOverlay(markers[0]); map.addOverlay(markers[1]); map.addOverlay(markers[2]); // ... map.addOverlay(markers[9]); ``` 3. 创建每个标注点对应的信息窗口,并将它们存储在一个数组中 ```javascript // 假有10个标注点,对应的信息窗口分别为infoWindow1, infoWindow2, ..., infoWindow10 var infoWindows = [ new BMap.InfoWindow("这是标注点1的信息窗口"), new BMap.InfoWindow("这是标注点2的信息窗口"), new BMap.InfoWindow("这是标注点3的信息窗口"), // ... new BMap.InfoWindow("这是标注点10的信息窗口") ]; ``` 4. 创建一个MarkerClusterer实例,并将标注点添加到MarkerClusterer中 ```javascript var markerClusterer = new BMapLib.MarkerClusterer(map, { markers: markers }); ``` 5. 遍历每个标注点,并为它们添加点击事件,点击时打开对应的信息窗口 ```javascript for (var i = 0; i < markers.length; i++) { markers[i].addEventListener("click", function(e){ var index = markers.indexOf(e.target); map.openInfoWindow(infoWindows[index], e.target.getPosition()); }); } ``` 这样,当用户点击某个标注点时,就会根据标注点的位置打开对应的信息窗口。而且,由于使用了MarkerClusterer,当多个标注点靠得很近时,它们会自动合并成一个标注点,从而避免了地图信息窗口过于拥挤的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值