ts/src/views/Hangjing/hooks/hangjingPolygon.ts

217 lines
5.7 KiB
TypeScript
Raw Normal View History

2025-01-13 08:45:08 +00:00
import { Subscriber } from 'cesium-extends'
2024-12-09 06:44:52 +00:00
import chroma from 'chroma-js'
import { parseWKT } from '@/utils/parseWKT'
import { difference } from 'lodash'
import { polygonGradient } from '@/js/polygonGradient'
import { polygonMaterial } from '@/js/polygon'
import { centerOfMass } from '@turf/turf'
import { useHangjingPopup } from './hangjingPopup'
const { createPopup } = useHangjingPopup()
export const useHjPolygon = (polygonMap: Map<string | number, any>) => {
let subscriber: Subscriber | null = null
const colors = new Map()
function addHangjingPolygon(data: Record<string, any>[]) {
subscriber = new Subscriber(viewer, {
pickResult: {
enable: true,
},
})
const ids = data.map(item => item.id)
const addIds = difference(ids, [...polygonMap.keys()])
const removeIds = difference([...polygonMap.keys()], ids)
// 添加
if (addIds.length > 0) {
addIds.forEach(id => {
const item = data.find(item => item.id === id)
if (item) {
if (item.zoneList.length > 0) {
item.zoneList.forEach(zone => {
addPolygon(zone, id)
})
} else {
addPolygon(item)
}
}
})
}
// 删除
if (removeIds.length > 0) {
console.log(removeIds, 'removeIds')
removeIds.forEach(id => {
removeEventSub(polygonMap.get(id))
removeHangjingPolygon(id)
})
}
}
function addPolygon(item, parentId: number | null = null) {
const { id, geom } = item
const feature = parseWKT(geom)
const position = feature.coordinates[0].map(pos => {
return Cesium.Cartesian3.fromDegrees(...pos)
})
// console.log(item, id, position, 'id, position, color')
// const randomColor =
// '#' + Math.random().toString(16).substring(2, 8).padEnd(6, '0')
// if (!colors.has(id)) {
// const randomColor = chroma.random().alpha(0.5).hex()
// colors.set(id, randomColor)
// }
// if (zoneId) {
// if()
// }
const curId = parentId || id
if (!colors.has(curId)) {
const randomColor = chroma.random().brighten().alpha(0.6).hex()
colors.set(curId, randomColor)
}
const color = colors.get(curId)
const polygon = addPrimitivePolygon({
id,
color: color,
position,
})
const centerPoint = centerOfMass(feature).geometry.coordinates
2025-01-13 08:45:08 +00:00
const centerEntity = addPolygonCenter(centerPoint)
2024-12-09 06:44:52 +00:00
addEventSub({
parentId,
id,
entity: polygon,
hjData: { ...item, centerPoint },
})
if (parentId) {
if (polygonMap.get(parentId)) {
polygonMap.get(parentId).push(polygon)
} else {
polygonMap.set(parentId, [polygon])
}
2025-01-13 08:45:08 +00:00
polygonMap.get(parentId).push(centerEntity)
2024-12-09 06:44:52 +00:00
} else {
polygonMap.set(id, polygon)
}
// console.log(polygonMap, 'polygonMap')
}
2025-01-13 08:45:08 +00:00
function addPolygonCenter(centerPoint: number[]) {
return viewer.entities.add({
show: false,
position: Cesium.Cartesian3.fromDegrees(...centerPoint),
point: {
pixelSize: 10,
color: Cesium.Color.RED,
},
})
}
2024-12-09 06:44:52 +00:00
function addPrimitivePolygon({
id,
position,
color,
}: {
id: string
position: Cesium.Cartesian3[]
color: string
}): Cesium.Primitive {
// const polygonOptions = {
// extrudedHeight: 5000,
// polygonHierarchy: new Cesium.PolygonHierarchy(position),
// }
// const geometry = new Cesium.PolygonGeometry(polygonOptions)
// const geometryInstance = new Cesium.GeometryInstance({
// geometry: geometry,
// id,
// })
// const primitive = new Cesium.Primitive({
// releaseGeometryInstances: false,
// asynchronous: false,
// geometryInstances: [geometryInstance],
// appearance: new Cesium.EllipsoidSurfaceAppearance({
// material: polygonGradient(color),
// }),
// })
// return viewer.scene.primitives.add(primitive)
return viewer.entities.add({
id,
2025-01-13 08:45:08 +00:00
polyline: {
positions: position,
width: 1,
material: Cesium.Color.RED,
},
2024-12-09 06:44:52 +00:00
polygon: {
hierarchy: new Cesium.PolygonHierarchy(position),
2025-01-13 08:45:08 +00:00
material: Cesium.Color.fromCssColorString(color),
// material: polygonMaterial(color),
2024-12-09 06:44:52 +00:00
// material: polygonGradient(color),
// heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
},
})
}
function removeHangjingPolygon(id: string) {
if (polygonMap.has(id)) {
const polygon = polygonMap.get(id)
if (polygon instanceof Array) {
polygon.forEach(item => {
// viewer.scene.primitives.remove(item)
viewer.entities.remove(item)
})
} else {
// viewer.scene.primitives.remove(polygonMap.get(id))
viewer.entities.remove(polygonMap.get(id))
}
// viewer.entities.remove(hangjingMap.get(id))
polygonMap.delete(id)
}
}
function addEventSub({
parentId,
id,
entity,
hjData,
}: {
parentId: number | null
id: number
entity: Cesium.Entity
hjData: Record<string, any>
}) {
subscriber &&
subscriber.add(
entity,
(movement, entity) => {
// console.log(movement, 'movement')
// console.log(hjData, 'hjData')
const position = Cesium.Cartesian3.fromDegrees(...hjData.centerPoint)
;(polygonMap.has(id) || polygonMap.has(parentId)) &&
createPopup(id, { _value: position }, hjData)
},
'LEFT_CLICK'
)
// console.log(subscriber, '-------')
}
function removeEventSub(entity: Cesium.Entity) {
subscriber && subscriber.remove(entity, 'LEFT_CLICK')
}
return {
addHangjingPolygon,
removeHangjingPolygon,
}
}