267 lines
8.8 KiB
JavaScript
267 lines
8.8 KiB
JavaScript
import { getHost, getToken } from "../../on";
|
|
class DTH {
|
|
constructor(sdk, options = {}) {
|
|
this.sdk = sdk
|
|
this.primitives = {
|
|
building: [],
|
|
dth: []
|
|
}
|
|
this.options = {...options}
|
|
this.options.host = this.options.host || getHost()
|
|
this.temporaryDth = []
|
|
this.dth = {}
|
|
this.HandlePickHouseEvent = new Cesium.Event();
|
|
this.initEvents()
|
|
}
|
|
|
|
/**
|
|
* @description 注册分户点击的事件回调
|
|
* @memberOf DTH
|
|
* */
|
|
houseSelectedCallback(that, cb) {
|
|
this.HandlePickHouseEvent.addEventListener(
|
|
cb,
|
|
that
|
|
)
|
|
}
|
|
|
|
//场景事件
|
|
initEvents() {
|
|
new Cesium.ScreenSpaceEventHandler(this.sdk.viewer.scene.canvas).setInputAction(((e) => {
|
|
if (!this.isActivate) return;
|
|
let pickFeature = this.sdk.viewer.scene.pick(e.position);
|
|
if (pickFeature) {
|
|
//点击了已有的分户单体化
|
|
if (pickFeature.primitive && pickFeature.primitive instanceof Cesium.ClassificationPrimitive && pickFeature.id && pickFeature.id.type == "dth") {
|
|
this.getIDBypickFeature(pickFeature); //处理点击到的楼层
|
|
return;
|
|
}
|
|
|
|
if (pickFeature.id && pickFeature.id.type === 'highlight') {
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.highlightPrimitive && this.sdk.viewer.scene.primitives.remove(this.highlightPrimitive)
|
|
let position = this.sdk.viewer.scene.pickPosition(e.position); //屏幕坐标转为笛卡尔空间坐标
|
|
if (!position) return;
|
|
|
|
let c = Cesium.Cartographic.fromCartesian(position); //笛卡尔坐标转为经纬度(弧度)
|
|
let point = [Cesium.Math.toDegrees(c.longitude), Cesium.Math.toDegrees(c.latitude)]; //转为经纬度点
|
|
this.queryByPoint(point, c.height);
|
|
}), Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
|
}
|
|
|
|
/*根据用户信息查询单体化*/
|
|
queryByUserInfo(data) {
|
|
this.queryByPoint([data.position.lng, data.position.lat], data.position.alt, data.id)
|
|
}
|
|
|
|
//点查询 点击查询是查询分层的数据
|
|
async queryByPoint(point) {
|
|
let url = ""
|
|
if (this.options.host.endsWith("yjearth4.0")) {
|
|
url = this.options.host + '/api/v1/dth/query_by_point'
|
|
}
|
|
else {
|
|
url = this.options.host + '/yjearth4.0/api/v1/dth/query_by_point'
|
|
}
|
|
url += '?point=' + JSON.stringify({'lng': point[0],'lat': point[1]})
|
|
let response = await fetch(url, {
|
|
method: 'get',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
"token": getToken(),
|
|
"Authorization": "Bearer " + getToken(),
|
|
}
|
|
})
|
|
if (response.status === 200) {
|
|
let data = await response.json()
|
|
if (data.code === 200 || data.code === 0) {
|
|
this.clearAllDthPrimitive()
|
|
this.addDthPrimitive(data.data.list)
|
|
}
|
|
else {
|
|
window.ELEMENT && window.ELEMENT.Message({
|
|
message: data.msg || data.message,
|
|
type: 'warning',
|
|
duration: 1500
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 添加房屋Primitive
|
|
async addBuildingPrimitive(array) {
|
|
for (let i = 0; i < array.length; i++) {
|
|
let fromDegreesArray = []
|
|
let extrudedHeight = 0
|
|
let positions = JSON.parse(array[i].range)
|
|
for (let m = 0; m < positions.length; m++) {
|
|
if (extrudedHeight < positions[m].alt) {
|
|
extrudedHeight = positions[m].alt
|
|
}
|
|
fromDegreesArray.push(positions[m].lng, positions[m].lat, 0)
|
|
}
|
|
let polygonGeometry = new Cesium.PolygonGeometry({
|
|
polygonHierarchy: new Cesium.PolygonHierarchy(
|
|
Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)
|
|
),
|
|
// perPositionHeight: true, //使用z坐标 否则高度从0开始
|
|
extrudedHeight: 100000000, //拉伸高度
|
|
});
|
|
this.primitives.building.push(this.sdk.viewer.scene.primitives.add(
|
|
new Cesium.ClassificationPrimitive({
|
|
geometryInstances: new Cesium.GeometryInstance({
|
|
id: {
|
|
...array[i],
|
|
},
|
|
geometry: Cesium.PolygonGeometry.createGeometry(polygonGeometry),
|
|
attributes: {
|
|
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
|
|
Cesium.Color.fromCssColorString('rgb(255, 235, 59, 0.4)')
|
|
),
|
|
show: new Cesium.ShowGeometryInstanceAttribute(true),
|
|
}
|
|
}),
|
|
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
|
|
}), 0
|
|
))
|
|
}
|
|
}
|
|
// 根据id删除房屋Primitive
|
|
clearBuildingPrimitive(id) {
|
|
for (let i = this.primitives.building.length - 1; i >= 0; i--) {
|
|
if (id === this.primitives.building[i]._primitiveOptions.geometryInstances[0].id.ID) {
|
|
this.sdk.viewer.scene.primitives.remove(this.primitives.building[i])
|
|
this.primitives.building.splice(i, 1)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
// 删除全部房屋Primitive
|
|
clearAllBuildingPrimitive() {
|
|
for (let i = this.primitives.building.length - 1; i >= 0; i--) {
|
|
this.sdk.viewer.scene.primitives.remove(this.primitives.building[i])
|
|
}
|
|
this.primitives.building = []
|
|
}
|
|
|
|
// 添加单体化Primitive
|
|
addDthPrimitive(array) {
|
|
let readyIndex = 0
|
|
let Primitives = []
|
|
for (let i = 0; i < array.length; i++) {
|
|
let positions = JSON.parse(array[i].range)
|
|
let fromDegreesArray = []
|
|
for (let m = 0; m < positions.length; m++) {
|
|
fromDegreesArray.push(positions[m].lng, positions[m].lat, array[i].bottom)
|
|
}
|
|
let polygonGeometry = new Cesium.PolygonGeometry({
|
|
polygonHierarchy: new Cesium.PolygonHierarchy(
|
|
Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)
|
|
),
|
|
perPositionHeight: true, //使用z坐标 否则高度从0开始
|
|
extrudedHeight: array[i].height + array[i].bottom, //拉伸高度
|
|
});
|
|
let Primitive = new Cesium.ClassificationPrimitive({
|
|
geometryInstances: new Cesium.GeometryInstance({
|
|
id: {
|
|
type: 'dth',
|
|
...array[i],
|
|
},
|
|
geometry: Cesium.PolygonGeometry.createGeometry(polygonGeometry),
|
|
attributes: {
|
|
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
|
|
Cesium.Color.fromCssColorString('rgb(255, 235, 59, 0.4)')
|
|
),
|
|
show: new Cesium.ShowGeometryInstanceAttribute(true),
|
|
}
|
|
}),
|
|
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
|
|
})
|
|
Primitives.push(Primitive)
|
|
this.sdk.viewer.scene.primitives.add(Primitive)
|
|
Primitive._readyPromise.then(()=>{
|
|
this.clearDthPrimitive(Primitive._primitiveOptions.geometryInstances[0].id.ID)
|
|
readyIndex ++
|
|
if(readyIndex >= array.length) {
|
|
this.primitives.dth.push(...Primitives);
|
|
}
|
|
})
|
|
}
|
|
}
|
|
// 根据id删除单体化Primitive
|
|
clearDthPrimitive(id) {
|
|
for (let i = this.primitives.dth.length - 1; i >= 0; i--) {
|
|
if (id === this.primitives.dth[i]._primitiveOptions.geometryInstances[0].id.ID) {
|
|
this.sdk.viewer.scene.primitives.remove(this.primitives.dth[i])
|
|
this.primitives.dth.splice(i, 1)
|
|
}
|
|
}
|
|
}
|
|
|
|
getDthPrimitive(id) {
|
|
for (let i = this.primitives.dth.length - 1; i >= 0; i--) {
|
|
if (id === this.primitives.dth[i]._primitiveOptions.geometryInstances[0].id.ID) {
|
|
return this.primitives.dth[i]
|
|
}
|
|
}
|
|
}
|
|
|
|
// 删除全部单体化Primitive
|
|
clearAllDthPrimitive() {
|
|
for (let i = this.primitives.dth.length - 1; i >= 0; i--) {
|
|
this.sdk.viewer.scene.primitives.remove(this.primitives.dth[i])
|
|
}
|
|
this.primitives.dth = []
|
|
}
|
|
|
|
getIDBypickFeature(pickFeature) {
|
|
//恢复上一个贴对象面显示
|
|
if (this.clickHighlightPrimitive) {
|
|
this.clickHighlightPrimitive.show = true;
|
|
}
|
|
this.highlightPrimitive && this.sdk.viewer.scene.primitives.remove(this.highlightPrimitive)
|
|
this.highlightPrimitive = this.sdk.viewer.scene.primitives.add(
|
|
new Cesium.ClassificationPrimitive({
|
|
geometryInstances: new Cesium.GeometryInstance({
|
|
id: {
|
|
type: 'highlight',
|
|
},
|
|
geometry: pickFeature.primitive._primitiveOptions.geometryInstances[0].geometry,
|
|
attributes: {
|
|
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
|
|
Cesium.Color.fromCssColorString('rgb(255, 0, 0, 1)')
|
|
),
|
|
show: new Cesium.ShowGeometryInstanceAttribute(true),
|
|
}
|
|
}),
|
|
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
|
|
})
|
|
)
|
|
this.highlightPrimitive.readyPromise.then(() => {
|
|
//设置当前点击的贴对象面不显示
|
|
pickFeature.primitive.show = false;
|
|
})
|
|
this.clickHighlightPrimitive = pickFeature.primitive;
|
|
this.handlePickHouse(pickFeature.id)
|
|
}
|
|
|
|
//处理拾取到的户室信息
|
|
handlePickHouse(id) {
|
|
this.HandlePickHouseEvent.raiseEvent({}); //触发选中事件 通知界面更新
|
|
}
|
|
|
|
activate() {
|
|
this.isActivate = true;
|
|
}
|
|
|
|
deactivate() {
|
|
this.isActivate = false;
|
|
}
|
|
}
|
|
|
|
export default DTH |