百度地图分不同色块显示某个城市的行政区划,并添加城市(区)名,包括在不同的zoom缩放范围下标签的显示隐藏
效果如下:

先拉代码跑一跑
<!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" />
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=2.0&ak=你的ak"></script>
</script>
<title>添加行政区划</title>
<style type="text/css">
body,
html,
#allmap {
width: 100%;
height: 100%;
overflow: hidden;
margin: 0;
}
.btn {
position: absolute;
top: 10px;
left: 50%;
transform: translateX(-50%);
}
</style>
</head>
<body>
<div id="allmap"></div>
<div class="btn">
<button onclick="selectCity(0)">北京</button>
<button onclick="selectCity(1)">上海</button>
</div>
</body>
</html>
<script type="text/javascript">
var map = new BMap.Map("allmap");
map.enableScrollWheelZoom();
map.setMapStyle({
styleJson: [{
"featureType": "poi",
"elementType": "all",
"stylers": {
"color": "#ffffff",
"visibility": "off"
}
},
{
"featureType": "road",
"elementType": "all",
"stylers": {
"color": "#ffffff",
"visibility": "off"
}
},
]
});
var blist = [];
var districtLoading = 0;
selectCity(1)
function selectCity(index) {
blist = [];
setTimeout(() => {
var arr = [{
name: '北京市',
cityArr: [
"顺义区", "昌平区", "西城区", "朝阳区", "东城区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "大兴区", "怀柔区", "平谷区",
"密云区", "延庆区"
]
}, {
name: '上海市',
cityArr: [
"黄浦区", "徐汇区", "长宁区", "静安区", "普陀区 ", "虹口区", "杨浦区", "浦东新区", "闵行区", "宝山区", "嘉定区", "金山区", "松江区", "青浦区",
"奉贤区", "崇明区"
]
}]
getBoundary(arr[index].name, arr[index].cityArr);
}, 100);
}
function getBoundary(cityName, cityArr) {
map.centerAndZoom(cityName, 11);
var bdary = new BMap.Boundary();
bdary.get(cityName, function (rs) {
map.clearOverlays();
var count = rs.boundaries.length;
for (var i = 0; i < count; i++) {
var ply = new BMap.Polygon(rs.boundaries[i], {
strokeWeight: 0.01,
strokeColor: "#ffffff"
});
map.addOverlay(ply);
map.setViewport(ply.getPath());
}
});
cityArr.forEach(element => {
addDistrict(element);
});
}
function RandomColor() {
let r, g, b;
r = Math.floor((Math.random() > 0 ? Math.random() : (Math.random() + 0.1)) * 256);
g = Math.floor((Math.random() > 0 ? Math.random() : (Math.random() + 0.1)) * 256);
b = Math.floor((Math.random() > 0 ? Math.random() : (Math.random() + 0.1)) * 256);
return "rgb(" + r + ',' + g + ',' + b + ")";
}
function addDistrict(districtName) {
districtLoading++;
var bdary = new BMap.Boundary();
bdary.get(districtName, function (rs) {
var count = rs.boundaries.length;
if (count === 0) {
alert('未能获取当前输入行政区域');
return;
}
for (var i = 0; i < count; i++) {
blist.push({
points: rs.boundaries[i],
name: districtName,
color: RandomColor()
});
};
districtLoading--;
if (districtLoading == 0) {
drawBoundary();
}
});
}
function drawBoundary() {
var pointArray = [];
var pNW = {
lat: 59.0,
lng: 73.0
}
var pNE = {
lat: 59.0,
lng: 136.0
}
var pSE = {
lat: 3.0,
lng: 136.0
}
var pSW = {
lat: 3.0,
lng: 73.0
}
var pArray = [];
pArray.push(pNW);
pArray.push(pSW);
pArray.push(pSE);
pArray.push(pNE);
pArray.push(pNW);
map.clearOverlays();
for (var i = 0; i < blist.length; i++) {
citySetLabel(blist[i].name);
var ply;
if (blist[i].name === '朝阳区') {
ply = new BMap.Polygon(blist[i].points, {
strokeWeight: 2,
strokeColor: "#999",
fillOpacity: 1,
fillColor: '#eee'
});
} else {
ply = new BMap.Polygon(blist[i].points, {
strokeWeight: 2,
strokeColor: "#999",
fillOpacity: 1,
fillColor: blist[i].color
});
}
map.addOverlay(ply);
var path = ply.getPath();
pointArray = pointArray.concat(path);
pArray = pArray.concat(path);
pArray.push(pArray[0]);
}
}
function citySetLabel(cityName) {
var local = new BMap.LocalSearch(map, {
onSearchComplete: function () {
var cityCenter = local.getResults().getPoi(0).point;
var label = new BMap.Label(cityName, {
offset: new BMap.Size(-20, -10),
position: cityCenter
});
label.setStyle({
border: 'red',
background: 'red',
'font-size': '0.25rem',
color: '#fff',
});
map.addOverlay(label);
},
});
local.search(cityName);
}
map.addEventListener("zoomend", function (evt) {
console.log(map.getZoom())
if (map.getZoom() < 10) {
hideLabel()
} else {
showLabel()
}
});
function showLabel() {
var markers = map.getOverlays();
for (var i = 0; i < markers.length; i++) {
if (markers[i].toString() == "[object Label]") {
markers[i].show();
}
}
}
function hideLabel() {
var markers = map.getOverlays();
for (var i = 0; i < markers.length; i++) {
if (markers[i].toString() == "[object Label]") {
markers[i].hide();
}
}
}
</script>