实现效果:
map.js:
(function (win) {
function SurroundMap(mapId, lng, lat, searchCallback, options = {}) {
// 创建Map实例
let _this = this;
let map = new BMap.Map(mapId);
let point = new BMap.Point(lng, lat);
map.centerAndZoom(point, 15);
map.enableScrollWheelZoom(true);
map.addControl(new BMap.NavigationControl());
// 设定1000米圆形范围
let circle = new BMap.Circle(point, 1000, {
fillColor: "blue",
strokeWeight: 1,
fillOpacity: 0.1,
strokeOpacity: 0.1
});
map.addOverlay(circle);
this.options = {};
this.options.pageCapacity = 50;
this.options.renderOptions = { map, autoViewport: false, selectFirstResult: false };
this.options.onSearchComplete = function (results) {
let resultList = [];
map.clearOverlays();
map.addOverlay(circle);
for (let item of results.Ir) {
resultList.push({
point: item.point,
title: item.title,
address: item.address,
distance: parseInt(map.getDistance(point, item.point))
});
}
//需要改变this指向
_this._insertSearchResult(_this._currentSelector, resultList);
searchCallback(_this._currentSelector, resultList);
}
$.extend(true, this.options, options || {});
let local = new BMap.LocalSearch(map, this.options);
this._map = map;
this._point = point;
this._local = local;
this._circle = circle;
return this;
}
SurroundMap.prototype = {
constructor: SurroundMap,
_range: 1000,
_searchNearby: function (keymaps, currentSelector) {
let localSearch = this._local;
let range = this._range;
let point = this._point;
this._currentSelector = currentSelector;
localSearch.searchNearby(keymaps, point, range);
},
_openInfoWindow: function (currentItem) {
let content = `
<div class="map-popup">
<div class="popup-title">${currentItem.title}</div>
<div class="popup-content">${currentItem.address}</div>
</div>
`;
let infowindow = new BMap.InfoWindow(content, { offset: new BMap.Size(0, -10) });
this._map.openInfoWindow(infowindow, currentItem.point);
return this;
},
_insertSearchResult: function (insertSelector, resultList) {
let _html = '';
if (resultList.length < 1) {
_html = '<li>范围内没有相应的周边内容, 看看其他的内容吧</li>';
} else {
for (const item of resultList) {
_html = _html +
`<li>
<p class="clearfix">
<span class="location fl"><i></i>${item.title}</span>
<span class="distance fr">${item.distance}米</span>
</p>
<p class="address">${item.address}</p>
</li>`;
}
}
$(insertSelector).html(_html);
return this;
}
}
win.SurroundMap = SurroundMap;
})(window)
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>百度地图预研</title>
<link rel="stylesheet" type="text/css" href="//static.fczx.com/www/css/_common.css">
<link rel="stylesheet" type="text/css" href="//static.fczx.com/www/css/_module.css">
<link rel="stylesheet" type="text/css" href="//static.fczx.com/www/css/module/map.css">
<script src="//static.fczx.com/www/js/lib/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=kM1RFA6AzOnv6lmlc7qyOMhqBILu1pgk"></script>
</head>
<body>
<div class="box-content mt30">
<div class="box-surround table-detail">
<div class="table-detail-header">
<a href="" class="title">周边配套</a>
</div>
<div class="surround-content">
<div class="surround-map" id="surround-map"></div>
<div class="surround-mark">
<div class="surround-mark-tab">
<ul class="mark-tab-list" id="surroundMarkTab">
<li class="actived">交通</li>
<li>商业</li>
<li>学校</li>
<li>医院</li>
</ul>
</div>
<div class="surround-mark-content" id="surroundMarkContent">
<div class="mark-item has-tag" id="traffic">
<div class="item-tab">
<ul>
<li class="actived">公交</li>
<li>地铁</li>
<li>停车场</li>
<li>加油站</li>
</ul>
</div>
<ul class="item-list">
</ul>
</div>
<div class="mark-item has-tag" id="business">
<div class="item-tab">
<ul>
<li class="actived">超市</li>
<li>公园</li>
<li>餐饮</li>
<li>银行</li>
</ul>
</div>
<ul class="item-list">
</ul>
</div>
<div class="mark-item" id="school">
<ul class="item-list">
</ul>
</div>
<div class="mark-item" id="hospital">
<ul class="item-list">
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="//static.fczx.com/www/js/common/map.js"></script>
<script type="text/javascript">
$(document).ready(function () {
let lng = 112.141744;
let lat = 32.097901;
let mapId = "surround-map";
let firstContentList = $('#surroundMarkContent .mark-item');
let secondContentList = $('#surroundMarkContent .mark-item .item-list');
// 实例化自定义地图函数
let surroundMap = new SurroundMap(mapId, lng, lat, searchCallback);
// 初始化地图搜索结果
firstContentList.eq(0).show();
surroundMap._searchNearby('公交', '#traffic .item-list');
// 搜索列表自定义信息弹窗
function searchCallback(currentSelector, resultList) {
$(`${currentSelector} li`).each(function (index) {
$(this).click(function () {
let currentItem = resultList[index];
surroundMap._openInfoWindow(currentItem);
})
});
}
//一级菜单事件处理及判断二级菜单
$('#surroundMarkTab>li').each(function (index) {
$(this).click(function () {
$(this).siblings().removeClass('actived');
$(this).addClass('actived');
firstContentList.hide();
// 获取一级菜单对应的content
let targetContent = firstContentList.eq(index);
targetContent.show();
// 判断是否有二级菜单
let secondTab = targetContent.find('.item-tab li');
let targetContentId = targetContent.attr("id");
let contentSelector = `#${targetContentId} .item-list`
if (secondTab.length > 0) {
let mapKey = secondTab.first().text();
surroundMap._searchNearby(mapKey, contentSelector);
return;
}
surroundMap._searchNearby($(this).text(), contentSelector);
});
});
//二级菜单点击事件处理
$('#surroundMarkContent .item-tab li').each(function () {
$(this).click(function () {
$(this).siblings().removeClass('actived');
$(this).addClass('actived');
//获取目标父元素
let targetId = $(this).parents('.mark-item').attr('id');
surroundMap._searchNearby($(this).text(), `#${targetId} .item-list`);
});
});
});
</script>
</html>
css:
.surround-content {
position: relative;
height: 500px;
}
.surround-map {
height: 100%;
}
.surround-mark {
position: absolute;
right: 20px;
top: 20px;
height: 400px;
width: 400px;
overflow: hidden;
background-color: #fff;
box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
-webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
}
.surround-mark-tab .mark-tab-list {
height: 40px;
line-height: 40px;
border-bottom: 2px solid #11a43c;
color: #333;
background-color: #f2f2f2;
}
.surround-mark-tab .mark-tab-list li {
float: left;
width: 100px;
text-align: center;
cursor: pointer;
}
.surround-mark-tab .mark-tab-list li.actived {
color: #fff;
background-color: #11a43c;
}
.surround-mark-content {
width: 400px;
overflow: hidden;
}
.surround-mark-content .mark-item {
display: none;
color: #333;
}
.surround-mark-content .mark-item .item-empty {
height: 20px;
}
.surround-mark-content .mark-item .item-tab {
overflow: hidden;
padding: 12px 0 12px 20px;
border-bottom: 1px solid #f2f2f2;
}
.surround-mark-content .mark-item .item-tab li {
display: inline-block;
padding-right: 20px;
cursor: pointer;
}
.surround-mark-content .mark-item .item-tab li.actived {
color: #11a43c;
}
.surround-mark-content .mark-item .item-tab li:hover {
color: #11a43c;
}
.surround-mark-content .mark-item .item-list {
height: 345px;
overflow-y: auto;
}
.surround-mark-content .mark-item.has-tag .item-list {
height: 300px;
overflow-y: auto;
}
.surround-mark-content .mark-item .item-list li {
padding: 18px 20px;
border-bottom: 1px dashed #f2f2f2;
cursor: pointer;
}
.surround-mark-content .mark-item .item-list li:hover {
background-color: #f7f7f7;
}
.surround-mark-content .mark-item .item-list li .address {
font-size: 12px;
color: #999;
margin-top: 5px;
}
.surround-mark-content .mark-item .item-list li i {
position: relative;
top: -2px;
float: left;
width: 24px;
height: 24px;
background: url("../../assets/icons/icon_map.png") no-repeat center center;
}
/*map info window content*/
.map-popup .popup-title {
color: #333;
line-height: 30px;
max-width: 280px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
border-bottom: 1px solid #eee;
}
.map-popup .popup-content {
font-size: 12px;
line-height: 25px;
margin-top: 5px;
color: #999;
}