Cesium-Examples/examples/cesiumEx/2.3.17、聚合.html

225 lines
7.0 KiB
HTML
Raw Normal View History

2025-03-11 08:25:45 +00:00
<!--********************************************************************
* by jiawanlong
*********************************************************************-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link
rel="stylesheet"
2025-03-19 03:00:22 +00:00
href="./../../libs/cesium/Cesium1.98/Widgets/widgets.css"
2025-03-11 08:25:45 +00:00
/>
<script
type="text/javascript"
2025-03-19 03:00:22 +00:00
src="./../../libs/cesium/Cesium1.98/Cesium.js"
2025-03-11 08:25:45 +00:00
></script>
</head>
<body
style="
margin: 0;
overflow: hidden;
background: #fff;
width: 100%;
height: 100%;
position: absolute;
top: 0;
"
>
<div id="map" style="margin: 0 auto; width: 100%; height: 100%"></div>
<!-- ./video.mp4 -->
<script type="text/javascript">
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3ZjQ5ZGUzNC1jNWYwLTQ1ZTMtYmNjYS05YTY4ZTVmN2I2MDkiLCJpZCI6MTE3MTM4LCJpYXQiOjE2NzY0NDUyODB9.ZaNSBIfc1sGLhQd_xqhiSsc0yr8oS0wt1hAo9gbke6M";
const viewer = new Cesium.Viewer("map", {});
viewer.scene.debugShowFramesPerSecond = true;
//viewer.scene.globe.depthTestAgainstTerrain = true;
class pointCluster {
constructor(opt) {
this.options = {
dataOrUrl: "",
pixelRange: 15,
enabled: true,
colorArr: [
{
num: 1,
size: 48,
color: "#e6a23cbb",
},
],
img: "",
};
this.options = Object.assign(this.options, opt);
this.viewer = opt.viewer;
this.dataSources = null;
this.clustericon = {};
if (this.options.dataOrUrl && this.options.dataOrUrl != "") {
this.loadjson();
}
}
loadjson() {
var this_ = this;
new Cesium.GeoJsonDataSource()
.load(this_.options.dataOrUrl)
.then((geoJsonDataSource) => {
this_.showcluster(geoJsonDataSource);
});
}
showcluster(geoJsonDataSource) {
var this_ = this;
this.dataSources = geoJsonDataSource;
this.viewer.dataSources.add(this.dataSources);
var pixelRange = this.options.pixelRange;
var minimumClusterSize = 1;
var enabled = this.options.enabled;
//开启聚合
this.dataSources.clustering.enabled = enabled;
this.dataSources.clustering.pixelRange = pixelRange;
this.dataSources.clustering.minimumClusterSize = minimumClusterSize;
var removeListener;
//聚合
function customStyle() {
if (Cesium.defined(removeListener)) {
removeListener();
removeListener = undefined;
} else {
removeListener =
this_.dataSources.clustering.clusterEvent.addEventListener(
function (clusteredEntities, cluster) {
cluster.label.show = false;
cluster.billboard.show = true;
cluster.billboard.id = cluster.label.id;
cluster.billboard.verticalOrigin =
Cesium.VerticalOrigin.CENTER;
var xx = -1;
for (var i = 0; i < this_.options.colorArr.length; i++) {
if (
clusteredEntities.length > this_.options.colorArr[i].num
) {
xx = i;
}
}
if (xx == -1) {
cluster.billboard.image = this_.options.img;
} else {
cluster.billboard.image = this_.drawImage(
clusteredEntities.length,
this_.options.colorArr[xx].size,
this_.options.colorArr[xx].color
);
}
}
);
}
// force a re-cluster with the new styling
var pixelRange = this_.dataSources.clustering.pixelRange;
this_.dataSources.clustering.pixelRange = 0;
this_.dataSources.clustering.pixelRange = pixelRange;
}
customStyle();
}
drawImage(text, size, color) {
if (this.clustericon[text + "_" + size + "_" + color]) {
return this.clustericon[text + "_" + size + "_" + color];
}
var canvas = document.createElement("canvas");
canvas.height = size;
canvas.width = size;
var ctx = canvas.getContext("2d");
//画圈
ctx.beginPath();
ctx.arc(size / 2, size / 2, size / 2, 0, Math.PI * 2, true);
ctx.fillStyle = color;
ctx.closePath();
ctx.fill();
ctx.font = "16px bold 楷体";
ctx.fillStyle = "#ffffff";
var tx = (size - (text + "").length * 9) / 2;
ctx.fillText(text, tx, size / 2 + 6);
var canvasdataurl = canvas.toDataURL();
this.clustericon[text + "_" + size + "_" + color] = canvasdataurl;
return canvasdataurl;
}
remove() {
this.viewer.dataSources.remove(this.dataSources);
this.dataSources = null;
this.clustericon = {};
}
}
function randomPointsWithinBbox(xmin, xmax, ymin, ymax, num, type) {
if (type && type == "geojson") {
var points = {
type: "FeatureCollection",
features: [],
};
for (var i = 0; i < num; i++) {
var point = {
type: "Feature",
properties: {
value: parseInt(Math.random() * 10000000),
},
geometry: {
type: "Point",
coordinates: [
Math.random() * (xmax - xmin) + xmin,
Math.random() * (ymax - ymin) + ymin,
],
},
};
points.features.push(point);
}
return points;
} else {
var points = [];
for (var i = 0; i < num; i++) {
var point = {
x: Math.random() * (xmax - xmin) + xmin,
y: Math.random() * (ymax - ymin) + ymin,
};
points.push(point);
}
return points;
}
}
var results = randomPointsWithinBbox(-120, -90, 25, 40, 10000, "geojson");
var clu = new pointCluster({
viewer: viewer,
dataOrUrl: results,
pixelRange: 20,
colorArr: [
{
num: 1,
size: 30,
color: "#1c86d1cc",
},
{
num: 50,
size: 32,
color: "#67c23acc",
},
{
num: 100,
size: 34,
color: "#f56c6ccc",
},
{
num: 200,
size: 36,
color: "#e6a23ccc",
},
],
img: "./marker6.png",
});
</script>
</body>
</html>