<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<link
href="http://ua.bigemap.com:30081/bmsdk/bigemap-gl.js/v1.1.0/Widgets/widgets.css"
rel="stylesheet"
/>
<script src="http://ua.bigemap.com:30081/bmsdk/bigemap-gl.js/v1.1.0/bigemap-gl.js"></script>
<style>
body {
margin: 0;
padding: 0;
}
#container {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
}
.bmgl-widget-credits {
display: none;
}
</style>
<title>Google Map Streets</title>
</head>
<body>
<div id="container"></div>
<script>
bmgl.Config.HTTP_URL = 'http://ua.bigemap.com:30081/bmsdk/';
var viewer = new bmgl.Viewer("container", {
mapId: "bigemap.dc-tian-w-satellite",
});
const initClusterCollection = (viewer) => {
// console.log(bmgl,'bbbb');
new bmgl.GeoJsonDataSource()
.load("/bmgl/cluster/poi.json")
.then((dataSource) => {
viewer.dataSources.add(dataSource);
// 設置聚合參數
dataSource.clustering.enabled = true;
dataSource.clustering.pixelRange = 60;
dataSource.clustering.minimumClusterSize = 4;
// foreach用于調用數組的每個元素,并將元素傳遞給回調函數。
dataSource.entities.values.forEach((entity) => {
// console.log(entity);
// 將點拉伸一定高度,防止被地形壓蓋
entity.position._value.z += 50.0;
// 使用大小為64*64的icon,縮小展示poi
entity.billboard = {
image: "/bmgl/cluster/point.png",
width: 32,
height: 32,
};
entity.label = {
// text: "POI",
text:entity._name,
font: "bold 15px Microsoft YaHei",
// 豎直對齊方式
verticalOrigin: bmgl.VerticalOrigin.CENTER,
// 水平對齊方式
horizontalOrigin: bmgl.HorizontalOrigin.LEFT,
// 偏移量
pixelOffset: new bmgl.Cartesian2(-14.0,-28.0),
};
});
// 添加監聽函數
dataSource.clustering.clusterEvent.addEventListener(
function (clusteredEntities, cluster) {
// 關閉自帶的顯示聚合數量的標簽
cluster.label.show = false;
cluster.billboard.show = true;
cluster.billboard.verticalOrigin =
bmgl.VerticalOrigin.BOTTOM;
// 根據聚合數量的多少設置不同層級的圖片以及大小
if (clusteredEntities.length >= 20) {
cluster.billboard.image =
combineIconAndLabel(
"/bmgl/cluster/jhGray.png",
clusteredEntities.length,
64
);
cluster.billboard.width = 72;
cluster.billboard.height = 72;
// cluster.billboard.scale = 0.6;
} else if (clusteredEntities.length >= 12) {
cluster.billboard.image =
combineIconAndLabel(
"/bmgl/cluster/jhBlue.png",
clusteredEntities.length,
64
);
cluster.billboard.width = 64;
cluster.billboard.height = 64;
// cluster.billboard.scale = 0.6;
} else if (clusteredEntities.length >= 8) {
cluster.billboard.image =
combineIconAndLabel(
"/bmgl/cluster/jhGreen.png",
clusteredEntities.length,
64
);
cluster.billboard.width = 56;
cluster.billboard.height = 56;
// cluster.billboard.scale = 0.6;
} else {
cluster.billboard.image =
combineIconAndLabel(
"/bmgl/cluster/jhRed.png",
clusteredEntities.length,
64
);
cluster.billboard.width = 40;
cluster.billboard.height = 40;
// cluster.billboard.scale = 0.6;
}
}
);
});
};
// 將使用的圖片和文字聯合轉換為canvas
const combineIconAndLabel = (url, label, size) => {
// 創建畫布對象
let canvas = document.createElement("canvas");
canvas.width = size;
canvas.height = size;
let ctx = canvas.getContext("2d");
let promise = new bmgl.Resource.fetchImage(url).then(
(image) => {
try {
ctx.drawImage(image, 0, 0);
} catch (e) {
console.log(e);
}
ctx.fillStyle = bmgl.Color.WHITE.toCssColorString();
ctx.font = "bold 12px Microsoft YaHei";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText(label, size / 4, size / 4);
// console.log(`ctx`,ctx);
return canvas;
}
);
return promise;
};
// 初始化點位聚合
initClusterCollection(viewer)
</script>
</body>
</html>