vue-cesium
Version:
Vue 3.x components for CesiumJS.
352 lines (347 loc) • 12.5 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
require('../../../composables/index.js');
var cesiumProps = require('../../../utils/cesium-props.js');
var util = require('../../../utils/util.js');
var emits = require('../../../utils/emits.js');
require('../../../shared/index.js');
var render = require('../../../utils/private/render.js');
var lodashUnified = require('lodash-unified');
var index = require('../../../composables/use-primitives/index.js');
var PrimitiveCluster$1 = require('../../../shared/src/PrimitiveCluster.js');
;
const primitiveClusterProps = {
...cesiumProps.show,
enabled: {
type: Boolean,
default: true
},
pixelRange: {
type: Number,
default: 80
},
minimumClusterSize: {
type: Number,
default: 2
},
clusterBillboards: {
type: Boolean,
default: true
},
clusterLabels: {
type: Boolean,
default: true
},
clusterPoints: {
type: Boolean,
default: true
},
billboards: {
type: Array,
default: () => []
},
labels: {
type: Array,
default: () => []
},
points: {
type: Array,
default: () => []
},
...cesiumProps.enableMouseEvent
};
var PrimitiveCluster = vue.defineComponent({
name: "VcPrimitiveCluster",
props: primitiveClusterProps,
emits: {
...emits.primitiveEmits,
clusterEvent: (ids, cluster) => true
},
setup(props, ctx) {
var _a;
const instance = vue.getCurrentInstance();
instance.cesiumClass = "VcPrimitiveCluster";
instance.cesiumEvents = ["clusterEvent"];
const primitivesState = index["default"](props, ctx, instance);
const unwatchFns = [];
unwatchFns.push(
vue.watch(
() => props.show,
(val) => {
const primitiveCluster = instance.cesiumObject;
primitiveCluster.show = val;
}
)
);
unwatchFns.push(
vue.watch(
() => props.enabled,
(val) => {
const primitiveCluster = instance.cesiumObject;
primitiveCluster.enabled = val;
}
)
);
unwatchFns.push(
vue.watch(
() => props.minimumClusterSize,
(val) => {
const primitiveCluster = instance.cesiumObject;
primitiveCluster.minimumClusterSize = val;
}
)
);
unwatchFns.push(
vue.watch(
() => props.clusterBillboards,
(val) => {
const primitiveCluster = instance.cesiumObject;
primitiveCluster.clusterBillboards = val;
instance.proxy["reload"]();
}
)
);
unwatchFns.push(
vue.watch(
() => props.clusterLabels,
(val) => {
const primitiveCluster = instance.cesiumObject;
primitiveCluster.clusterLabels = val;
instance.proxy["reload"]();
}
)
);
unwatchFns.push(
vue.watch(
() => props.clusterBillboards,
(val) => {
const primitiveCluster = instance.cesiumObject;
primitiveCluster.clusterPoints = val;
instance.proxy["reload"]();
}
)
);
unwatchFns.push(
vue.watch(
() => lodashUnified.cloneDeep(props.billboards),
(newVal, oldVal) => {
if (!instance.mounted) {
return;
}
const primitiveCluster = instance.cesiumObject;
const billboardCollection = primitiveCluster._billboardCollection;
if (newVal.length === oldVal.length) {
const modifies = [];
for (let i = 0; i < newVal.length; i++) {
const options = newVal[i];
const oldOptions = oldVal[i];
if (JSON.stringify(options) !== JSON.stringify(oldOptions)) {
modifies.push({
newOptions: options,
oldOptions
});
}
}
modifies.forEach((modify) => {
const modifyBillboard = billboardCollection._billboards.find((v) => (v == null ? void 0 : v.id) === modify.oldOptions.id);
modifyBillboard && Object.keys(modify.newOptions).forEach((prop) => {
if (modify.oldOptions[prop] !== modify.newOptions[prop]) {
modifyBillboard[prop] = primitivesState == null ? void 0 : primitivesState.transformProp(prop, modify.newOptions[prop]);
}
});
});
} else {
const addeds = lodashUnified.differenceBy(newVal, oldVal, "id");
const deletes = lodashUnified.differenceBy(oldVal, newVal, "id");
const deleteBillboards = [];
for (let i = 0; i < deletes.length; i++) {
const deleteBillboard = billboardCollection._billboards.find((v) => v.id === deletes[i].id);
deleteBillboard && deleteBillboards.push(deleteBillboard);
}
deleteBillboards.forEach((v) => {
billboardCollection.remove(v);
});
addBillboards(billboardCollection, addeds);
setTimeout(() => {
primitivesState.$services.viewer.scene.camera.changed.raiseEvent();
});
}
},
{
deep: true
}
)
);
unwatchFns.push(
vue.watch(
() => lodashUnified.cloneDeep(props.labels),
(newVal, oldVal) => {
if (!instance.mounted) {
return;
}
const primitiveCluster = instance.cesiumObject;
const labelCollection = primitiveCluster._labelCollection;
if (newVal.length === oldVal.length) {
const modifies = [];
for (let i = 0; i < newVal.length; i++) {
const options = newVal[i];
const oldOptions = oldVal[i];
if (JSON.stringify(options) !== JSON.stringify(oldOptions)) {
modifies.push({
newOptions: options,
oldOptions
});
}
}
modifies.forEach((modify) => {
const modifyLabel = labelCollection._labels.find((v) => v.id === modify.oldOptions.id);
modifyLabel && Object.keys(modify.newOptions).forEach((prop) => {
if (modify.oldOptions[prop] !== modify.newOptions[prop]) {
modifyLabel[prop] = primitivesState.transformProp(prop, modify.newOptions[prop]);
}
});
});
} else {
const addeds = lodashUnified.differenceBy(newVal, oldVal, "id");
const deletes = lodashUnified.differenceBy(oldVal, newVal, "id");
const deleteLabels = [];
for (let i = 0; i < deletes.length; i++) {
const deleteLabel = labelCollection._labels.find((v) => v.id === deletes[i].id);
deleteLabel && deleteLabels.push(deleteLabel);
}
deleteLabels.forEach((v) => {
labelCollection.remove(v);
});
addLabels(labelCollection, addeds);
setTimeout(() => {
primitivesState.$services.viewer.scene.camera.changed.raiseEvent();
});
}
},
{
deep: true
}
)
);
unwatchFns.push(
vue.watch(
() => lodashUnified.cloneDeep(props.points),
(newVal, oldVal) => {
if (!instance.mounted) {
return;
}
const primitiveCluster = instance.cesiumObject;
const pointCollection = primitiveCluster._pointCollection;
if (newVal.length === oldVal.length) {
const modifies = [];
for (let i = 0; i < newVal.length; i++) {
const options = newVal[i];
const oldOptions = oldVal[i];
if (JSON.stringify(options) !== JSON.stringify(oldOptions)) {
modifies.push({
newOptions: options,
oldOptions
});
}
}
modifies.forEach((modify) => {
const modifyPoint = pointCollection._pointPrimitives.find((v) => v && v.id === modify.oldOptions.id);
modifyPoint && Object.keys(modify.newOptions).forEach((prop) => {
if (modify.oldOptions[prop] !== modify.newOptions[prop]) {
modifyPoint[prop] = primitivesState.transformProp(prop, modify.newOptions[prop]);
}
});
});
} else {
const addeds = lodashUnified.differenceBy(newVal, oldVal, "id");
const deletes = lodashUnified.differenceBy(oldVal, newVal, "id");
const deletePoints = [];
for (let i = 0; i < deletes.length; i++) {
const deletePoint = pointCollection._pointPrimitives.find((v) => v.id === deletes[i].id);
deletePoint && deletePoints.push(deletePoint);
}
deletePoints.forEach((v) => {
pointCollection.remove(v);
});
addPoints(pointCollection, addeds);
setTimeout(() => {
primitivesState.$services.viewer.scene.camera.changed.raiseEvent();
});
}
},
{
deep: true
}
)
);
instance.createCesiumObject = async () => {
const primitiveCluster = new PrimitiveCluster$1["default"]({
show: props.show,
enabled: props.enabled,
pixelRange: props.pixelRange,
minimumClusterSize: props.minimumClusterSize,
clusterBillboards: props.clusterBillboards,
clusterLabels: props.clusterLabels,
clusterPoints: props.clusterPoints
});
const billboardCollection = new Cesium.BillboardCollection();
addBillboards(billboardCollection, props.billboards);
const labelCollection = new Cesium.LabelCollection();
addLabels(labelCollection, props.labels);
const pointCollection = new Cesium.PointPrimitiveCollection();
addPoints(pointCollection, props.points);
primitiveCluster._billboardCollection = billboardCollection;
primitiveCluster._labelCollection = labelCollection;
primitiveCluster._pointCollection = pointCollection;
primitiveCluster._initialize(primitivesState.$services.viewer.scene);
setTimeout(() => {
primitivesState.$services.viewer.scene.camera.changed.raiseEvent();
});
return primitiveCluster;
};
const addPoints = (pointCollection, points) => {
for (let i = 0; i < points.length; i++) {
const pointOptions = points[i];
pointOptions.id = Cesium.defined(pointOptions.id) ? pointOptions.id : Cesium.createGuid();
const pointOptionsTransform = primitivesState.transformProps(pointOptions);
const point = pointCollection.add(pointOptionsTransform);
util.addCustomProperty(point, pointOptionsTransform);
}
};
const addBillboards = (billboardCollection, billboards) => {
for (let i = 0; i < billboards.length; i++) {
const billboardOptions = billboards[i];
billboardOptions.id = Cesium.defined(billboardOptions.id) ? billboardOptions.id : Cesium.createGuid();
const billboardOptionsTransform = primitivesState.transformProps(billboardOptions);
const billboard = billboardCollection.add(billboardOptionsTransform);
util.addCustomProperty(billboard, billboardOptionsTransform);
}
};
const addLabels = (labelCollection, labels) => {
for (let i = 0; i < labels.length; i++) {
const labelOptions = labels[i];
labelOptions.id = Cesium.defined(labelOptions.id) ? labelOptions.id : Cesium.createGuid();
const labelOptionsTransform = primitivesState.transformProps(labelOptions);
const label = labelCollection.add(labelOptionsTransform);
util.addCustomProperty(label, labelOptionsTransform);
}
};
vue.onUnmounted(() => {
unwatchFns.forEach((item) => item());
unwatchFns.length = 0;
});
const name = ((_a = instance.proxy) == null ? void 0 : _a.$options.name) || "";
return () => ctx.slots.default ? vue.h(
"i",
{
class: util.kebabCase(name),
style: { display: "none !important" }
},
render.hSlot(ctx.slots.default)
) : vue.createCommentVNode(util.kebabCase(name));
}
});
exports["default"] = PrimitiveCluster;
exports.primitiveClusterProps = primitiveClusterProps;
//# sourceMappingURL=index.js.map
;