代码迁移

This commit is contained in:
zh
2025-07-03 13:54:01 +08:00
parent b04de8a084
commit 2a4da33e62
985 changed files with 358292 additions and 13 deletions

View File

@ -0,0 +1,578 @@
/**
* @name: click
* @author: Administrator
* @date: 2023-05-28 11:05
* @descriptionclick
* @update: 2023-05-28 11:05
*/
let leftClickHandler = null
let rightClickHandler = null
let MoveHandler = null
let leftClickCallbackMap = new Map()
let rightClickCallbackMap = new Map()
let MoveCallbackMap = new Map()
let selectedFeature;
function cartesian3Towgs84(cartesian, viewer) {
var ellipsoid = viewer.scene.globe.ellipsoid
var cartesian3 = new Cesium.Cartesian3(
cartesian.x,
cartesian.y,
cartesian.z
)
var cartographic = ellipsoid.cartesianToCartographic(cartesian3)
var lat = Cesium.Math.toDegrees(cartographic.latitude)
var lng = Cesium.Math.toDegrees(cartographic.longitude)
var alt = cartographic.height < 0 ? 0 : cartographic.height
return {
lng: lng,
lat: lat,
alt: alt,
}
}
function getcartesian(sdk, movement) {
if (movement.endPosition) {
movement.endPosition.y -= 2
}
let position = movement.position || movement.endPosition
// 获取世界坐标系地表坐标,考虑地形,不包括模型,倾斜摄影模型表面;
let cartesian = sdk.viewer.scene.pickPosition(position)
if (!cartesian) {
const ray = sdk.viewer.camera.getPickRay(position); //相交的射线
cartesian = sdk.viewer.scene.globe.pick(ray, sdk.viewer.scene);
}
return cartesian
}
function openLeftClick(sdk, cb) {
if (!sdk || !sdk.viewer) {
return
}
let click = true
leftClickHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
leftClickHandler.setInputAction((movement) => {
let cartesian = sdk.viewer.scene.pickPosition(movement.position)
if (!cartesian) {
const ray = sdk.viewer.camera.getPickRay(movement.position); //相交的射线
cartesian = sdk.viewer.scene.globe.pick(ray, sdk.viewer.scene);
}
if (!cartesian) {
return
}
let pos84 = cartesian3Towgs84(cartesian, sdk.viewer)
cb && cb(pos84)
if (click) {
click = false
setTimeout(() => {
click = true
}, 600);
if (!YJ.Measure.GetMeasureStatus() && cartesian) {
let flag = false
for (let i = leftClickCallbackMap.size - 1; i >= 0; i--) {
let key = Array.from(leftClickCallbackMap.keys())[i]
let obj = leftClickCallbackMap.get(key)
if (obj) {
if (obj.that) {
// 是否为多边形
if (obj.that.type === 'PolygonObject') {
// 是否可点击y
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 3) {
let pt = turf.point([pos84.lng, pos84.lat]);
let polyPos = []
for (let i = 0; i < obj.that.options.positions.length; i++) {
polyPos.push([
obj.that.options.positions[i].lng,
obj.that.options.positions[i].lat
])
}
polyPos.push([
obj.that.options.positions[0].lng,
obj.that.options.positions[0].lat
])
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 聚集地
else if (obj.that.type === 'AssembleObject') {
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 3) {
let positions = obj.that.computeAssemble(obj.that.options.positions, true)
let pt = turf.point([pos84.lng, pos84.lat]);
let polyPos = []
for (let i = 0; i < positions.length; i += 2) {
polyPos.push([
positions[i],
positions[i + 1]
])
}
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 单箭头
else if (obj.that.type === 'AttackArrowObject') {
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 3) {
let pt = turf.point([pos84.lng, pos84.lat]);
let positions = obj.that.computeAttackArrow(obj.that.options.positions)
let polyPos = []
for (let m = 0; m < positions.length; m++) {
let pos84 = cartesian3Towgs84(positions[m], sdk.viewer)
polyPos.push([pos84.lng, pos84.lat])
}
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 双箭头
else if (obj.that.type === 'PincerArrowObject') {
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 5) {
let pt = turf.point([pos84.lng, pos84.lat]);
let positions = obj.that.computePincerArrow(obj.that.options.positions)
let polyPos = []
for (let m = 0; m < positions.length; m++) {
let pos84 = cartesian3Towgs84(positions[m], sdk.viewer)
polyPos.push([pos84.lng, pos84.lat])
}
let pos84_0 = cartesian3Towgs84(positions[0], sdk.viewer)
polyPos.push([pos84_0.lng, pos84_0.lat])
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 圆
else if (obj.that.type === 'CircleObject') {
if (obj.that.picking) {
let pt = turf.point([pos84.lng, pos84.lat]);
if (obj.that.options.center && obj.that.options.radius) {
let center = [obj.that.options.center.lng, obj.that.options.center.lat];
let radius = obj.that.options.radius / 1000;
let options = { steps: 360, units: 'kilometers' };
let circle = turf.circle(center, radius, options);
let contain = turf.booleanPointInPolygon(pt, circle);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 扇形
else if (obj.that.type === 'SectorObject') {
if (obj.that.picking) {
let pt = turf.point([pos84.lng, pos84.lat]);
if (obj.that.options.center && obj.that.options.radius && obj.that.options.startAngle && obj.that.options.endAngle) {
let positions = obj.that.calSector(obj.that.options.center, obj.that.options.radius, obj.that.options.startAngle, obj.that.options.endAngle, undefined, true)
let polyPos = []
for (let m = 0; m < positions.length; m++) {
polyPos.push([positions[m].lng, positions[m].lat])
}
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
}
}
}
if (!flag) {
const pick = sdk.viewer.scene.pick(movement.position)
if (pick) {
if (pick.id) {
let entityId
// 矢量
if (pick.id.type && pick.id.type === 'vector' && pick.id.parentId) {
let obj = leftClickCallbackMap.get(pick.id.parentId)
if (obj.that.picking && obj.that.geojson) {
for (let i = 0; i < obj.that.geojson.features.length; i++) {
if (obj.that.geojson.features[i].id === pick.id._id) {
obj.callback(
movement,
obj.that.geojson.features[i].id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
else if (typeof pick.id.id == 'string') {
let array = pick.id.id.split('-')
array.splice(array.length - 1, 1)
entityId = array.join('-')
}
if (pick.id.properties && pick.id.properties.id && leftClickCallbackMap.has(pick.id.properties.id._value)) {
let obj = leftClickCallbackMap.get(pick.id.properties.id._value)
if (obj.that.picking) {
obj.callback(
movement,
pick.id.properties.id._value,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else if (leftClickCallbackMap.has(pick.id.id)) {
let obj = leftClickCallbackMap.get(pick.id.id)
if (obj.that.picking) {
obj.callback(
movement,
pick.id.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else if (entityId && leftClickCallbackMap.has(entityId)) {
let obj = leftClickCallbackMap.get(entityId)
if (obj.that.picking) {
obj.callback(
movement,
entityId,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else if (pick.primitive) {
if (typeof pick.id == 'string' && leftClickCallbackMap.has(pick.id)) {
let obj = leftClickCallbackMap.get(pick.id)
obj.callback(
movement,
pick.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
else {
if (pick.primitive && pick.primitive.id) {
if (leftClickCallbackMap.has(pick.primitive.id)) {
let obj = leftClickCallbackMap.get(pick.primitive.id)
if (obj.that.picking) {
if (obj.that.type === 'bim') {
if (YJ.Global.getBimPickStatus(sdk)) {
obj.callback(
movement,
pick.primitive,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else {
obj.callback(
movement,
pick.primitive.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
}
if (pick.content && (!pick.primitive || !pick.primitive.id)) {
if (leftClickCallbackMap.has(pick.content.tileset.id)) {
let obj = leftClickCallbackMap.get(pick.content.tileset.id)
if (obj.that.picking) {
if (obj.that.type === 'bim') {
if (YJ.Global.getBimPickStatus(sdk)) {
obj.callback(
movement,
pick.content.tileset,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else {
obj.callback(
movement,
pick.content.tileset.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
}
}
}
}
// if (click) {
// click = false
// setTimeout(() => {
// click = true
// }, 300);
// if (!YJ.Measure.GetMeasureStatus()) {
// }
// }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
// leftClickHandler.setInputAction(function (movement) {
// const feature = sdk.viewer.scene.pick(movement.endPosition);
// // unselectFeature(selectedFeature);
// if (selectedFeature) {
// selectedFeature.color = Cesium.Color.WHITE;
// }
// selectedFeature = feature
// if (feature) {
// feature.color = Cesium.Color.YELLOW;
// }
// }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
// }
}
function closeLeftClick(sdk) {
leftClickHandler.destroy() //关闭事件句柄
leftClickHandler = null
// }
}
function openRightClick(sdk) {
if (!sdk || !sdk.viewer) {
return
}
rightClickHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
rightClickHandler.setInputAction((movement) => {
if (!YJ.Measure.GetMeasureStatus()) {
const pick = sdk.viewer.scene.pick(movement.position)
if (pick && pick.id) {
let id
if (pick.id.type && pick.id.type === 'vector' && pick.id.parentId) {
let obj = rightClickCallbackMap.get(pick.id.parentId)
if (obj.that.picking && obj.that.geojson) {
for (let i = 0; i < obj.that.geojson.features.length; i++) {
if (obj.that.geojson.features[i].id === pick.id._id) {
obj.callback(
movement,
obj.that.geojson.features[i].id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
else {
if (typeof pick.id === 'string') {
id = pick.id
}
else {
id = pick.id.id
}
if (rightClickCallbackMap.has(id)) {
let obj = rightClickCallbackMap.get(id)
if (obj.that.picking) {
let cartesian = getcartesian(sdk, movement)
if (!cartesian) {
return
}
obj.callback(
movement,
id,
cartesian3Towgs84(cartesian, sdk.viewer), obj.that)
}
}
}
}
if (pick && pick.content) {
if (rightClickCallbackMap.has(pick.content.tileset.id)) {
let obj = rightClickCallbackMap.get(pick.content.tileset.id)
if (obj.that.picking) {
if (obj.that.type === 'bim') {
if (YJ.Global.getBimPickStatus(sdk)) {
let cartesian = getcartesian(sdk, movement)
if (!cartesian) {
return
}
obj.callback(
movement,
pick.getProperty('id'),
cartesian3Towgs84(cartesian, sdk.viewer), obj.that)
}
}
else {
let cartesian = getcartesian(sdk, movement)
if (!cartesian) {
return
}
obj.callback(
movement,
pick.content.tileset.id,
cartesian3Towgs84(cartesian, sdk.viewer), obj.that)
}
}
}
}
}
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
}
function closeRightClick() {
if (rightClickHandler) {
rightClickHandler.destroy() //关闭事件句柄
rightClickHandler = null
}
}
function openMove(sdk) {
MoveHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
MoveHandler.setInputAction(function (movement) {
const pick = sdk.viewer.scene.pick(movement.endPosition);
// unselectFeature(selectedFeature);
// if (selectedFeature) {
// let color = '#fff'
// let state = selectedFeature.getProperty('state')
// switch (state) {
// case '0':
// color = '#fff'
// break;
// case '1':
// color = '#f00'
// break;
// case '2':
// color = '#0f0'
// break;
// case '3':
// color = '#00f'
// break;
// default:
// }
// selectedFeature.color = Cesium.Color.fromCssColorString(color).withAlpha(selectedFeature.tileset.transparency)
// }
// if (pick && pick.id) { }
// if (pick && pick.content) {
// if (MoveCallbackMap.has(pick.content.tileset.id)) {
// let obj = MoveCallbackMap.get(pick.content.tileset.id)
// if (obj.that.picking) {
// if (obj.that.type === 'bim') {
// if (YJ.Global.getBimPickStatus(sdk)) {
// selectedFeature = pick
// pick.color = Cesium.Color.YELLOW;
// }
// else {
// selectedFeature = null
// }
// }
// else {
// selectedFeature = pick
// pick.color = Cesium.Color.YELLOW;
// }
// }
// else {
// selectedFeature = null
// }
// }
// }
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}
function closeMove() {
if (MoveHandler) {
MoveHandler.destroy() //关闭事件句柄
MoveHandler = null
}
}
/*注册左键回调*/
function regLeftClickCallback(id, callback, that) {
leftClickCallbackMap.set(id, { callback, that })
}/*取消左键回调*/
function unRegLeftClickCallback(id,) {
leftClickCallbackMap.delete(id,)
}
/*注册右键回调*/
function regRightClickCallback(id, callback, that) {
rightClickCallbackMap.set(id, { callback, that })
}/*取消右键回调*/
function unRegRightClickCallback(id,) {
rightClickCallbackMap.delete(id,)
}
/*注册左键回调*/
function regMoveCallback(id, callback, that) {
MoveCallbackMap.set(id, { callback, that })
}/*取消左键回调*/
function unregMoveCallback(id,) {
MoveCallbackMap.delete(id,)
}
function getLeftClickState() {
if (leftClickHandler) {
return true
}
else {
false
}
}
function getRightClickState() {
if (rightClickHandler) {
return true
}
else {
false
}
}
function getMoveState() {
if (MoveHandler) {
return true
}
else {
false
}
}
export { openLeftClick, closeLeftClick, regLeftClickCallback, unRegLeftClickCallback, openRightClick, closeRightClick, regRightClickCallback, unRegRightClickCallback, openMove, closeMove, regMoveCallback, unregMoveCallback, getLeftClickState, getRightClickState, getMoveState }

253
src/Global/Contour/index.js Normal file
View File

@ -0,0 +1,253 @@
/**
* 等高线
*/
import Dialog from "../../Obj/Element/Dialog";
import Tools from "../../Tools";
let _DialogObject = null;
let material = null;
let handler = null;
let activeHeightElm = null;
let tools
activeHeightElm = document.createElement('div')
activeHeightElm.className = 'YJ-customize-active-height-elm'
activeHeightElm.style.position = 'absolute'
activeHeightElm.style.left = '10px'
activeHeightElm.style.top = '10px'
activeHeightElm.style.width = '100px'
// activeHeightElm.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'
activeHeightElm.style.textAlign = 'center'
activeHeightElm.style.pointerEvents = 'none'
activeHeightElm.style.color = '#ff0000'
activeHeightElm.style.display = 'none'
async function dialog(sdk) {
if (!sdk || _DialogObject) {
return
}
if (!material) {
createMaterial()
}
if (!tools) {
tools = new Tools()
}
_DialogObject = await new Dialog(sdk, {}, {
title: "等高线", left: '180px',
top: '100px',
confirmCallBack: options => { },
closeCallBack: () => {
_DialogObject = null
}
});
_DialogObject._element.body.className =
_DialogObject._element.body.className + ' contour'
let contentElm = document.createElement('div')
contentElm.innerHTML = `
<span class="custom-divider"></span>
<div class="div-item">
<div class="row">
<div class="col input-select-unit-box">
<span class="label">高差</span>
<div class="input-number input-number-unit-1">
<input class="input gap" type="number" title="" min="0" max="1000">
<span class="unit">m</span>
<span class="arrow"></span>
</div>
</div>
<div class="col input-select-unit-box" style="flex: 0 0 120px;">
<span class="label">主线颜色</span>
<div class="primary-lice-color"></div>
</div>
</div>
<div class="row">
<div class="col input-select-unit-box">
<span class="label">次线条数</span>
<div class="input-number input-number-unit-1">
<input class="input gap2" type="number" title="" min="0" max="10">
<span class="unit"></span>
<span class="arrow"></span>
</div>
</div>
<div class="col input-select-unit-box" style="flex: 0 0 120px;">
<span class="label">次线颜色</span>
<div class="secondary-lice-color"></div>
</div>
</div>
<div class="row" style="align-items: flex-start;">
<div class="col">
</div>
<div class="col" style="flex: 0 0 120px;">
<span class="label">开关</span>
<input class="btn-switch" type="checkbox">
</div>
</div>
</div>
<span class="custom-divider"></span>
`
contentElm.innerHTML = `
<span class="custom-divider"></span>
<div class="div-item">
<div class="row" style="align-items: flex-start;">
<div class="col" style="flex: 0 0 120px;">
<span class="label">开关</span>
<input class="btn-switch" type="checkbox">
</div>
</div>
</div>
`
_DialogObject.contentAppChild(contentElm)
contentElm.getElementsByClassName('btn-switch')[0].addEventListener('change', (e) => {
if (e.target.checked) {
if (handler) {
handler.destroy()
}
if (!sdk.viewer.container.getElementsByClassName('YJ-customize-active-height-elm')[0]) {
sdk.viewer.container.appendChild(activeHeightElm)
}
handler = new Cesium.ScreenSpaceEventHandler(
sdk.viewer.canvas
)
handler.setInputAction((movement) => {
let cartesian = sdk.viewer.scene.pickPosition(movement.endPosition)
if (cartesian) {
let top = 0
let left = 0
if (sdk.viewer && sdk.viewer._element) {
let element = sdk.viewer._element.getElementsByClassName('cesium-widget')[0].getElementsByTagName('canvas')[0]
top = element.getBoundingClientRect().top + window.scrollY
left = element.getBoundingClientRect().left + window.scrollX
}
activeHeightElm.style.left = movement.endPosition.x - 50 + left + 'px'
activeHeightElm.style.top = movement.endPosition.y - 40 + top + 'px'
activeHeightElm.style.display = 'block'
let pos84 = tools.cartesian3Towgs84(cartesian, sdk.viewer)
let mainContourHeight = Math.floor(pos84.alt / material.uniforms.spacing) * material.uniforms.spacing
let gap = pos84.alt - mainContourHeight
let gap2 = material.uniforms.spacing / (material.uniforms.secondaryLinesCount + 1)
let activeHeight = Math.floor(gap / gap2) * gap2 + mainContourHeight
if ((pos84.alt - activeHeight) > gap2 / 2) {
activeHeight = activeHeight + gap2
}
material.uniforms.mouseHeight = pos84.alt
material.uniforms.mousePosition = cartesian
activeHeightElm.innerHTML = `${activeHeight.toFixed(0)}`
}
else {
activeHeightElm.style.display = 'none'
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
sdk.viewer.scene.globe.material = material;
} else {
if (handler) {
handler.destroy()
handler = null
}
if (sdk.viewer.container.getElementsByClassName('YJ-customize-active-height-elm')[0]) {
activeHeightElm.style.display = 'none'
sdk.viewer.container.removeChild(activeHeightElm)
}
sdk.viewer.scene.globe.material = null;
}
})
}
function createMaterial() {
Cesium.Material._materialCache._materials.ElevationContour.fabric.source = `
uniform vec4 color;
uniform vec4 secondaryLinesColor;
uniform float spacing;
uniform float width;
uniform float secondaryLinesWidth;
uniform float mouseHeight;
uniform float secondaryLinesCount; // 0=无次线, 1=1条次线, 2=2条次线...
czm_material czm_getMaterial(czm_materialInput materialInput)
{
czm_material material = czm_getDefaultMaterial(materialInput);
// 主等高线计算
float distanceToMainContour = mod(materialInput.height, spacing);
// 抗锯齿计算
#if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives))
float dxc = abs(dFdx(materialInput.height));
float dyc = abs(dFdy(materialInput.height));
float dFMain = max(dxc, dyc) * czm_pixelRatio * width;
#else
float dFMain = czm_pixelRatio * width;
#endif
bool isMainContour = distanceToMainContour < dFMain;
bool isSecondaryContour = false;
float dFSecondary = 0.0;
float secondarySpacing = 0.0;
// 只有当存在次线时才计算次线
if(secondaryLinesCount > 0.0) {
secondarySpacing = spacing / (secondaryLinesCount + 1.0);
float distanceToSecondaryContour = mod(materialInput.height, secondarySpacing);
// 确保次线不会与主线重叠
float minDistanceToMain = min(distanceToMainContour, spacing - distanceToMainContour);
bool notCloseToMain = minDistanceToMain > dFMain * 2.0; // 2倍线宽缓冲
#if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives))
dFSecondary = max(dxc, dyc) * czm_pixelRatio * secondaryLinesWidth;
#else
dFSecondary = czm_pixelRatio * secondaryLinesWidth;
#endif
isSecondaryContour = (distanceToSecondaryContour < dFSecondary) && notCloseToMain;
}
// 计算当前高度所属的等高线高度
float mainContourHeight = floor(materialInput.height / spacing) * spacing;
float secondaryContourHeight = floor(materialInput.height / spacing * (secondaryLinesCount + 1.0)) * spacing / (secondaryLinesCount + 1.0);
// 高亮判断
bool shouldHighlight = false;
if(isMainContour && abs(mainContourHeight - mouseHeight) < 0.5 * (spacing/(secondaryLinesCount+1.0))) {
shouldHighlight = true;
} else if(isSecondaryContour && abs(secondaryContourHeight - mouseHeight) < 0.5 * (spacing/(secondaryLinesCount+1.0))) {
shouldHighlight = true;
}
// 颜色输出
vec4 outColor;
if(shouldHighlight) {
outColor = vec4(1.0, 0.0, 0.0, 1.0);
} else if(isMainContour) {
outColor = czm_gammaCorrect(vec4(color.rgb, color.a));
} else if(isSecondaryContour) {
outColor = czm_gammaCorrect(vec4(secondaryLinesColor.rgb, secondaryLinesColor.a));
} else {
outColor = vec4(0.0);
}
material.diffuse = outColor.rgb;
material.alpha = outColor.a;
return material;
}
`
material = new Cesium.Material({
fabric: {
type: "ElevationContour",
uniforms: {
width: 2,
secondaryLinesWidth: 1, // 次级线宽度
spacing: 200,
color: Cesium.Color.fromCssColorString('#ffd000'),
secondaryLinesColor: Cesium.Color.fromCssColorString('#0dff00').withAlpha(0.5),
mouseHeight: -100000,
mousePosition: new Cesium.Cartesian3(0, 0, 0),
secondaryLinesCount: 3
},
}
});
}
export { dialog }

View File

@ -0,0 +1,37 @@
function changeClassificationPrimitive(options, array) {
this.options = options
this.array = array
}
changeClassificationPrimitive.prototype.getGeometry = function () {
return Cesium.PolygonGeometry.createGeometry(this.options);
};
changeClassificationPrimitive.prototype.update = function (context, frameState, commandList) {
var geometry = this.getGeometry();
if (!geometry) {
return;
}
this._primitive = new Cesium.ClassificationPrimitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: geometry,
id: {
type: 'dth',
...this.array,
},
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
Cesium.Color.fromRandom({ alpha: 0.5 })
),
show: new Cesium.ShowGeometryInstanceAttribute(true),
}
}),
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
});
var primitive = this._primitive
primitive.update(context, frameState, commandList);
};
export { changeClassificationPrimitive }

538
src/Global/DTH/index.js Normal file
View File

@ -0,0 +1,538 @@
import { getHost, getToken } from "../../on";
class DTH {
constructor(sdk, options = {}) {
this.sdk = sdk
this.primitives = {
building: [],
unit: [],
dth: []
}
this.options = { ...options }
this.options.host = this.options.host || getHost()
this.temporaryDth = []
this.dth = {}
this.PickBuildingEvent = new Cesium.Event();
this.initEvents()
this.activeBuilding
}
/**
* @description 注册点击的事件回调
* @memberOf DTH
* */
PickCallback(that, cb) {
this.PickBuildingEvent.addEventListener(
cb,
that
)
}
//场景事件
initEvents() {
new Cesium.ScreenSpaceEventHandler(this.sdk.viewer.scene.canvas).setInputAction(((e) => {
if (YJ.Measure.GetMeasureStatus()) {
return
}
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 == "yj-dth-dth" || pickFeature.id.type == "yj-dth-highlight")) {
this.getIDBypickFeature(pickFeature); //处理点击到的楼层
return;
}
if (pickFeature.primitive && pickFeature.primitive instanceof Cesium.ClassificationPrimitive && pickFeature.id && pickFeature.id.type == "yj-dth-unit") {
this.highlightPrimitive && this.sdk.viewer.scene.primitives.remove(this.highlightPrimitive)
this.handlePickEvent(pickFeature.id)
return;
}
// if (pickFeature.id && pickFeature.id.type === 'yj-dth-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);
let coverLabelEntity = this.sdk.viewer.entities.getOrCreateEntity('yj-dth-cover-label')
coverLabelEntity.show = false
// this.sdk.viewer.entities.add({
// position: Cesium.Cartesian3.fromDegrees(-75.1641667, 39.9522222),
// label: {
// text: "Philadelphia",
// font: "24px Helvetica",
// fillColor: Cesium.Color.SKYBLUE,
// outlineColor: Cesium.Color.BLACK,
// outlineWidth: 2,
// style: Cesium.LabelStyle.FILL_AND_OUTLINE,
// },
// });
let lastPickTime = 0;
let _this = this
let timeoutEvent
new Cesium.ScreenSpaceEventHandler(this.sdk.viewer.scene.canvas).setInputAction(((movement) => {
if (YJ.Measure.GetMeasureStatus()) {
return
}
try {
const now = Date.now();
if (now - lastPickTime < 100) {
clearTimeout(timeoutEvent)
timeoutEvent = setTimeout(() => {
pick(movement)
}, 100);
return
}
clearTimeout(timeoutEvent)
lastPickTime = now;
pick(movement)
} catch (error) {
}
}), Cesium.ScreenSpaceEventType.MOUSE_MOVE);
function pick(e) {
let pickFeature = _this.sdk.viewer.scene.pick(e.endPosition);
if (pickFeature) {
let labelText = ''
if (pickFeature.primitive && pickFeature.primitive instanceof Cesium.ClassificationPrimitive && pickFeature.id && (pickFeature.id.type === "yj-dth-dth" || pickFeature.id.type === "yj-dth-highlight")) {
labelText = pickFeature.id.build_info.name + ' - ' + pickFeature.id.unit_info.name + ' - ' + pickFeature.id.room_num
}
else if (pickFeature.primitive && pickFeature.primitive instanceof Cesium.ClassificationPrimitive && pickFeature.id && pickFeature.id.type === "yj-dth-unit") {
if (pickFeature.id.build_info.name) {
labelText = pickFeature.id.build_info.name + ' - ' + pickFeature.id.name
}
}
else if (pickFeature.primitive && pickFeature.primitive instanceof Cesium.ClassificationPrimitive && pickFeature.id && pickFeature.id.type === "yj-dth-build") {
if (pickFeature.id.name) {
labelText = pickFeature.id.name
}
}
else if (pickFeature.primitive && pickFeature.primitive.id && pickFeature.primitive.id.id && pickFeature.primitive.id.id === 'yj-dth-cover-label') {
coverLabelEntity.position = _this.sdk.viewer.scene.pickPosition(e.endPosition)
return
}
else {
coverLabelEntity.show = false
return
}
if (labelText) {
coverLabelEntity.position = _this.sdk.viewer.scene.pickPosition(e.endPosition)
coverLabelEntity.label = new Cesium.LabelGraphics({
text: labelText,
font: "20px Helvetica",
pixelOffset: { x: 0, y: -30 },
fillColor: Cesium.Color.fromCssColorString('#ffffff'),
outlineColor: Cesium.Color.BLACK,
outlineWidth: 1,
showBackground: true,
backgroundColor: Cesium.Color.fromCssColorString('#000000').withAlpha(0.8),
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
})
coverLabelEntity.show = true
}
}
}
}
/*根据用户信息查询单体化*/
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/build/query_by_point'
}
else {
url = this.options.host + '/yjearth4.0/api/v1/dth/build/query_by_point'
}
url += '?point=' + JSON.stringify({ 'lng': point[0], 'lat': point[1] })
let response = await fetch(url, {
method: 'get',
// body: JSON.stringify({point: {'lng': point[0],'lat': point[1]}}),
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.processQueryByPointResults(data.data)
}
else {
window.ELEMENT && window.ELEMENT.Message({
message: data.msg || data.message,
type: 'warning',
duration: 1500
});
}
}
}
// 处理查询结果
async processQueryByPointResults(data, isflyto, offset = { heading: 0.0, pitch: -90.0, roll: 0.0 }) {
data.build_info && this.handlePickEvent(data)
let range
this.clearAllDthPrimitive()
this.clearAllUnitPrimitive()
if (this.activeBuilding) {
this.clearBuildingPrimitive(this.activeBuilding)
this.activeBuilding = null
}
if (data.build_info) {
range = JSON.parse(data.build_info.range)
if (data.dan_yuan.length > 0) {
for (let i = 0; i < data.dan_yuan.length; i++) {
if (data.dan_yuan[i].children.length > 0) {
this.addDthPrimitive(data.dan_yuan[i].children, data.build_info, data.dan_yuan[i])
}
else {
this.addUnitPrimitive([data.dan_yuan[i]], data.build_info, data.dan_yuan[i])
}
}
}
else {
this.activeBuilding = data.build_info.ID || data.build_info.id
this.addBuildingPrimitive([data.build_info])
}
if (isflyto) {
if (data.info && data.info.dan_yuan) {
range = JSON.parse(data.info.dan_yuan.range)
}
if (data.info && data.info.hu) {
range = JSON.parse(data.info.hu.range)
for (let i = 0; i < range.length; i++) {
range[i].alt = data.info.hu.bottom
}
for (let i = 0; i < this.primitives.dth.length; i++) {
await this.primitives.dth[i].readyPromise
let primitivesData = this.primitives.dth[i]._primitiveOptions.geometryInstances[0].id
if (primitivesData.ID === data.info.hu.ID && primitivesData.room_num === data.info.hu.room_num) {
let pickFeature = {
id: { ...data.info.hu, build_info: { ...data.build_info }, unit_info: data.info.dan_yuan },
primitive: this.primitives.dth[i]
}
this.getIDBypickFeature(pickFeature)
break
}
}
}
this.flyTo(range, offset)
}
}
}
// 添加房屋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: {
type: 'yj-dth-build',
...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,
})
))
}
}
// 根据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 || 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
async addUnitPrimitive(array, build_info, unit_info) {
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.unit.push(this.sdk.viewer.scene.primitives.add(
new Cesium.ClassificationPrimitive({
geometryInstances: new Cesium.GeometryInstance({
id: {
type: 'yj-dth-unit',
...array[i],
build_info: { ...build_info },
unit_info: { ...unit_info }
},
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,
})
))
this.primitives.unit.push(this.sdk.viewer.scene.primitives.add(
new Cesium.GroundPolylinePrimitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: new Cesium.GroundPolylineGeometry({
positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),
width: 2.0
}),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromCssColorString('#00ff0a').withAlpha(0.8))
},
}),
appearance: new Cesium.PolylineColorAppearance()
})
))
}
}
// 根据id删除单元Primitive
clearUnitPrimitive(id) {
for (let i = this.primitives.building.length - 1; i >= 0; i--) {
if (id === this.primitives.building[i]._primitiveOptions.geometryInstances[0].id.ID || id === this.primitives.building[i]._primitiveOptions.geometryInstances[0].id.id) {
this.sdk.viewer.scene.primitives.remove(this.primitives.unit[i])
this.primitives.unit.splice(i, 1)
break
}
}
}
// 删除全部单元Primitive
clearAllUnitPrimitive() {
for (let i = this.primitives.unit.length - 1; i >= 0; i--) {
this.sdk.viewer.scene.primitives.remove(this.primitives.unit[i])
}
this.primitives.unit = []
}
// 添加单体化Primitive
addDthPrimitive(array, build_info, unit_info) {
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 + 0.3)
}
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 polygonGeometryBorder = new Cesium.PolygonGeometry({
polygonHierarchy: new Cesium.PolygonHierarchy(
Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)
),
perPositionHeight: true, //使用z坐标 否则高度从0开始
extrudedHeight: array[i].bottom, //拉伸高度
});
this.primitives.dth.push(this.sdk.viewer.scene.primitives.add(
new Cesium.ClassificationPrimitive({
geometryInstances: new Cesium.GeometryInstance({
id: {
type: 'yj-dth-dth',
...array[i],
build_info: { ...build_info },
unit_info: { ...unit_info }
},
geometry: Cesium.PolygonGeometry.createGeometry(polygonGeometry),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
Cesium.Color.fromCssColorString('rgb(0, 64, 255, 0.4)')
),
show: new Cesium.ShowGeometryInstanceAttribute(true),
}
}),
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
})
));
this.primitives.dth.push(this.sdk.viewer.scene.primitives.add(
new Cesium.ClassificationPrimitive({
geometryInstances: new Cesium.GeometryInstance({
id: {
type: 'yj-dth-dth-border',
...array[i],
},
geometry: Cesium.PolygonGeometry.createGeometry(polygonGeometryBorder),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
Cesium.Color.fromCssColorString('rgb(0, 0, 0, 1)')
),
show: new Cesium.ShowGeometryInstanceAttribute(true),
}
}),
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
})
));
}
}
// 根据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 || 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)
}
}
}
// 删除全部单体化Primitive
clearAllDthPrimitive() {
this.highlightPrimitive && this.sdk.viewer.scene.primitives.remove(this.highlightPrimitive)
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: {
...pickFeature.id,
type: 'yj-dth-highlight',
},
geometry: pickFeature.primitive._primitiveOptions.geometryInstances[0].geometry,
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromCssColorString('#ff9800').withAlpha(0.8)),
show: new Cesium.ShowGeometryInstanceAttribute(true),
}
}),
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
})
)
this.highlightPrimitive.readyPromise.then(() => {
//设置当前点击的贴对象面不显示
pickFeature.primitive.show = false;
})
this.clickHighlightPrimitive = pickFeature.primitive;
let range = pickFeature.id.range
if (typeof pickFeature.id.range === 'string') {
range = JSON.parse(pickFeature.id.range)
}
this.getHilightArea(range)
this.handlePickEvent(pickFeature.id)
}
//处理点击事件
handlePickEvent(id) {
this.PickBuildingEvent.raiseEvent(id); //触发选中事件 通知界面更新
}
getHilightArea(points, radius = 1) {
let arr = []
points.forEach((point) => {
arr.push([(point.lng), (point.lat)])
})
arr.push(arr[0])
var poly = turf.polygon([arr])
var buffered = turf.buffer(poly, Number(radius) / 1000)
return buffered.geometry.coordinates
}
async flyTo(positions, offset = { heading: 0.0, pitch: -90.0, roll: 0.0 }) {
let tools = new YJ.Tools(this.sdk)
let height = 0
let positionArray = []
for (let i = 0; i < positions.length; i++) {
if (positions[i].alt) {
height = positions[i].alt
}
else {
height = await tools.getClampToHeight(positions[i])
}
let a = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, height)
positionArray.push(a.x, a.y, a.z)
}
let BoundingSphere = await Cesium.BoundingSphere.fromVertices(positionArray)
this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {
offset: {
heading: Cesium.Math.toRadians(offset.heading || 0),
pitch: Cesium.Math.toRadians((offset.pitch || offset.pitch === 0) ? offset.pitch : -90),
roll: Cesium.Math.toRadians(offset.roll || 0)
}
})
}
activate() {
this.isActivate = true;
}
deactivate() {
this.isActivate = false;
}
}
export default DTH

267
src/Global/DTH/index1.js Normal file
View File

@ -0,0 +1,267 @@
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

View File

@ -0,0 +1,53 @@
/**
* @name: index
* @author: Administrator
* @date: 2023-09-11 16:41
* @descriptionindex
* @update: 2023-09-11 16:41
*/
import BillboardObject from "../../Obj/Base/BillboardObject";
import PolygonObject from "../../Obj/Base/PolygonObject";
import PolylineObject from "../../Obj/Base/PolylineObject";
import Circle from "../../Obj/Base/CircleDiffuse";
function exportKml(list = []) {
let entities = new Cesium.EntityCollection();
list.forEach(entity => {
if (
entity instanceof BillboardObject ||
entity instanceof PolygonObject ||
entity instanceof Circle ||
entity instanceof PolylineObject
) {
entities.add(entity.entity)
}
})
if (entities.values.length) {
let promise = Cesium.exportKml({entities})
promise.then(e => {
// Cesium.exportKml(e.kml,)
funDownload(e.kml, new Date().getTime() + ".kml")
})
} else {
console.error("允许导出为kml的对象为空")
}
}
function funDownload(content, filename) {
let eleLink = document.createElement("a");
eleLink.download = filename;
eleLink.style.display = "none";
// 字符内容转变成blob地址
let blob = new Blob([content]);
eleLink.href = URL.createObjectURL(blob);
// 触发点击
document.body.appendChild(eleLink);
eleLink.click();
// 然后移除
document.body.removeChild(eleLink);
}
export default exportKml

View File

@ -0,0 +1,67 @@
function html() {
return `
<span class="custom-divider"></span>
<div class="div-item">
<div class="row">
<div class="col">
<span class="label">名称</span>
<input class="input" type="text" name="name">
</div>
<div class="col"></div>
</div>
</div>
<span class="custom-divider"></span>
<div class="div-item">
<div class="row">
<div class="col">
<input type="checkbox" name="isTotalTime" style="width: 16px; line-height: 15px; height: 15px; cursor: pointer; width: auto; margin-right: 5px;">
<span class="label">设置总时长</span>
<div class="input-number input-number-unit-3">
<input class="input total-time" type="number" title="" min="0" max="999999.99" step="0.01" name="totalTime" value="0">
<span class="unit" style="top: 6px;">秒(s)</span>
<span class="arrow"></span>
</div>
</div>
<div class="col">
<input type="checkbox" name="repeat" style="width: 16px; line-height: 15px; height: 15px; cursor: pointer; width: auto; margin-right: 5px;">
<span class="label">是否循环播放</span>
</div>
</div>
</div>
<span class="custom-divider"></span>
<div class="div-item">
<div class="row">
<div class="col">
<button class="add-point"><svg class="icon-add"><use xlink:href="#yj-icon-add"></use></svg>增加视点</button>
</div>
<div class="col">
<button class="modify-point"><svg class="icon-edit"><use xlink:href="#yj-icon-edit"></use></svg>调整视点</button>
</div>
<div class="col">
<button class="afreshPlay"><svg class="icon-play"><use xlink:href="#yj-icon-play"></use></svg>播放</button>
</div>
<div class="col">
<button class="cease"><svg class="icon-pause"><use xlink:href="#yj-icon-pause"></use></svg>结束</button>
</div>
</div>
<div class="table">
<div class="table-head">
<div class="tr">
<div class="th">序号</div>
<div class="th">时长(s)</div>
<div class="th">操作</div>
</div>
</div>
<div class="table-body">
<div class="table-empty">
<div class="empty-img"></div>
<p>暂无数据</p>
</div>
</div>
</div>
</div>
<span class="custom-divider"></span>
`
}
export { html }

389
src/Global/FlyRoam/index.js Normal file
View File

@ -0,0 +1,389 @@
/**
* @description 飞行漫游
*/
import Dialog from '../../BaseDialog';
import { html } from "./_element";
import Tools from "../../Tools";
import { closeRotateAround, closeViewFollow} from '../../Global/global'
let _DialogObject = null
let clickHandler
let repeat = 0
let currentRepeat = 0
const open = async (sdk, options = {}, _Dialog = {}) => {
let name = options.name || '漫游路径'
options.points || (options.points = [])
if(options.repeat) {
repeat = Number(options.repeat)
}
let viewer = sdk.viewer
let tools = new Tools(sdk)
let active = 0
if (_DialogObject && _DialogObject.close) {
_DialogObject.close()
_DialogObject = null
}
_DialogObject = await new Dialog(viewer._container, {
title: '飞行漫游', left: '180px', top: '100px',
closeCallBack: () => {
cease({ viewer })
},
})
await _DialogObject.init()
let contentElm = document.createElement('div');
contentElm.className = 'fly-roam'
contentElm.innerHTML = html()
_DialogObject.contentAppChild(contentElm)
let all_elm = contentElm.getElementsByTagName("*")
// EventBinding(all_elm)
let tableBody = contentElm.getElementsByClassName('table-body')[0];
let tableEmpty = contentElm.getElementsByClassName('table-empty')[0]
let handler = {
set: function (target, prop, value) {
target[prop] = value;
if (target.length > 0) {
tableEmpty.style.display = 'none'
}
else {
tableEmpty.style.display = 'flex'
}
return true;
},
};
let i = 0
let points = new Proxy([], handler);
for (i = 0; i < options.points.length; i++) {
points.push(options.points[i])
addTrElm(options.points[i])
}
// let nameImputBoxElm = contentElm.getElementsByClassName('input-box')[0]
// check(nameImputBoxElm, { validator: 'notEmpty', message: '名称不能为空!', trigger: 'input' })
let nameElm = contentElm.querySelector("input[name='name']")
nameElm.value = name
nameElm.addEventListener('input', () => {
name = nameElm.value
})
let addListBtn = document.createElement('button');
addListBtn.innerHTML = '保存'
addListBtn.addEventListener('click', () => {
if (!name) {
name = '漫游路径'
nameElm.value = name
}
let newPoints = []
points.map((item) => {
newPoints.push(item)
})
_Dialog.clickSavePath && _Dialog.clickSavePath(
{
name: name,
points: newPoints,
repeat: repeat+''
}
)
})
_DialogObject.footAppChild(addListBtn)
let endBtn = contentElm.getElementsByClassName('cease')[0]
endBtn.addEventListener('click', () => {
viewer.camera.cancelFlight()
})
let flyBtn = contentElm.getElementsByClassName('afreshPlay')[0]
flyBtn.addEventListener('click', () => {
if (points.length > 0) {
flyTo(sdk, points, 0)
}
})
let addBtn = contentElm.getElementsByClassName('add-point')[0]
addBtn.addEventListener('click', () => {
let position = tools.cartesian3Towgs84(viewer.camera.position, viewer)
let time = 0
let data = {
duration: time,
position: position,
orientation: {
heading: viewer.camera.heading,
pitch: viewer.camera.pitch,
roll: viewer.camera.roll
}
}
points.splice(active, 0, data)
addTrElm(data)
i++
})
let modifyBtn = contentElm.getElementsByClassName('modify-point')[0]
modifyBtn.addEventListener('click', () => {
if (!active) {
return
}
let position = tools.cartesian3Towgs84(viewer.camera.position, viewer)
points[active - 1].position = position
points[active - 1].orientation = {
heading: viewer.camera.heading,
pitch: viewer.camera.pitch,
roll: viewer.camera.roll
}
})
let totalTimeElm = contentElm.querySelector("input[name='totalTime']")
let isTotalTimeElm = contentElm.querySelector("input[name='isTotalTime']")
let repeatElm = contentElm.querySelector("input[name='repeat']")
isTotalTimeElm.addEventListener('change', () => {
let trList = tableBody.getElementsByClassName('tr')
if (isTotalTimeElm.checked && trList.length > 0) {
let time = Number((Number(totalTimeElm.value) / (trList.length - 1)).toFixed(2))
for (let i = 0; i < trList.length - 1; i++) {
points[i].duration = time
trList[i].querySelector("input[name='time']").value = time
}
trList[trList.length - 1].querySelector("input[name='time']").value = 0
}
})
totalTimeElm.addEventListener('blur', () => {
let trList = tableBody.getElementsByClassName('tr')
totalTimeElm.value = Number(totalTimeElm.value)
if (totalTimeElm.value < 0) {
totalTimeElm.value = 0
}
if (isTotalTimeElm.checked && trList.length > 0) {
let time = Number((Number(totalTimeElm.value) / (trList.length - 1)).toFixed(2))
for (let i = 0; i < trList.length - 1; i++) {
points[i].duration = time
trList[i].querySelector("input[name='time']").value = time
}
trList[trList.length - 1].querySelector("input[name='time']").value = 0
}
})
repeatElm.checked = (repeat === Infinity ? true : false)
repeatElm.addEventListener('change', () => {
if (repeatElm.checked) {
repeat = Infinity
}
else {
repeat = 0
}
currentRepeat = repeat
_Dialog.changeRepeatStateCallBack && _Dialog.changeRepeatStateCallBack(repeatElm.checked)
})
// Object.defineProperty(options, 'points', {
// get() {
// return e_allArea.value
// },
// set(value) {
// e_allArea.value = value
// }
// })
function addTrElm(data) {
let trList = tableBody.getElementsByClassName('tr')
if (trList.length > 0) {
trList[trList.length - 1].querySelector("input[name='time']").disabled = undefined
}
let tr_active = tableBody.getElementsByClassName('tr active')[0]
tr_active && (tr_active.className = 'tr')
let tr = document.createElement('div');
tr.className = 'tr active'
tr.innerHTML = `
<div class="td" style="justify-content: center;">视点${i + 1}</div>
<div class="td">
<input class="input time" type="number" title="" min="0" max="999.99" step="0.01" name="time" value="${data.duration}">
</div>
<div class="td action">
<button class="play">播放</span>
<button class="delete">删除</span>
</div>
`
tr.addEventListener('click', (v) => {
if (v.target.parentNode === tr) {
let tr_active = tableBody.getElementsByClassName('tr active')[0]
tr_active && (tr_active.className = 'tr')
tr.className = 'tr active'
for (let m = 0; m < trList.length; m++) {
if (trList[m] === tr) {
active = m + 1
break
}
}
}
})
tr.addEventListener('dblclick', (v) => {
if (v.target.parentNode === tr) {
for (let m = 0; m < trList.length; m++) {
if (trList[m] === tr) {
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(points[m].position.lng, points[m].position.lat, points[m].position.alt),
orientation: points[m].orientation,
duration: 1
})
break
}
}
}
})
let e_play = tr.getElementsByClassName('play')[0]
let e_delete = tr.getElementsByClassName('delete')[0]
let e_time = tr.querySelector("input[name='time']")
e_play.addEventListener('click', () => {
for (let m = 0; m < trList.length; m++) {
if (trList[m] === e_delete.parentNode.parentNode) {
flyTo(sdk, points, m)
}
}
})
e_delete.addEventListener("click", (v) => {
for (let m = 0; m < trList.length; m++) {
if (trList[m] === e_delete.parentNode.parentNode) {
points.splice(m, 1)
points[points.length-1] && (points[points.length-1].duration = 0)
tableBody.removeChild(tr)
if (active > m + 1) {
active--
trList[active - 1].className = 'tr active'
}
else if (active == m + 1) {
if (trList.length == m) {
active -= 1
}
if (trList.length != 0) {
trList[active - 1].className = 'tr active'
}
}
// else if(active == m) {
// console.log(trList.length-1, active)
// if (trList.length == active-1) {
// trList[active-2].className = 'tr active'
// }
// else {
// trList[active-1].className = 'tr active'
// }
// }
if (trList.length > 0) {
let lastElm = trList[trList.length - 1].querySelector("input[name='time']")
lastElm.disabled = 'disabled'
lastElm.value = 0
}
break
}
}
// points.splice(i, 1)
// tableBody.removeChild(tr)
// if (trList.length > 0) {
// trList[trList.length - 1].querySelector("input[name='time']").disabled = 'disabled'
// }
})
e_time.addEventListener('input', (v) => {
isTotalTimeElm.checked = false
data.duration = Number(e_time.value)
if (data.duration < 0) {
data.duration = 0
}
})
e_time.addEventListener('blur', () => {
e_time.value = Number(Number(e_time.value).toFixed(2))
if (e_time.value < 0) {
e_time.value = 0
}
});
tableBody.insertBefore(tr, trList[active])
active++
trList[trList.length - 1].querySelector("input[name='time']").disabled = 'disabled'
}
}
const close = () => {
if (_DialogObject && _DialogObject.close) {
_DialogObject.close()
_DialogObject = null
}
}
const executeFlyTo = (sdk, points = [], index = 0, noStart) => {
if (clickHandler) {
clickHandler.destroy()
}
clickHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
clickHandler.setInputAction((movement) => {
cease(sdk)
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
let viewer = sdk.viewer
viewer.camera.cancelFlight()
// function pauseExecution(seconds) {
// return new Promise(resolve => setTimeout(resolve, seconds * 1000));
// }
closeRotateAround(sdk)
closeViewFollow(sdk)
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(points[index].position.lng, points[index].position.lat, points[index].position.alt),
orientation: points[index].orientation,
duration: noStart ? points[index - 1].duration : 0.5,
maximumHeight: points[index].position.alt,
complete: async () => {
if (!noStart) {
// await pauseExecution(2)
}
index++
if (index <= points.length - 1) {
executeFlyTo(sdk, points, index, true)
}
else if (currentRepeat && points.length > 1) {
currentRepeat--
executeFlyTo(sdk, points, 0)
}
else {
if (clickHandler) {
clickHandler.destroy()
}
}
},
easingFunction: noStart ? Cesium.EasingFunction.LINEAR_NONE : Cesium.EasingFunction.EXPONENTIAL_OUT
})
}
const flyTo = (sdk, points = [], index = 0, noStart) => {
currentRepeat = repeat
executeFlyTo(sdk, points, index, noStart)
}
/**设置循环次数 (Infinity: 无限循环)*/
const setRepeat = (v) => {
if (repeat != Number(v)) {
repeat = Number(v)
currentRepeat = repeat
if (_DialogObject && _DialogObject._element && _DialogObject._element.content) {
let repeatElm = _DialogObject._element.content.querySelector("input[name='repeat']")
if (v === Infinity) {
repeatElm.checked = true
}
else {
repeatElm.checked = false
}
}
}
}
/** 停止 */
const cease = (sdk) => {
sdk && sdk.viewer && sdk.viewer.camera.cancelFlight()
if (clickHandler) {
clickHandler.destroy()
}
}
export { open, close, flyTo, setRepeat, cease }

View File

@ -0,0 +1,235 @@
/*
* @Description: 使用键盘控制地图漫游
* @Version: 1.0
* @Author: Julian
* @Date: 2022-04-07 16:04:07
* @LastEditors: Julian
* @LastEditTime: 2022-04-07 18:40:40
*/
/**
* @description: 使用键盘控制地图漫游初始化
* @param {*} _viewer
* @return {*}
*/
function keyboardMapRoamingInit(_viewer) {
// 添加键盘监听事件
document.addEventListener('keydown', keyDown.bind(_viewer), false);
document.addEventListener('keyup', keyUp.bind(_viewer), false);
// 为每一帧添加监听事件
_viewer && _viewer.clock.onTick.addEventListener(function () {
keyboardMapRoamingRender(_viewer);
});
}
// 定义事件组
let flags = {
// 相机位置
moveForward: false,
moveBackward: false,
moveLeft: false,
moveRight: false,
moveUp: false,
moveDown: false,
// 相机姿态
lookUp: false,
lookDown: false,
lookLeft: false,
lookRight: false,
twistLeft: false,
twistRight: false,
// 缩放
zoomIn: false,
zoomOut: false
}
// 相机位置W向前S向后D向右A向左Q升高E降低
// 相机姿态抬头低头左转右转0顺时针.:逆时针
// 缩放:+:放大,-:缩小;
/**
* @description: 根据键盘输入字符返回事件信息
* @param {*} key
* @return {*}
*/
function getFlagFromKeyboard(key) {
switch (key) {
// 按字符的Unicode编码
// 相机位置
case 87:
return 'moveForward';
case 83:
return 'moveBackward';
case 68:
return 'moveRight';
case 65:
return 'moveLeft';
case 81:
return 'moveUp';
case 69:
return 'moveDown';
// 相机姿态
case 38:
return 'lookUp';
case 40:
return 'lookDown';
case 37:
return 'lookLeft';
case 39:
return 'lookRight';
case 96:
return 'twistLeft';
case 110:
return 'twistRight';
// 缩放
case 107:
return 'zoomIn';
case 109:
return 'zoomOut';
default:
return undefined;
}
}
/**
* @description: 键盘按下
* @param {*} event
* @return {*}
*/
function keyDown(event) {
let _viewer = this
// 判断是否有输入框聚焦
function isInputFocused() {
const activeElement = document.activeElement;
return (activeElement.tagName.toLowerCase() === 'input' && activeElement.type !== 'checkbox') ||
activeElement.tagName.toLowerCase() === 'textarea' ||
activeElement.getAttribute('role') === 'textarea';
}
if (isInputFocused()) {
// console.log('页面上有输入框已经获取焦点');
} else if (_viewer.trackedEntity) {
// console.log('视角跟随中');
} else if (_viewer._firstPersonView) {
// console.log('第一人称视角中');
} else if (_viewer._disableKeyboardEvent) {
// console.log('禁用键盘事件');
} else if (event.ctrlKey && event.altKey) {
if (event.key === 'v' || event.key === 'V') {
let camera = _viewer.camera
_viewer._CAMERA_SHORTCUT_VIEW = {
orientation: { heading: camera.heading, pitch: camera.pitch, roll: camera.roll },
position: { x: camera.position.x, y: camera.position.y, z: camera.position.z }
}
localStorage.setItem('CAMERA_SHORTCUT_VIEW', JSON.stringify(_viewer._CAMERA_SHORTCUT_VIEW))
}
if (event.key === 'f' || event.key === 'F') {
let CAMERA_SHORTCUT_VIEW = localStorage.getItem('CAMERA_SHORTCUT_VIEW')
_viewer._CAMERA_SHORTCUT_VIEW = JSON.parse(CAMERA_SHORTCUT_VIEW)
if (_viewer._CAMERA_SHORTCUT_VIEW && _viewer._CAMERA_SHORTCUT_VIEW.position && _viewer._CAMERA_SHORTCUT_VIEW.orientation) {
_viewer.camera.flyTo({
destination: _viewer._CAMERA_SHORTCUT_VIEW.position,
orientation: _viewer._CAMERA_SHORTCUT_VIEW.orientation
})
}
}
} else {
// console.log('页面上没有输入框获取焦点');
let flagName = getFlagFromKeyboard(event.keyCode);
if (typeof flagName !== 'undefined') {
flags[flagName] = true;
}
}
}
/**
* @description: 键盘弹起
* @param {*} event
* @return {*}
*/
function keyUp(event) {
let flagName = getFlagFromKeyboard(event.keyCode);
if (typeof flagName !== 'undefined') {
flags[flagName] = false;
}
}
/**
* @description: 根据事件调整相机
* @param {*} _viewer
* @return {*}
*/
function keyboardMapRoamingRender(_viewer) {
if(!_viewer.scene.screenSpaceCameraController.enableTilt) {
return
}
let camera = _viewer.camera;
let ellipsoid = _viewer.scene.globe.ellipsoid;
let cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;
// 根据相机高度设置移动距离,比默认距离移动效果更好
let moveRate = cameraHeight / 20.0;
let rotationRate = moveRate / 500000 / Cesium.Math.toDegrees(camera.pitch);
if (flags.moveForward) {
// camera.moveForward(moveRate);
camera.rotate(camera.right, -rotationRate);
}
if (flags.moveBackward) {
// camera.moveBackward(moveRate);
camera.rotate(camera.right, rotationRate);
}
if (flags.moveLeft) {
// camera.moveLeft(moveRate);
camera.rotate(camera.up, -rotationRate);
}
if (flags.moveRight) {
// camera.moveRight(moveRate);
camera.rotate(camera.up, rotationRate);
}
if (flags.moveUp) {
camera.moveUp(moveRate);
}
if (flags.moveDown) {
camera.moveDown(moveRate);
}
if (flags.lookUp) {
camera.lookUp();
}
if (flags.lookDown) {
camera.lookDown();
}
if (flags.lookLeft) {
camera.lookLeft();
}
if (flags.lookRight) {
camera.lookRight();
}
if (flags.twistLeft) {
camera.twistLeft();
}
if (flags.twistRight) {
camera.twistRight();
}
// 根据相机高度设置缩放参数
if (flags.zoomIn) {
let height = cameraHeight / 2
if (height < 1) {
height = 0
}
camera.zoomIn(height);
}
if (flags.zoomOut) {
let height = cameraHeight / 2
if ((cameraHeight + cameraHeight) >= 50000000) {
height = 50000000 - cameraHeight
}
camera.zoomOut(height);
}
}
export { keyboardMapRoamingInit }

View File

@ -0,0 +1,117 @@
function getTemplateData(tools) {
return [
{
"name": "模板一",
"value": "模板一",
"id": "1",
margin: 0.03,
title: {
text: '标题一',
height: 0.05,
bgColor: '#5d5d5d',
color: '#ffffff',
show: true,
},
border: {
show: false,
url: '/custom/img/map-border1.svg',
width: 0.01,
color: ''
},
plottingScale: {
cell: 2,
color: '#ffffff',
show: true,
isSelected: false,
x: 0.87,
y: 0.97,
},
data: [
{
text: '',
x: 0.02,
y: 0.93,
isSelected: false,
show: true,
color: '#ffffff',
height: 0.03
},
{
text: '',
x: 0.02,
y: 0.97,
isSelected: false,
show: true,
color: '#ffffff',
height: 0.03
},
{
x: 0.02,
y: 0.1,
show: false,
isSelected: false,
url: '/custom/img/icon-compass1.svg',
width: 0.1,
height: 0.1
}
]
},
{
"name": "模板二",
"value": "模板二",
"id": "2",
margin: 0.03,
border: {
show: true,
url: '/custom/img/map-border2.svg',
width: 0.01,
},
title: {
text: '标题二',
height: 0.05,
bgColor: '#5d5d5d',
color: '#ffffff',
show: true,
},
plottingScale: {
cell: 2,
color: '#ffffff',
show: true,
isSelected: false,
x: 0.02,
y: 0.97,
},
data: [
{
text: '',
x: 0.88,
y: 0.93,
isSelected: false,
show: true,
color: '#ffffff',
height: 0.03
},
{
text: '',
x: 0.87,
y: 0.97,
isSelected: false,
show: true,
color: '#ffffff',
height: 0.03
},
{
x: 0.91,
y: 0.1,
show: true,
isSelected: false,
url: '/custom/img/icon-compass4.svg',
width: 0.1,
height: 0.1
}
]
}
]
}
export { getTemplateData };

1449
src/Global/MapPrint/index.js Normal file

File diff suppressed because it is too large Load Diff

170
src/Global/MapX/index.js Normal file
View File

@ -0,0 +1,170 @@
import Tools from '../../Tools'
import Event from '../../Event'
let tools
let Xevent
let mapx = {}
let curRectangle = undefined;
let centerResult = undefined
let mouseStart = false
let syncObject = {}
const init = (sdk) => {
tools = new Tools()
let div = document.createElement('div');
div.id = 'mapxDiv'
div.style.width = '222px';
div.style.height = '112px';
div.style.position = 'absolute';
div.style.right = '10px';
div.style.bottom = '82px';
div.style.zIndex = '1';
document.getElementById(sdk.div_id).appendChild(div)
let options = {
imageryProvider: new Cesium.TileMapServiceImageryProvider({
url: Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII"),
}),
sceneMode: Cesium.SceneMode.SCENE2D,
// mapMode2D: Cesium.MapMode2D.ROTATE,
baseLayerPicker: false,
geocoder: false,
animation: false,
fullscreenButton: false,
navigationHelpButton: false,
// vrButton?: boolean;
homeButton: false,
infoBox: false,
sceneModePicker: false,
selectionIndicator: false,
timeline: false,
shouldAnimate: true
}
mapx.viewer = new Cesium.Viewer('mapxDiv', options);
mapx.viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(0, 0, 40000000),
})
mapx.viewer.trackedEntity = undefined;
mapx.viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
);
mapx.viewer.scene.screenSpaceCameraController.enableRotate = false;
mapx.viewer.scene.screenSpaceCameraController.enableTranslate = false;
mapx.viewer.scene.screenSpaceCameraController.enableZoom = false;
mapx.viewer.scene.screenSpaceCameraController.enableTilt = false;
mapx.viewer.scene.screenSpaceCameraController.enableLook = false;
// 创建范围框
let entity = mapx.viewer.entities.add({
name: 'mapX rectangle',
position: new Cesium.CallbackProperty(function () {
return (
centerResult || Cesium.Cartesian3.fromDegrees(0, 0, 0)
);
}, false),
rectangle: {
coordinates: new Cesium.CallbackProperty(function () {
return (
curRectangle || Cesium.Rectangle.fromDegrees(0.0, 0.0, 0.01, 0.01)
);
}, false),
material: Cesium.Color.RED.withAlpha(0.01),
outline: true,
outlineColor: Cesium.Color.RED,
outlineWidth: 2,
height: 1,
},
billboard: {
image: tools.getSourceRootPath() + '/img/cross.svg',
scale: 1,
width: 16,
height: 16
},
});
syncObject = { sdk, entity }
mapx.viewer.camera.percentageChanged = 0.001;
sdk.viewer.scene.preRender.addEventListener(syncViewer, syncObject); // 鹰眼与主图同步
let pick
Xevent = new Event({ viewer: mapx.viewer })
Xevent.mouse_left_down((movement, cartesian) => {
mouseStart = true
pick = mapx.viewer.scene.pick(movement.position)
})
Xevent.mouse_left_up((movement, cartesian) => {
mouseStart = false
})
Xevent.mouse_move((movement, cartesian) => {
if (pick && mouseStart) {
let sdkCH = tools.cartesian3Towgs84(sdk.viewer.camera.position, sdk.viewer).alt
let pos84 = tools.cartesian3Towgs84(cartesian, mapx.viewer)
// sdk.viewer.camera.position = Cesium.Cartesian3.fromDegrees(pos84.lng, pos84.lat, sdkCH)
sdk.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(pos84.lng, pos84.lat, sdkCH),
duration: 0
})
}
})
}
function syncViewer() {
if(!this.sdk || !this.sdk.viewer) {
return
}
// 视角中心点(伪)
centerResult = this.sdk.viewer.camera.pickEllipsoid(
new Cesium.Cartesian2(
this.sdk.viewer.canvas.clientWidth / 2,
this.sdk.viewer.canvas.clientHeight / (2 - ((90 + this.sdk.viewer.camera.pitch / (Cesium.Math.PI / 180)) / 110)),
),
)
if (!centerResult) {
centerResult = this.sdk.viewer.camera.position
}
let height = tools.cartesian3Towgs84(this.sdk.viewer.camera.position, this.sdk.viewer).alt
let centerResult84 = tools.cartesian3Towgs84(centerResult, this.sdk.viewer)
let stepX = 120000
let stepY = 280000
if (height > 9000000) {
height = 9000000
}
if (height < 100000) {
this.entity.billboard.show = true
this.entity.rectangle.show = false
}
else {
this.entity.billboard.show = false
this.entity.rectangle.show = true
}
curRectangle = new Cesium.Rectangle(Cesium.Math.toRadians(centerResult84.lng - (height / stepX)), Cesium.Math.toRadians(centerResult84.lat - (height / stepY)), Cesium.Math.toRadians(centerResult84.lng + (height / stepX)), Cesium.Math.toRadians(centerResult84.lat + (height / stepY)))
};
function open(sdk) {
if (!mapx.viewer) {
init(sdk)
}
else {
mapx.viewer.container.style.display = 'block';
let entity
let entities = mapx.viewer.entities.values
for (let i = 0; i < entities.length; i++) {
if (entities[i].name === 'mapX rectangle') {
entity = entities[i]
break
}
}
sdk.viewer.scene.preRender.addEventListener(syncViewer, syncObject); // 鹰眼与主图同步
}
}
function close(sdk) {
if (!mapx.viewer) {
return
}
mapx.viewer.container.style.display = 'none';
let entity
let entities = mapx.viewer.entities.values
for (let i = 0; i < entities.length; i++) {
if (entities[i].name === 'mapX rectangle') {
entity = entities[i]
break
}
}
sdk.viewer.scene.preRender.removeEventListener(syncViewer, syncObject)
}
export { open, close }

View File

@ -0,0 +1,112 @@
/**
* 鼠标坐标
*/
import Tools from "../../Tools";
import { getCoordinateSystem } from "../../Global/global";
import MouseEvent from '../../Event/index'
let event
let MouseCoordinateElm
let requestAnimationFrameEventId
const MouseCoordinate = (sdk, status) => {
let tools = new Tools(sdk)
if (status) {
if (event) {
event.destroy()
}
event = new MouseEvent(sdk)
let position = {
x: '',
y: '',
z: ''
}
let contentElm
if (MouseCoordinateElm) {
contentElm = MouseCoordinateElm
}
else {
contentElm = document.createElement('div');
contentElm.style.position = 'absolute';
contentElm.style['z-index'] = 777;
contentElm.style.color = '#ff0000';
contentElm.style.left = '0px';
contentElm.style.top = '0px';
contentElm.style.width = '100%';
contentElm.style.height = '100%';
contentElm.style['font-size'] = '12px';
contentElm.style['pointer-events'] = 'none';
contentElm.style.background = `url(${tools.getSourceRootPath()}/img/cross.png) no-repeat 100% 100%`;
contentElm.style['background-size'] = `200% 200%`;
MouseCoordinateElm = contentElm
}
sdk.viewer._element.appendChild(contentElm)
let tmovement
event.mouse_move((movement, cartesian) => {
tmovement = { ...movement }
})
const getPosition = () => {
if(!tmovement) {
return
}
let canvas = sdk.viewer._element.getElementsByTagName('canvas')[0]
let left = tmovement.endPosition.x;
let top = tmovement.endPosition.y;
let cartesian = event.getcartesian(tmovement)
contentElm.style['background-position-x'] = `${-canvas.width + left + 4}px`;
contentElm.style['background-position-y'] = `${-canvas.height + top - 2}px`;
// this.entity.position = cartesian
if (cartesian) {
let degrees = tools.cartesian3Towgs84(cartesian, sdk.viewer)
let coordinateSystem = getCoordinateSystem()
if (coordinateSystem === 'EPSG:4326') {
position = {
x: degrees.lng,
y: degrees.lat,
z: degrees.alt
}
contentElm.innerHTML = `<div style='width: 150px;position: absolute; z-index: 777; color: #ff0000; font-size: 12px; left:${left + 20}px; top:${top + 10}px;'><p style='margin: 0;'>经度:${degrees.lng.toFixed(6)}°</p><p style='margin: 0;'>维度:${degrees.lat.toFixed(6)}°</p><p style='margin: 0;'>海拔:${degrees.alt.toFixed(2)} m</p></div>`
}
else {
let result = tools.convert([{ x: degrees.lng, y: degrees.lat, z: degrees.alt }], 'EPSG:4326', coordinateSystem)
position = result.points[0]
contentElm.innerHTML = `<div style='width: 150px;position: absolute; z-index: 777; color: #ff0000; font-size: 12px; left:${left + 20}px; top:${top + 10}px;'><p style='margin: 0;'>x${position.x.toFixed(6)}</p><p style='margin: 0;'>y${position.y.toFixed(6)}</p><p style='margin: 0;'>z${position.z.toFixed(6)}</p></div>`
}
}
else {
let coordinateSystem = getCoordinateSystem()
if (coordinateSystem === 'EPSG:4326') {
contentElm.innerHTML = `<div style='width: 150px;position: absolute; z-index: 777; color: #ff0000; font-size: 12px; left:${left + 20}px; top:${top + 10}px;'><p style='margin: 0;'>经度:-</p><p style='margin: 0;'>维度:-</p><p style='margin: 0;'>海拔:-</p></div>`
}
else {
contentElm.innerHTML = `<div style='width: 150px;position: absolute; z-index: 777; color: #ff0000; font-size: 12px; left:${left + 20}px; top:${top + 10}px;'><p style='margin: 0;'>x-</p><p style='margin: 0;'>y-</p><p style='margin: 0;'>z-</p></div>`
}
}
}
animateUpdate()
function animateUpdate() {
requestAnimationFrameEventId = requestAnimationFrame(
animateUpdate
)
getPosition()
}
}
else {
if (event) {
event.destroy()
event = undefined
}
if (MouseCoordinateElm) {
sdk.viewer._element.removeChild(MouseCoordinateElm)
MouseCoordinateElm = undefined
}
if (requestAnimationFrameEventId) {
cancelAnimationFrame(requestAnimationFrameEventId)
}
}
}
export { MouseCoordinate }

View File

@ -0,0 +1,561 @@
/**
* 多视口模式
* */
import Tools from "../../Tools";
import MouseEvent from '../../Event'
import { CesiumContainer } from '../global'
import { off as offSplitScreen } from "../SplitScreen";
import { FlwStatusSwitch, JwwStatusSwitch, getFlwStatus, getJwwStatus } from "../global"
import { SheetIndexStatusSwitch, getStatus } from '../SheetIndex'
let sdk2D
let sdk3D
let activeViewer
let controlViewer
let syncObject = {}
let handlers = []
async function init(sdk) {
sdk3D = sdk
activeViewer = 0
let tools = new Tools()
let sdk2 = await new YJ.YJEarth(sdk.div_id)
sdk2.viewer._element.className = 'cesium-viewer 2d'
SheetIndexStatusSwitch(sdk2, getStatus())
// setTimeout(() => {
// let switchCluster = new YJ.Global.switchCluster(sdk2, true)
// }, 500);
CesiumContainer(sdk2, {
compass: false, // 罗盘
// legend: false, // 比例尺
info: false, // 信息栏
frame: false // 刷新率
})
sdk2.viewer.scene.mode = Cesium.SceneMode.SCENE2D
sdk2D = await sdk2
// window.sdk2D = sdk2D
solveBug()
syncObject = { sdks: [sdk, sdk2], tools }
await eventBind(sdk, 0, syncObject)
await eventBind(sdk2, 1, syncObject)
await syncData(sdk)
sdk.viewer.scene.preRender.addEventListener(syncViewer, syncObject)
sdk.viewer.imageryLayers.layerAdded.addEventListener(syncImageryLayerAdded);
sdk.viewer.imageryLayers.layerMoved.addEventListener(syncImageryLayerMoved);
sdk.viewer.imageryLayers.layerRemoved.addEventListener(syncImageryLayerRemoved);
sdk.viewer.imageryLayers.layerShownOrHidden.addEventListener(syncImageryLayerShownOrHidden);
let imageryLayers = [...sdk.viewer.imageryLayers._layers]
imageryLayers.sort((a, b) => a._layerIndex - b._layerIndex);
sdk2D.viewer.imageryLayers.removeAll()
for (let i = 0; i < imageryLayers.length; i++) {
let entity = sdk2D.viewer.imageryLayers.addImageryProvider(imageryLayers[i].imageryProvider, imageryLayers[i]._layerIndex)
entity.show = imageryLayers[i].show
}
// sdk.viewer.entities.collectionChanged.addEventListener(syncEntities)
// sdk.viewer.dataSources.dataSourceAdded.addEventListener(syncDataSources)
if (getFlwStatus(sdk)) {
FlwStatusSwitch(sdk2, true)
}
if (getJwwStatus(sdk)) {
JwwStatusSwitch(sdk2, true)
}
}
async function on(sdk) {
if (sdk2D) {
}
else {
init(sdk)
offSplitScreen()
}
}
function off(sdk) {
sdk.viewer.scene.preRender.removeEventListener(syncViewer, syncObject)
sdk.viewer.imageryLayers.layerAdded.removeEventListener(syncImageryLayerAdded);
sdk.viewer.imageryLayers.layerMoved.removeEventListener(syncImageryLayerMoved);
sdk.viewer.imageryLayers.layerRemoved.removeEventListener(syncImageryLayerRemoved);
sdk.viewer.imageryLayers.layerShownOrHidden.removeEventListener(syncImageryLayerShownOrHidden);
// sdk.viewer.entities.collectionChanged.removeEventListener(syncEntities)
// sdk.viewer.dataSources.dataSourceAdded.removeEventListener(syncDataSources)
//primitiveAdded=undefined基元同步设置在add位置
// sdk.viewer.scene.primitives.primitiveAdded.removeEventListener(syncPrimitivesAdded)
for (let i = 0; i < handlers.length; i++) {
handlers[i].destroy()
}
if (sdk2D) {
sdk2D.destroy()
handlers = []
sdk2D = null
sdk3D = null
activeViewer = null
syncObject = {}
}
}
async function syncData2(sdk, id, entityId) {
if (sdk && sdk.viewer && sdk.viewer._element && sdk.viewer._element.className === 'cesium-viewer 2d') {
return
}
if (!sdk3D || !sdk2D) {
return
}
let entityMap = sdk3D.entityMap
if (id) {
let that = entityMap.get(id)
if (that) {
let that2 = sdk2D.entityMap.get(id)
if (that2) {
await that2.remove()
}
let options = syncObject.tools.deepCopyObj(that.options)
if (that.type === 'BillboardObject') {
options.heightReference = 1
}
if (that.type === 'PolygonObject') {
options.heightMode = 0
options.height = 0
}
if (!that.type || (that.type !== 'tileset' && that.type !== 'bim' && that.type !== 'glb' && that.type !== 'layer')) {
let newObject = await new that.constructor(sdk2D, options)
newObject.onClick = that.onClick
newObject.onRightClick = that.onRightClick
newObject.onMouseMove = that.onMouseMove
if (that.type === 'TrajectoryMotion') {
that.firstPersonView = false
if (that.TweenAnimate) {
let state = that.state
if (state) {
that.state = false
}
if (!newObject.state) {
setTimeout(() => {
newObject.setMovePositionByDistance(Number(that.TweenAnimate._object.distance.toFixed(8)) + 0.00000001)
setTimeout(() => {
newObject.setMovePositionByDistance(Number(that.TweenAnimate._object.distance.toFixed(8)) + 0.00000002)
}, 500);
}, 500);
}
else {
newObject.setMovePositionByDistance(Number(that.TweenAnimate._object.distance.toFixed(8)))
}
that.state = state
}
else {
setTimeout(() => {
newObject.setMovePositionByDistance(0.00000001)
setTimeout(() => {
newObject.setMovePositionByDistance(0.00000002)
}, 500)
}, 500)
}
if (that.viewFollow) {
newObject.viewFollow = true
}
}
if (that.type === 'AttackArrowObject' || that.type === 'StraightArrowObject') {
if (that.spreadState && that.TweenAnimate && that.TweenAnimate._object) {
newObject.setSpreadProgressByTime(that.TweenAnimate._object.distance / that.TweenAnimate._valuesEnd.distance * that.spreadTime)
}
}
if (that.type === 'PincerArrowObject') {
if (that.spreadState && that.TweenAnimate && that.TweenAnimate._object) {
newObject.setSpreadProgressByTime(that.TweenAnimate._object.distance1 / that.TweenAnimate._valuesEnd.distance1 * that.spreadTime)
}
}
if (newObject.on && newObject.type !== 'glb') {
if (newObject.type === 'vector') {
newObject.data = that.data
newObject.load(() => {
if (newObject.entity) {
for (let i = 0; i < newObject.entity.entities.values.length; i++) {
newObject.entity.entities.values[i].show = that.entity.entities.values[i]._customShow === false ? false : true
}
}
})
}
await newObject.on()
}
// if (newObject.type && (newObject.type === 'tileset' || newObject.type === 'bim')) {
// newObject.height = -10000
// }
// // Cesium1.98版本二维模式下初次显示有问题1.110以上版本正常
// if (newObject.type && (newObject.type === 'glb')) {
// newObject.options.position.alt = 0
// }
}
}
else {
let that2 = sdk2D.entityMap.get(id)
if (that2) {
await that2.remove()
}
}
}
else {
for (let [key, obj] of sdk2D.entityMap) {
let that = sdk2D.entityMap.get(key)
if (that) {
await that.remove()
}
}
for (let [key, obj] of entityMap) {
if (obj.type === 'BillboardObject') {
obj.options.heightReference = 1
}
let options = syncObject.tools.deepCopyObj(obj.options)
if (!obj.type || (obj.type !== 'tileset' && obj.type !== 'bim' && obj.type !== 'glb' && obj.type !== 'layer')) {
let target = await new obj.constructor(sdk2D, options)
target.onClick = obj.onClick
target.onRightClick = obj.onRightClick
target.onMouseMove = obj.onMouseMove
if (obj.type === 'TrajectoryMotion') {
obj.firstPersonView = false
if (obj.TweenAnimate) {
let state = obj.state
if (state) {
obj.state = false
}
if (!target.state) {
setTimeout(() => {
target.setMovePositionByDistance(Number(obj.TweenAnimate._object.distance.toFixed(8)) + 0.000000001)
setTimeout(() => {
target.setMovePositionByDistance(Number(obj.TweenAnimate._object.distance.toFixed(8)) + 0.000000002)
}, 1500);
}, 1500);
}
else {
target.setMovePositionByDistance(Number(obj.TweenAnimate._object.distance.toFixed(8)))
}
obj.state = state
}
else {
setTimeout(() => {
target.setMovePositionByDistance(0.000000001)
setTimeout(() => {
target.setMovePositionByDistance(0.000000002)
}, 1500);
}, 1500);
}
if (obj.viewFollow) {
target.viewFollow = true
}
// else {
// newObject.viewFollow = false
// }
}
if (obj.type === 'AttackArrowObject' || obj.type === 'StraightArrowObject') {
if (obj.spreadState && obj.TweenAnimate && obj.TweenAnimate._object) {
target.setSpreadProgressByTime(obj.TweenAnimate._object.distance / obj.TweenAnimate._valuesEnd.distance * obj.spreadTime)
}
}
if (obj.type === 'PincerArrowObject') {
if (obj.spreadState && obj.TweenAnimate && obj.TweenAnimate._object) {
target.setSpreadProgressByTime(obj.TweenAnimate._object.distance1 / obj.TweenAnimate._valuesEnd.distance1 * obj.spreadTime)
}
}
if (target.on && obj.type !== 'glb') {
if (target.type === 'vector') {
target.data = obj.data
target.load(() => {
if (target.entity) {
for (let i = 0; i < target.entity.entities.values.length; i++) {
target.entity.entities.values[i].show = obj.entity.entities.values[i]._customShow === false ? false : true
}
}
})
}
await target.on()
}
// if (obj.type && (obj.type === 'tileset' || obj.type === 'bim')) {
// target.height = -10000
// }
// if (obj.type && (obj.type === 'glb')) {
// target.options.position.alt = 0
// }
}
}
}
}
async function syncData(sdk, id, entityId) {
syncData2(sdk, id, entityId)
// syncEntities()
// syncDataSources()
}
function syncEntities(entities1, entities2) {
if (!sdk3D) {
return
}
if (sdk2D) {
if (Array.isArray(entities1) || Array.isArray(entities2)) {
entities1 = null
entities2 = null
}
if (!entities1) {
entities1 = sdk2D.viewer.entities
}
if (!entities2) {
entities2 = sdk3D.viewer.entities
}
let entities2D = entities1
let entities3D = entities2
for (let i = entities2D.values.length - 1; i >= 0; i--) {
let flag = false
for (let m = entities3D.values.length - 1; m >= 0; m--) {
if (entities2D.values[i].id === entities3D.values[m].id) {
flag = true
entities2D.values[i] === entities3D.values[m]
}
}
if (!flag) {
entities2D.remove(entities2D.values[i])
}
}
for (let m = entities3D.values.length - 1; m >= 0; m--) {
let flag = false
for (let i = entities2D.values.length - 1; i >= 0; i--) {
if (entities2D.values[i].id === entities3D.values[m].id) {
flag = true
break
}
}
if (!flag) {
let entity = entities2D.add(entities3D.values[m])
// if (entity.rectangle) {
// // 设置高度,否则在某些位置无法显示,但色彩会变暗
// entity.rectangle.height = 0
// console.log('242342354235',entities3D.values[m])
// }
}
}
}
}
function syncDataSources(dataSources, type) {
if (!sdk3D) {
return
}
if (sdk2D) {
let dataSources2D = sdk2D.viewer.dataSources
if (dataSources) {
for (let i = dataSources2D._dataSources.length - 1; i >= 0; i--) {
if (dataSources2D._dataSources[i].name === dataSources.name) {
if (type === 'entities') {
syncEntities(dataSources2D._dataSources[i].entities, dataSources.entities)
}
if (type === 'clustering') {
dataSources2D._dataSources[i].clustering.enabled = dataSources.clustering.enabled
}
}
}
}
// for (let m = dataSources3D._dataSources.length - 1; m >= 0; m--) {
// let flag = false
// for (let i = dataSources2D._dataSources.length - 1; i >= 0; i--) {
// console.log(dataSources2D._dataSources[i].name, dataSources3D._dataSources[m].name)
// if (dataSources2D._dataSources[i].name === dataSources3D._dataSources[m].name) {
// flag = true
// break
// }
// }
// if (!flag) {
// dataSources2D.add(dataSources3D._dataSources[m])
// }
// }
}
}
function syncImageryLayerAdded(layer, index) {
sdk2D.viewer.imageryLayers.addImageryProvider(layer.imageryProvider, index)
}
function syncImageryLayerMoved(layer, newindxe, oldindex) {
let layer2d = sdk2D.viewer.imageryLayers._layers[oldindex]
if (!layer2d) {
return
}
// 移到最底层
if (newindxe === 0) {
sdk2D.viewer.imageryLayers.lowerToBottom(layer2d)
}
// 移到最高层
else if (newindxe === sdk3D.viewer.imageryLayers._layers.length - 1) {
sdk2D.viewer.imageryLayers.raiseToTop(layer2d)
}
else {
if (newindxe < oldindex) {
sdk2D.viewer.imageryLayers.lower(layer2d)
}
else {
sdk2D.viewer.imageryLayers.raise(layer2d)
}
}
}
function syncImageryLayerRemoved(layer, index) {
let layer2d = sdk2D.viewer.imageryLayers._layers[index]
if (!layer2d) {
return
}
sdk2D.viewer.imageryLayers.remove(layer2d)
}
function syncImageryLayerShownOrHidden(layer, index, state) {
let layer2d = sdk2D.viewer.imageryLayers._layers[index]
if (!layer2d) {
return
}
layer2d.show = state
}
async function syncPrimitives(primitive) {
if (!sdk3D) {
return
}
if (sdk2D) {
// await sdk2D.viewer.scene.primitives.remove(primitive)
// await sdk2D.viewer.scene.primitives.add(primitive)
let primitives2D = sdk2D.viewer.scene.primitives._primitives
let primitives3D = sdk3D.viewer.scene.primitives._primitives
// console.log(primitives2D, primitives3D)
// setTimeout(() => {
// sdk2D.viewer.scene.primitives._primitives[1] = sdk3D.viewer.scene.primitives._primitives[1]
// }, 2000);
for (let i = primitives2D.length - 1; i >= 1; i--) {
let flag = false
for (let m = primitives3D.length - 1; m >= 1; m--) {
if (primitives3D[m].id && primitives2D[m].id && (primitives3D[m].id === primitives2D[i].id)) {
flag = true
}
}
if (!flag) {
sdk2D.viewer.scene.primitives.remove(primitives2D[i])
}
}
for (let m = primitives3D.length - 1; m >= 1; m--) {
let flag = false
for (let i = primitives2D.length - 1; i >= 1; i--) {
if (primitives3D[m].id && primitives2D[m].id && (primitives3D[m].id === primitives2D[i].id)) {
flag = true
primitives2D[i].show = primitives3D[m].show
primitives2D[i].startColor = primitives3D[m].startColor
primitives2D[i].endColor = primitives3D[m].endColor
primitives2D[i].minimumSpeed = primitives3D[m].minimumSpeed
primitives2D[i].maximumSpeed = primitives3D[m].maximumSpeed
primitives2D[i].minimumParticleLife = primitives3D[m].minimumParticleLife
primitives2D[i].maximumParticleLife = primitives3D[m].maximumParticleLife
primitives2D[i].startScale = primitives3D[m].startScale
primitives2D[i].endScale = primitives3D[m].endScale
primitives2D[i].emissionRate = primitives3D[m].emissionRate
primitives2D[i].particleSize = primitives3D[m].particleSize
primitives2D[i].modelMatrix = primitives3D[m].modelMatrix
}
}
if (!flag) {
sdk2D.viewer.scene.primitives.add(primitives3D[m])
}
}
}
}
function eventBind(sdk, i, syncObject) {
let handler = new Cesium.ScreenSpaceEventHandler(
sdk.viewer.canvas
)
handler.setInputAction(() => {
activeViewer = i
}, Cesium.ScreenSpaceEventType.LEFT_DOWN)
handler.setInputAction(() => {
activeViewer = i
}, Cesium.ScreenSpaceEventType.RIGHT_DOWN)
handler.setInputAction(() => {
activeViewer = i
}, Cesium.ScreenSpaceEventType.WHEEL)
handlers.push(handler)
}
function syncViewer() {
let sdk = this.sdks[activeViewer]
let sdk2
if (activeViewer === 0) {
sdk2 = this.sdks[1]
}
else if (activeViewer === 1) {
sdk2 = this.sdks[0]
}
// this.sdks[0].viewer.trackedEntity = null
// this.sdks[1].viewer.trackedEntity = null
if (sdk.viewer.scene.mode === 2) {
if (this.sdks[0].viewer.trackedEntity) {
let distance = sdk.viewer.camera.positionCartographic.height
sdk2.viewer.camera.lookAt(
Cesium.Cartesian3.fromRadians(sdk.viewer.camera.positionCartographic.longitude, sdk.viewer.camera.positionCartographic.latitude, 0),
new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), distance)
)
}
else {
if (this.sdks[1].viewer.trackedEntity) {
this.sdks[1].viewer.entities.remove(this.sdks[1].viewer.trackedEntity)
this.sdks[1].viewer.trackedEntity = null
}
let centerResult84 = this.tools.cartesian3Towgs84(Cesium.Cartesian3.fromRadians(sdk.viewer.camera.positionCartographic.longitude, sdk.viewer.camera.positionCartographic.latitude, sdk.viewer.camera.positionCartographic.height), sdk.viewer)
sdk2.viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(centerResult84.lng, centerResult84.lat, centerResult84.alt),
})
}
}
else {
// 视角中心点(伪)
let centerResult = sdk.viewer.camera.pickEllipsoid(
new Cesium.Cartesian2(
sdk.viewer.canvas.clientWidth / 2,
sdk.viewer.canvas.clientHeight / (2 - ((90 + sdk.viewer.camera.pitch / (Cesium.Math.PI / 180)) / 110)),
),
)
if (!centerResult) {
centerResult = sdk.viewer.camera.positionWC
}
let height = this.tools.cartesian3Towgs84(sdk.viewer.camera.positionWC, sdk.viewer).alt
let centerResult84 = this.tools.cartesian3Towgs84(centerResult, sdk.viewer)
// console.log('--------------', sdk.viewer.camera.position, sdk.viewer.camera.positionWC, centerResult84, height)
sdk2.viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(centerResult84.lng, centerResult84.lat, height),
// orientation: {
// heading: sdk2.viewer.camera.heading,
// pitch: sdk2.viewer.camera.pitch,
// roll: sdk2.viewer.camera.roll
// }
})
}
}
function get2DView() {
return sdk2D
}
function get3DView() {
return sdk3D
}
function solveBug() {
// 在能显示的地方加载一个多边形解决二维模式下某些地方无法显示多边形的bug原因不明
sdk2D && sdk2D.viewer.entities.add({
show: false,
polygon: {
hierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray([100, 50, 100.0001, 50, 100.0001, 50.0001]))
}
})
}
function setActiveViewer(v) {
activeViewer = v
}
export { on, off, syncData, syncEntities, syncDataSources, syncPrimitives, get2DView, get3DView, setActiveViewer }

View File

@ -0,0 +1,92 @@
class ScreenRecord {
constructor() {
this.start()
}
start() {
navigator.mediaDevices.getDisplayMedia({
video: true
})
.then((stream) => {
// 需要更好的浏览器支持
// const mime = MediaRecorder.isTypeSupported('video/webm; codecs=vp9')
// ? 'video/webm; codecs=vp9'
// : 'video/webm'
this.mediaRecorder = new MediaRecorder(stream, {
// mimeType: mime,
mimeType: 'video/webm',
})
let chunks = []
this.mediaRecorder.addEventListener('dataavailable', function (e) {
chunks.push(e.data)
})
this.mediaRecorder.addEventListener('stop', async () => {
try {
let blob = new Blob(chunks, {
type: 'video/mp4',
})
const opts = {
suggestedName: '视频录制.mp4',
types: [
{
description: '文件类型',
accept: {
'video/mp4': ['.mp4'],
}
}
],
excludeAcceptAllOption: true
};
const handle = await window.showSaveFilePicker(opts); // 打开保存文件对话框
const writable = await handle.createWritable(); // 创建可写入的文件对象
// 写入视频内容
writable.write(blob);
await writable.close();
YJ.Global.ScreenRecord.screenRecord = null
} catch (error) {
console.info('文件保存失败:', error);
}
// let blob = new Blob(chunks, {
// type: chunks[0].type,
// })
// let url = URL.createObjectURL(blob)
// let a = document.createElement('a')
// a.href = url
// a.download = 'video.webm'
// a.click()
// this.recording = false
// YJ.Global.ScreenRecord.screenRecord = null
})
// 必须手动启动
this.mediaRecorder.start()
})
.catch((e) => {
console.info('取消录屏')
console.info(e)
YJ.Global.ScreenRecord.screenRecord = null
})
}
}
function startScreenRecord() {
if (YJ.Global.ScreenRecord.screenRecord) {
return '录屏任务进行中'
} else {
YJ.Global.ScreenRecord.screenRecord = new ScreenRecord()
}
}
function stopScreenRecord() {
if (YJ.Global.ScreenRecord && YJ.Global.ScreenRecord.screenRecord && YJ.Global.ScreenRecord.screenRecord) {
YJ.Global.ScreenRecord.screenRecord.mediaRecorder.stop()
YJ.Global.ScreenRecord.screenRecord = null
}
}
export { startScreenRecord, stopScreenRecord }

View File

@ -0,0 +1,707 @@
import Tools from '../../Tools'
import Dialog from '../../Obj/Element/Dialog';
import { legp } from '../../Obj/Element/datalist';
import MapPrint from '../MapPrint';
import { off as offSplitScreen } from "../SplitScreen";
import { off as offMultiViewportMode } from "../MultiViewportMode";
// 生成快照
const convertToImage = (container, options = {}) => {
// 设置放大倍数
const scale = window.devicePixelRatio;
// 传入节点原始宽高
const width = container.offsetWidth;
const height = container.offsetHeight;
// html2canvas配置项
const ops = {
scale,//比例,越大分辨率越高,图片越小
width,
height,
async: false,
x: 0,
y: 0,
backgroundColor: 'rgb(20,47,65)',
imageTimeout: 0,
useCORS: true,//允许跨域
allowTaint: false, //允许跨域数据污染'被污染'的canvas
tainttest: true,
foreignObjectRendering: true, //在浏览器支持的情况下使用ForeignObject模式渲染图片
...options
};
return html2canvas(container, ops).then(canvas => {
// 返回图片的二进制数据
return canvas.toDataURL("image/png");
});
}
async function ScreenShot(sdk, cd = () => { }) {
// const imgBlobData = await convertToImage(sdk.viewer.canvas);
const imgBlobData = sdk.viewer.canvas.toDataURL()
cd && cd(imgBlobData)
// try {
// const imgBlobData = await convertToImage(sdk.viewer.canvas);
// let arr = imgBlobData.split(','), mime = arr[0].match(/:(.*?);/)[1],
// bstr = atob(arr[1]), i = bstr.length, u8arr = new Uint8Array(i);
// while (i--) {
// u8arr[i] = bstr.charCodeAt(i);
// }
// let blob = new Blob([u8arr], { type: mime });
// const opts = {
// suggestedName: '截图.png',
// types: [
// {
// description: '文件类型',
// accept: {
// 'image/png': ['.png'],
// 'image/jpg': ['.jpg']
// }
// }
// ],
// excludeAcceptAllOption: true
// };
// const handle = await window.showSaveFilePicker(opts); // 打开保存文件对话框
// const writable = await handle.createWritable(); // 创建可写入的文件对象
// // 写入视频内容
// writable.write(blob);
// await writable.close();
// YJ.Global.ScreenRecord.screenRecord = null
// } catch (error) {
// console.info('文件保存失败:', error);
// }
}
let _DialogObject
async function ScreenShotHD(sdk, options = {}, cd = () => { }) {
if (!sdk) {
return
}
offSplitScreen(sdk)
offMultiViewportMode(sdk)
if (_DialogObject) {
_DialogObject.close()
_DialogObject = null
}
let enableTranslate = sdk.viewer.scene.screenSpaceCameraController.enableTranslate
let enableTilt = sdk.viewer.scene.screenSpaceCameraController.enableTilt
let enableLook = sdk.viewer.scene.screenSpaceCameraController.enableLook
let scale = 1
let level
let progressInputElm
let progressBarElm
let rangeNodeActive
let rangeNodeActiveText
let startScreenShotObject
let tools = new Tools();
_DialogObject = await new Dialog(sdk, {}, {
title: '高清出图', left: '180px', top: '100px',
confirmCallBack: (options) => {
if (startScreenShotObject) {
startScreenShotObject.desist()
startScreenShotObject = null
}
progressInputElm && (progressInputElm.style.width = '0%')
rangeNodeActive && (rangeNodeActive.style.left = '0%')
progressBarElm && (progressBarElm.style.width = '0%')
rangeNodeActiveText && (rangeNodeActiveText.innerHTML = '0%')
startScreenShotObject = new startScreenShot()
},
closeCallBack: () => {
sdk.viewer.scene.screenSpaceCameraController.enableTranslate = enableTranslate;
sdk.viewer.scene.screenSpaceCameraController.enableTilt = enableTilt;
sdk.viewer.scene.screenSpaceCameraController.enableLook = enableLook;
sdk.viewer._element.getElementsByClassName('compass')[0].style.pointerEvents = 'auto'
if (startScreenShotObject) {
startScreenShotObject.desist()
startScreenShotObject = null
}
_DialogObject = undefined
}
})
_DialogObject._element.body.className = _DialogObject._element.body.className + ' screenShotHD'
let contentElm = document.createElement('div');
contentElm.innerHTML = `
<span class="custom-divider"></span>
<div class="div-item">
<div class="row text" style="align-items: flex-start;">
<div class="col">
<span>当前窗口长宽:<span class="input-width">${sdk.viewer.canvas.width}</span>*<span class="input-height">${sdk.viewer.canvas.height}</span>像素</span>
</div>
</div>
<div class="row scale-box" style="align-items: flex-start;">
<div class="col">
<span class="label">图片大小</span>
<div class="input input-select scale"></div>
<span>倍窗口</span>
</div>
</div>
<div class="row text" style="align-items: flex-start;">
<div class="col">
<span>输出图片长宽:<span class="output-width">${sdk.viewer.canvas.width * scale}</span>*<span class="output-height">${sdk.viewer.canvas.height * scale}</span>像素</span>
</div>
</div>
<div class="row" style="align-items: flex-start; margin-bottom: 20px;">
<div class="col">
<span class="label">输出进度</span>
<div class="range-box">
<div class="range-bg">
<div class="range-process-box">
<div class="range-process"></div>
</div>
</div>
<div class="range-node-box">
<span class="range-node-text">0%</span>
<span class="range-node-text">100%</span>
<div class="range-node-active"><span class="range-node-active-text">0%</span></div>
</div>
<input class="progress-input" type="range" max="100" min="0" step="0.01">
</div>
</div>
</div>
</div>
<span class="custom-divider"></span>
`
_DialogObject.contentAppChild(contentElm)
sdk.viewer.scene.screenSpaceCameraController.enableTranslate = false;
sdk.viewer.scene.screenSpaceCameraController.enableTilt = false;
sdk.viewer.scene.screenSpaceCameraController.enableLook = false;
sdk.viewer._element.getElementsByClassName('compass')[0].style.pointerEvents = 'none'
let centerResult = sdk.viewer.camera.pickEllipsoid(
new Cesium.Cartesian2(
sdk.viewer.canvas.clientWidth / 2,
sdk.viewer.canvas.clientHeight / 2,
),
)
if (!centerResult) {
centerResult = sdk.viewer.camera.pickEllipsoid(
new Cesium.Cartesian2(
sdk.viewer.canvas.clientWidth / 2,
sdk.viewer.canvas.clientHeight / (2 - ((90 + sdk.viewer.camera.pitch / (Cesium.Math.PI / 180)) / 110)),
),
)
if (!centerResult) {
centerResult = sdk.viewer.camera.position
}
}
let height = tools.cartesian3Towgs84(sdk.viewer.camera.position, sdk.viewer).alt
let centerResult84 = tools.cartesian3Towgs84(centerResult, sdk.viewer)
sdk.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(centerResult84.lng, centerResult84.lat, height),
orientation: { heading: 0, pitch: Cesium.Math.toRadians(-90), roll: 0 },
duration: 1,
})
let scaleData = []
for (let i = 1; i <= 10; i++) {
scaleData.push({
name: i,
value: i
})
}
progressInputElm = document.getElementsByClassName('progress-input')[0]
progressBarElm = document.getElementsByClassName('range-process')[0]
rangeNodeActive = contentElm.getElementsByClassName('range-node-active')[0]
rangeNodeActiveText = contentElm.getElementsByClassName('range-node-active-text')[0]
let scaleDataLegpObject = legp(_DialogObject._element.content.getElementsByClassName('scale-box')[0], ".scale")
if (scaleDataLegpObject) {
scaleDataLegpObject.legp_search(scaleData)
let scaleDataLegpElm = _DialogObject._element.content.getElementsByClassName('scale')[0].getElementsByTagName('input')[0]
scale = scaleData[0].value
scaleDataLegpObject.legp_searchActive(scaleData[0].value)
scaleDataLegpElm.value = scaleData[0].value
scaleDataLegpElm.addEventListener('input', () => {
for (let i = 0; i < scaleData.length; i++) {
if (scaleData[i].value == scaleDataLegpElm.value) {
scale = scaleData[i].value
_DialogObject._element.content.getElementsByClassName('output-width')[0].innerHTML = sdk.viewer.canvas.width * scale
_DialogObject._element.content.getElementsByClassName('output-height')[0].innerHTML = sdk.viewer.canvas.height * scale
break
}
}
})
}
class startScreenShot {
constructor() {
this.state = false
this.start()
}
start() {
if (sdk.viewer.scene.imageryLayers._layers.length <= 1) {
this.error = '未加载底图!'
window.ELEMENT && window.ELEMENT.Message({
message: this.error,
type: 'warning',
duration: 1500
});
console.warn(this.error)
return
}
let haveBaseMap = false
for (let i = 0; i < sdk.viewer.scene.imageryLayers._layers.length; i++) {
let layer = sdk.viewer.scene.imageryLayers._layers[i];
if (layer && layer.show && (!layer.notes || layer.notes !== 'default-base-map')) {
haveBaseMap = true
}
}
if (!haveBaseMap) {
this.error = '未加载底图!'
window.ELEMENT && window.ELEMENT.Message({
message: this.error,
type: 'warning',
duration: 1500
});
console.warn(this.error)
return
}
let scaleZoom = 0;
this.state = true;
let _this = this
computeLayers(1);
function computeLayers(s) {
let num = s * 2;
if (num <= scale) {
scaleZoom++;
computeLayers(num);
}
}
scaleZoom = scaleZoom + 1;
let centerResult = sdk.viewer.camera.pickEllipsoid(
new Cesium.Cartesian2(
sdk.viewer.canvas.width / 2,
sdk.viewer.canvas.height / (2 - ((90 + sdk.viewer.camera.pitch / (Cesium.Math.PI / 180)) / 110))
)
);
if (!centerResult) {
centerResult = sdk.viewer.camera.position;
}
function altitudeToZoom(altitude) {
let A = 40487.57;
let B = 0.00007096758;
let C = 91610.74;
let D = -40467.74;
return Math.round(D + (A - D) / (1 + Math.pow(altitude / C, B)));
}
let height = tools.cartesian3Towgs84(sdk.viewer.camera.position, sdk.viewer).alt;
let zoom = altitudeToZoom(height) + 1;
let rectangle = sdk.viewer.camera.computeViewRectangle();
// if (height > 9000000) {
// height = 9000000
// }
// let curRectangle = new Cesium.Rectangle(Cesium.Math.toRadians(centerResult84.lng - (height / stepX)), Cesium.Math.toRadians(centerResult84.lat - (height / stepY)), Cesium.Math.toRadians(centerResult84.lng + (height / stepX)), Cesium.Math.toRadians(centerResult84.lat + (height / stepY)))
// for (let i = 1; i < sdk.viewer.scene.imageryLayers._layers.length; i++) {
// let layer = sdk.viewer.scene.imageryLayers._layers[i]
// createCanvas(layer)
// }
let total;
let totalCount = 0;
let progress = {};
let index = 0;
let layerLength = 0
let countIndex = 0
for (let i = 0; i < sdk.viewer.scene.imageryLayers._layers.length; i++) {
let layer = sdk.viewer.scene.imageryLayers._layers[i];
if (layer && layer.show && layer.imageryProvider && layer.imageryProvider.url && Cesium.Rectangle.intersection(rectangle, layer.imageryProvider.rectangle) && (!layer.notes || layer.notes !== 'default-base-map')) {
layerLength++
}
}
let itemTotalProgress = 100 / layerLength
let flag = false
createCanvas(index);
function createCanvas(i, totalCanvas) {
let layer = sdk.viewer.scene.imageryLayers._layers[i];
if (!layer) {
if (!flag) {
_this.error = '当前范围内未找到底图数据!'
window.ELEMENT && window.ELEMENT.Message({
message: _this.error,
type: 'warning',
duration: 1500
});
console.warn(_this.error)
}
return
}
if (!layer.show || !layer.imageryProvider || !layer.imageryProvider.url || !Cesium.Rectangle.intersection(rectangle, layer.imageryProvider.rectangle) || (layer.notes && layer.notes === 'default-base-map')) {
let m = i += 1;
createCanvas(m, totalCanvas);
return;
}
flag = true
countIndex++
progress[i] = {
value: 0
}
let itemTotalCount = 0;
let targetLevel
let imageryProvider = layer.imageryProvider;
if (level || level === 0) {
targetLevel = level
}
else {
targetLevel = (zoom + scaleZoom - 1)
if (targetLevel > imageryProvider.maximumLevel) {
targetLevel = imageryProvider.maximumLevel
}
if (targetLevel < imageryProvider.minimumLevel) {
targetLevel = imageryProvider.minimumLevel
}
}
function readyPromise() {
let MinTile = imageryProvider.tilingScheme.positionToTileXY(
Cesium.Rectangle.northwest(rectangle),
targetLevel
);
let MaxTile = imageryProvider.tilingScheme.positionToTileXY(
Cesium.Rectangle.southeast(rectangle),
targetLevel
);
if (!MinTile || !MaxTile) {
let error = '超出地球范围!'
window.ELEMENT && window.ELEMENT.Message({
message: error,
type: 'warning',
duration: 1500
});
console.warn(error)
return
}
let OfXTilesAtLevel = imageryProvider.tilingScheme.getNumberOfXTilesAtLevel(targetLevel)
let OfYTilesAtLevel = imageryProvider.tilingScheme.getNumberOfYTilesAtLevel(targetLevel)
let MinTileX = MinTile.x;
let MinTileY = MinTile.y;
let MaxTileX = MaxTile.x;
let MaxTileY = MaxTile.y;
// if (MinTileX > MaxTileX) {
// MinTileX = MinTileX - OfXTilesAtLevel
// }
let imgWidth = 256;
let imgHeight = 256;
let itemTotal = (MaxTileX - MinTileX + 1) * (MaxTileY - MinTileY + 1);
// var canvas = new fabric.Canvas();
let canvas = document.createElement('canvas');
canvas.width = (MaxTileX - MinTileX + 1) * imgWidth;
canvas.height = (MaxTileY - MinTileY + 1) * imgHeight;
let ctx = canvas.getContext('2d');
let maxRectangle = imageryProvider.tilingScheme.tileXYToRectangle(MaxTileX, MaxTileY, targetLevel);
let minRectangle = imageryProvider.tilingScheme.tileXYToRectangle(MinTileX, MinTileY, targetLevel);
let canvasNativeRectangle = new Cesium.Rectangle(minRectangle.west, maxRectangle.south, maxRectangle.east, minRectangle.north);
// sdk.viewer.entities.add({
// rectangle: {
// coordinates: canvasNativeRectangle,
// material: Cesium.Color.YELLOW.withAlpha(0.2),
// },
// });
// sdk.viewer.entities.add({
// rectangle: {
// coordinates: rectangle,
// material: Cesium.Color.BLACK.withAlpha(0.2),
// },
// });
let nativeRectangle = rectangle;
let x1 = nativeRectangle.west - canvasNativeRectangle.west;
let x2 = canvasNativeRectangle.east - nativeRectangle.east;
let y1 = canvasNativeRectangle.north - nativeRectangle.north;
let y2 = nativeRectangle.south - canvasNativeRectangle.south;
let ratioX1 = x1 / (canvasNativeRectangle.east - canvasNativeRectangle.west);
if (ratioX1 === Infinity) {
ratioX1 = 0;
}
let ratioX2 = x2 / (canvasNativeRectangle.east - canvasNativeRectangle.west);
if (ratioX2 === Infinity) {
ratioX2 = 0;
}
let ratioY1 = y1 / (canvasNativeRectangle.north - canvasNativeRectangle.south);
if (ratioY1 === Infinity) {
ratioY1 = 0;
}
let ratioY2 = y2 / (canvasNativeRectangle.north - canvasNativeRectangle.south);
if (ratioY2 === Infinity) {
ratioY2 = 0;
}
let differenceX1 = canvas.width * ratioX1;
let differenceY1 = canvas.height * ratioY1;
let differenceX2 = canvas.width * ratioX2;
let differenceY2 = canvas.height * ratioY2;
canvas.width = canvas.width - differenceX1 - differenceX2;
canvas.height = canvas.height - differenceY1 - differenceY2;
if (canvas.width == 0) {
canvas.width = 1
}
if (canvas.height == 0) {
canvas.height = 1
}
let y = MaxTileY;
let x = MaxTileX;
let tileArray = []
for (let y = MaxTileY; y >= MinTileY; y--) {
for (let x = MaxTileX; x >= MinTileX; x--) {
tileArray.push({ x, y })
}
}
let speed = 30
let obj = {
count: 0
};
let count = 0;
let times = -1
let obj2 = {
count: 0
}
let count2 = 0
Object.defineProperty(obj2, 'count', {
get: function () {
return count2;
},
set: function (newValue) {
count2 = newValue;
if (count2 >= speed) {
traversal10()
}
}
});
Object.defineProperty(obj, 'count', {
get: function () {
return count;
},
set: function (newValue) {
count = newValue;
progress[i].value = itemTotalCount / itemTotal * itemTotalProgress;
let totalProgress = 0
for (const key in progress) {
totalProgress = totalProgress + progress[key].value
}
progressBarElm.style.width = totalProgress * 0.99 + '%';
rangeNodeActive.style.left = totalProgress * 0.99 + '%';
rangeNodeActiveText.innerHTML = Math.floor(totalProgress * 0.99 * 100) / 100 + '%';
if (count === (MaxTileX - MinTileX + 1) * (MaxTileY - MinTileY + 1)) {
let ctx = canvas.getContext('2d');
let cloneCanvas = canvas.cloneNode(true);
let cloneCtx = cloneCanvas.getContext('2d');
let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
cloneCtx.putImageData(imageData, 0, 0);
canvas.width = sdk.viewer.canvas.width * scale;
canvas.height = sdk.viewer.canvas.height * scale;
ctx.drawImage(cloneCanvas, 0, 0, canvas.width, canvas.height);
if (totalCanvas) {
let ctx = totalCanvas.getContext('2d');
ctx.drawImage(canvas, 0, 0);
if (countIndex != layerLength) {
let m = i += 1;
createCanvas(m, totalCanvas);
return;
}
else {
let imgBlobData = totalCanvas.toDataURL('image/jpeg', 0.95);
const tempCanvas = document.createElement('canvas');
const tempCtx = tempCanvas.getContext('2d');
tempCanvas.width = totalCanvas.width / scale
tempCanvas.height = totalCanvas.height / scale
tempCtx.drawImage(totalCanvas, 0, 0, tempCanvas.width, tempCanvas.height);
MapPrint(sdk, tempCanvas.toDataURL('image/jpeg', 0.95), rectangle, imgBlobData)
progressBarElm.style.width = '100%';
rangeNodeActive.style.left = '100%';
rangeNodeActiveText.innerHTML = '100%';
_this.state = false
}
}
else {
if (countIndex != layerLength) {
let m = i += 1;
createCanvas(m, canvas);
return;
}
else {
let imgBlobData = canvas.toDataURL('image/jpeg', 0.95);
const tempCanvas = document.createElement('canvas');
const tempCtx = tempCanvas.getContext('2d');
tempCanvas.width = canvas.width / scale;
tempCanvas.height = canvas.height / scale;
tempCtx.drawImage(canvas, 0, 0, tempCanvas.width, tempCanvas.height);
// canvas.width = canvas.width / scale
// canvas.height = canvas.height / scale
MapPrint(sdk, tempCanvas.toDataURL('image/jpeg', 0.95), rectangle, imgBlobData)
progressBarElm.style.width = '100%';
rangeNodeActive.style.left = '100%';
rangeNodeActiveText.innerHTML = '100%';
_this.state = false
}
}
}
}
});
if (imageryProvider._readyError) {
obj.count = (MaxTileX - MinTileX + 1) * (MaxTileY - MinTileY + 1)
}
else {
traversal10()
}
function traversal10() {
obj2.count = 0
count2 = 0
times++
for (let i = times * speed; i < (times + 1) * speed; i++) {
if (i >= tileArray.length) {
return
}
traversal(i)
}
}
function traversal(i) {
if (!_this.state) {
return
}
try {
let x = tileArray[i].x
if (x < 0) {
x = x + OfXTilesAtLevel
}
const img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.onload = async function () {
ctx.drawImage(img, ((tileArray[i].x - MinTileX) * imgWidth) - parseFloat(differenceX1.toFixed(0)), ((tileArray[i].y - MinTileY) * imgHeight) - parseFloat(differenceY1.toFixed(0)), imgWidth, imgHeight);
itemTotalCount++;
obj.count++;
obj2.count++;
};
img.onerror = function () {
itemTotalCount++;
obj.count++;
obj2.count++;
};
let url;
if (imageryProvider.url.indexOf('{x}') !== -1 && imageryProvider.url.indexOf('{y}') !== -1 && imageryProvider.url.indexOf('{z}') !== -1) {
url = imageryProvider.url.replace(/\{x\}/g, x).replace(/\{y\}/g, tileArray[i].y).replace(/\{z\}/g, targetLevel);
}
else if (imageryProvider.url.indexOf('{TileMatrix}') !== -1 && imageryProvider.url.indexOf('{TileRow}') !== -1 && imageryProvider.url.indexOf('{TileCol}') !== -1) {
url = imageryProvider.url.replace(/\{TileCol\}/g, x).replace(/\{TileRow\}/g, tileArray[i].y).replace(/\{TileMatrix\}/g, targetLevel);
}
else if (imageryProvider._layer && imageryProvider._style && imageryProvider._tileMatrixSetID && imageryProvider._format) {
url = imageryProvider.url + `&tilematrix=${targetLevel}&layer=${imageryProvider._layer}&style=${imageryProvider._style}&tilerow=${y}&tilecol=${x}&tilematrixset=${imageryProvider._tileMatrixSetID}&format=${imageryProvider._format}`;
}
else {
url = imageryProvider.url + `tile/${targetLevel}/${tileArray[i].y}/${x}`;
}
img.src = url;
} catch (error) {
itemTotalCount++;
obj.count++;
obj2.count++;
}
}
function traversal2() {
if (!_this.state) {
return
}
try {
const img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.onload = async function () {
ctx.drawImage(img, ((x - MinTileX) * imgWidth) - parseFloat(differenceX1.toFixed(0)), ((y - MinTileY) * imgHeight) - parseFloat(differenceY1.toFixed(0)), imgWidth, imgHeight);
itemTotalCount++;
obj.count++;
if (x > MinTileX) {
x--
}
else {
if (y > MinTileY) {
y--
x = MaxTileX
}
else {
return
}
}
traversal()
};
let url;
if (imageryProvider.url.indexOf('{x}') !== -1 && imageryProvider.url.indexOf('{y}') !== -1 && imageryProvider.url.indexOf('{z}') !== -1) {
url = imageryProvider.url.replace(/\{x\}/g, x).replace(/\{y\}/g, y).replace(/\{z\}/g, targetLevel);
}
else if (imageryProvider.url.indexOf('{TileMatrix}') !== -1 && imageryProvider.url.indexOf('{TileRow}') !== -1 && imageryProvider.url.indexOf('{TileCol}') !== -1) {
url = imageryProvider.url.replace(/\{TileCol\}/g, x).replace(/\{TileRow\}/g, y).replace(/\{TileMatrix\}/g, targetLevel);
}
else if (imageryProvider._layer && imageryProvider._style && imageryProvider._tileMatrixSetID && imageryProvider._format) {
url = imageryProvider.url + `&tilematrix=${targetLevel}&layer=${imageryProvider._layer}&style=${imageryProvider._style}&tilerow=${y}&tilecol=${x}&tilematrixset=${imageryProvider._tileMatrixSetID}&format=${imageryProvider._format}`;
}
else {
url = imageryProvider.url + `tile/${targetLevel}/${y}/${x}`;
}
img.src = url;
} catch (error) {
itemTotalCount++;
obj.count++;
if (x >= MinTileX) {
x--
}
else {
if (y >= MinTileY) {
y--
x = MaxTileX
}
else {
return
}
}
traversal()
}
}
}
if (imageryProvider._readyError) {
progress[i] = {
value: itemTotalProgress
}
readyPromise()
return
}
imageryProvider.readyPromise.then(() => {
readyPromise()
}).catch((e) => {
imageryProvider._readyError = true
progress[i] = {
value: itemTotalProgress
}
readyPromise()
});
}
}
desist() {
this.state = false
}
}
}
export { ScreenShot, ScreenShotHD }

View File

@ -0,0 +1,655 @@
import { get2DView } from '../MultiViewportMode'
import { getSdk } from '../SplitScreen'
import { flyTo } from '../global'
import Tools from '../../Tools'
let tools
let state = false
let scale = '1:100万'
function SheetIndexStatusSwitch(sdk, s = false) {
if(!sdk) {
return
}
if (!tools) {
tools = new Tools()
}
state = s ? true : false
if (state) {
changeScale(sdk, scale)
} else {
close(sdk)
}
let sdk2D = get2DView()
if (sdk2D) {
if (state) {
changeScale(sdk, scale)
} else {
close(sdk2D)
}
}
let sdkD = getSdk().sdkD
if(sdkD && sdk !== sdkD) {
SheetIndexStatusSwitch(sdkD, s)
}
// return new Promise(async (resolve, reject) => {
// setTimeout(() => {
// resolve()
// }, 1000);
// })
}
function changeScale(sdk, v) {
scale = v
if (state) {
open(sdk)
}
let sdk2D = get2DView()
if (sdk2D) {
if (state) {
open(sdk2D)
}
}
return new Promise(async (resolve, reject) => {
setTimeout(() => {
resolve()
}, 1000);
})
}
function getStatus() {
return state
}
function open(sdk) {
close(sdk)
let cartographic = sdk.viewer.camera.positionCartographic
let options = {
position: {
lng: Cesium.Math.toDegrees(cartographic.longitude),
lat: Cesium.Math.toDegrees(cartographic.latitude),
alt: cartographic.height,
},
}
let viewer = sdk.viewer;
switch (scale) {
case '1:100万':
options.position.alt = 16000000
break
case '1:50万':
options.position.alt = 5000000
break
case '1:25万':
options.position.alt = 2300000
break
case '1:10万':
options.position.alt = 680000
break
case '1:5万':
options.position.alt = 385000
break
case '1:2.5万':
options.position.alt = 180000
break
case '1:1万':
options.position.alt = 90000
break
case '1:5000':
options.position.alt = 46000
break
}
let gridPrimitives
let labelCollection
for (let i = 0; i < viewer.scene.primitives._primitives.length; i++) {
if (viewer.scene.primitives._primitives[i].name === 'SheetIndexGridPrimitives') {
gridPrimitives = viewer.scene.primitives._primitives[i];
for (let j = 0; j < gridPrimitives._primitives.length; j++) {
if (gridPrimitives._primitives[j].name === 'SheetIndexLabelCollection') {
labelCollection = gridPrimitives._primitives[j];
break;
}
}
break;
}
}
if (!gridPrimitives) {
gridPrimitives = new Cesium.PrimitiveCollection();
gridPrimitives.name = 'SheetIndexGridPrimitives';
viewer.scene.primitives.add(gridPrimitives);
}
if (!labelCollection) {
labelCollection = new Cesium.LabelCollection();
labelCollection.name = 'SheetIndexLabelCollection';
}
let stationaryFrames = 0;
let maxRectangle = null;
gridPrimitives.postRenderEvent = () => {
let height = sdk.viewer.camera.positionCartographic.height
switch (scale) {
case '1:100万':
options.position.alt = 16000000
break
case '1:50万':
options.position.alt = 5000000
break
case '1:25万':
options.position.alt = 2300000
break
case '1:10万':
options.position.alt = 680000
break
case '1:5万':
options.position.alt = 385000
break
case '1:2.5万':
options.position.alt = 180000
break
case '1:1万':
options.position.alt = 90000
break
case '1:5000':
options.position.alt = 46000
break
}
if (height > options.position.alt * 5) {
maxRectangle = null;
gridPrimitives.removeAll();
return
}
let isChanged = false
let rectangle = getViewExtend();
let minLng = Cesium.Math.toDegrees(rectangle.west)
let minLat = Cesium.Math.toDegrees(rectangle.south)
let maxLng = Cesium.Math.toDegrees(rectangle.east)
let maxLat = Cesium.Math.toDegrees(rectangle.north)
if (minLng > maxLng) {
maxLng += 360
}
rectangle = { minLng, minLat, maxLng, maxLat }
if (maxRectangle) {
if ((maxRectangle.minLng > rectangle.minLng || maxRectangle.minLat > rectangle.minLat || maxRectangle.maxLng < rectangle.maxLng || maxRectangle.maxLat < rectangle.maxLat) && Cesium.Math.toDegrees(sdk.viewer.camera.pitch) < 0) {
isChanged = true
}
}
else {
countMapSheet(scale)
}
if (isChanged) {
stationaryFrames++;
// 确认相机已经静止足够多帧
if (stationaryFrames >= 50) {
countMapSheet(scale)
isChanged = false
}
} else {
stationaryFrames = 0;
}
}
options.complete = () => {
viewer.scene.postRender.addEventListener(gridPrimitives.postRenderEvent);
}
flyTo(sdk, options, 0.5)
/**
* 根据比例尺创建图幅线
* @param {string} scale - 比例尺(可选值:'1:100万', '1:50万', '1:25万', '1:10万', '1:5万', '1:2.5万', '1:1万', '1:5000'
*/
function countMapSheet(scale) {
labelCollection.removeAll();
gridPrimitives.removeAll();
labelCollection = new Cesium.LabelCollection();
labelCollection.name = 'SheetIndexLabelCollection';
gridPrimitives.add(labelCollection);
let rectangle = getViewExtend();
let lngStep // 经度步长
let latStep // 纬度步长
// let limitLng // 显示界限(根据图幅线数量显隐)
// let limitLat
// Math.abs(maxLng-minLng)/lngStep, Math.abs(maxLat-minLat)/latStep
let scaleByDistance
switch (scale) {
case '1:100万':
lngStep = 6;
latStep = 4;
scaleByDistance = new Cesium.NearFarScalar(
20000000,
1,
80000000,
0
)
break
case '1:50万':
lngStep = 3;
latStep = 2;
scaleByDistance = new Cesium.NearFarScalar(
5000000,
1,
30000000,
0
)
break
case '1:25万':
lngStep = 1.5;
latStep = 1;
scaleByDistance = new Cesium.NearFarScalar(
2300000,
1,
20000000,
0
)
break
case '1:10万':
lngStep = 0.5;
latStep = 1 / 3;
scaleByDistance = new Cesium.NearFarScalar(
680000,
1,
5000000,
0
)
break
case '1:5万':
lngStep = 0.25;
latStep = 1 / 6;
scaleByDistance = new Cesium.NearFarScalar(
385000,
1,
2400000,
0
)
break
case '1:2.5万':
lngStep = 0.125;
latStep = 1 / 12;
scaleByDistance = new Cesium.NearFarScalar(
180000,
1,
1200000,
0
)
break
case '1:1万':
lngStep = 0.0625;
latStep = 1 / 24;
scaleByDistance = new Cesium.NearFarScalar(
90000,
1,
700000,
0
)
break
case '1:5000':
lngStep = 0.03125;
latStep = 1 / 48;
scaleByDistance = new Cesium.NearFarScalar(
46000,
1,
300000,
0
)
break
// case '1:1000':
// lngStep = 0.01041667;
// latStep = 0.00694444;
// break
// case '1:2000':
// lngStep = 0.00520833;
// latStep = 0.00347222;
// break
}
let minLng = Math.floor((180 + Cesium.Math.toDegrees(rectangle.west)) / lngStep) * lngStep - 180;
let minLat = Math.floor((88 + Cesium.Math.toDegrees(rectangle.south)) / latStep) * latStep - 88;
let maxLng = Math.ceil((180 + Cesium.Math.toDegrees(rectangle.east)) / lngStep) * lngStep - 180;
let maxLat = Math.ceil((88 + Cesium.Math.toDegrees(rectangle.north)) / latStep) * latStep - 88;
if (minLng > maxLng) {
maxLng += 360
}
maxRectangle = { minLng, minLat, maxLng, maxLat }
if (minLat < -88) {
minLat = -88
}
if (maxLat > 88) {
maxLat = 88
}
if (((maxRectangle.maxLng - maxRectangle.minLng) / lngStep) * ((maxRectangle.maxLat - maxRectangle.minLat) / latStep) > 7000) {
maxRectangle = null
return
}
// 绘制经线
for (let lng = minLng; lng <= maxLng; lng += lngStep) {
const positions = [];
let a = []
for (let lat = minLat; Math.floor(lat * 1000000000) / 1000000000 <= maxLat; lat += (latStep / 2)) {
a.push([lng, lat])
positions.push(Cesium.Cartesian3.fromDegrees(lng, lat, 8848));
}
if (maxLat != 88 && maxLat + (latStep / 2) >= 88) {
positions.push(Cesium.Cartesian3.fromDegrees(lng, 88, 8848));
}
const geometryInstances = new Cesium.GeometryInstance({
geometry: new Cesium.PolylineGeometry({
positions: positions,
width: 1,
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
arcType: Cesium.ArcType.RHUMB,
})
});
gridPrimitives.add(new Cesium.Primitive({
geometryInstances: geometryInstances,
appearance: new Cesium.PolylineMaterialAppearance({
material: Cesium.Material.fromType('Color', {
color: Cesium.Color.fromCssColorString('#fcfc00')
})
})
}));
if (lng < maxLng) {
// 计算图幅中心坐标
for (let lat = minLat; lat < maxLat; lat += latStep) {
let position = { lng: lng + (lngStep / 2), lat: lat + (latStep / 2) };
if (position.lat > maxLat) {
break
}
let sheetNumber = calculateMapSheetNumber(position.lng, position.lat, scale);
labelCollection.add({
position: Cesium.Cartesian3.fromDegrees(position.lng, position.lat, 8848),
text: sheetNumber,
font: '16px Inter, sans-serif',
fillColor: Cesium.Color.fromCssColorString('#fcfc00'),
// backgroundColor: Cesium.Color.fromCssColorString('#FFA145'),
// backgroundPadding: new Cesium.Cartesian2(8, 4),
pixelOffset: new Cesium.Cartesian2(0, 0),
showBackground: false,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
scale: 1.0,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 80000000),
scaleByDistance: scaleByDistance
})
// labelCollection.add({
// position: Cesium.Cartesian3.fromDegrees(position.lng, position.lat, 10000),
// text: position.lng + ' , ' + position.lat,
// font: '16px Inter, sans-serif',
// fillColor: Cesium.Color.WHITE,
// backgroundColor: Cesium.Color.fromCssColorString('#165DFF').withAlpha(0.8),
// backgroundPadding: new Cesium.Cartesian2(8, 4),
// pixelOffset: new Cesium.Cartesian2(0, 30),
// showBackground: true,
// verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
// horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
// scale: 1.0,
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000000),
// scaleByDistance: new Cesium.NearFarScalar(
// 5000000,
// 1,
// 20000000,
// 0
// )
// })
}
}
}
// 绘制纬线
for (let lat = minLat; Math.floor(lat * 1000000000) / 1000000000 <= maxLat; lat += latStep) {
const positions = [];
let a = []
for (let lng = minLng; lng <= maxLng; lng += (lngStep / 2)) {
a.push([lng, lat])
positions.push(Cesium.Cartesian3.fromDegrees(lng, lat, 8848));
}
const geometryInstances = new Cesium.GeometryInstance({
geometry: new Cesium.PolylineGeometry({
positions: positions,
width: 1,
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
arcType: Cesium.ArcType.RHUMB,
})
});
gridPrimitives.add(new Cesium.Primitive({
geometryInstances: geometryInstances,
appearance: new Cesium.PolylineMaterialAppearance({
material: Cesium.Material.fromType('Color', {
color: Cesium.Color.fromCssColorString('#fcfc00')
})
})
}));
}
}
/**
* 根据经纬度和比例尺计算地图图幅编号
* @param {number} longitude - 经度(十进制格式)
* @param {number} latitude - 纬度(十进制格式)
* @param {string} scale - 比例尺(可选值:'1:100万', '1:50万', '1:25万', '1:10万', '1:5万', '1:2.5万', '1:1万', '1:5000'
* @returns {string} 对应的图幅编号
*/
function calculateMapSheetNumber(lng, lat, scale) {
let lngStep // 经度步长
let latStep // 纬度步长
switch (scale) {
case '1:100万':
lngStep = 6;
latStep = 4;
break
case '1:50万':
lngStep = 3;
latStep = 2;
break
case '1:25万':
lngStep = 1.5;
latStep = 1;
break
case '1:10万':
lngStep = 0.5;
latStep = 1 / 3;
break
case '1:5万':
lngStep = 0.25;
latStep = 1 / 6;
break
case '1:2.5万':
lngStep = 0.125;
latStep = 1 / 12;
break
case '1:1万':
lngStep = 0.0625;
latStep = 1 / 24;
break
case '1:5000':
lngStep = 0.03125;
latStep = 1 / 48;
break
// case '1:1000':
// lngStep = 0.01041667;
// latStep = 0.00694444;
// break
// case '1:2000':
// lngStep = 0.00520833;
// latStep = 0.00347222;
// break
}
// 确保纬度在 -88 到 88 度之间(因为 88° 以上采用特殊分幅)
lat = Math.max(-88, Math.min(88, lat));
lat = Math.abs(lat); // 取绝对值
let B6 = 'ABCDEFGHIJKLMNOPQRSTUV'
let B2 = lng
let B3 = lat
// 计算 1:100 万地形图的列号
const col100W = Math.floor(B2 / 6 + 31);
// 1:100 万地形图的行号对应的字母A-V
const rowChar = B6.charAt(Math.floor(B3 / 4 + 1) - 1);
// 比例尺代码映射
const scaleCodeMap = {
'1:100万': '', // 1:100万不需要额外代码
'1:50万': 'B',
'1:25万': 'C',
'1:10万': 'D',
'1:5万': 'E',
'1:2.5万': 'F',
'1:1万': 'G',
'1:5000': 'H'
};
// 获取比例尺代码
const scaleCode = scaleCodeMap[scale];
if (!scaleCode && scale !== '1:100万') {
throw new Error('不支持的比例尺,请使用: 1:100万, 1:50万, 1:25万, 1:10万, 1:5万, 1:2.5万, 1:1万, 1:5000');
}
// 计算在 1:100 万图幅内的行列号(根据不同比例尺)
let rowIn100W, colIn100W;
rowIn100W = rowChar + col100W;
const num1 = Math.floor((Math.ceil(B3 / 4) * 4 - B3) / latStep) + 1;
const rowNum = ("000" + num1).slice(-3);
const remainder = B2 - Math.floor(B2 / 6) * 6;
const num2 = Math.floor(remainder / lngStep) + 1;
const colNum = ("000" + num2).slice(-3);
switch (scale) {
case '1:100万':
// 1:100万直接使用行号和列号
return rowIn100W;
case '1:50万':
break;
case '1:25万':
break;
case '1:10万':
break;
case '1:5万':
break;
case '1:2.5万':
break;
case '1:1万':
break;
case '1:5000':
break;
default:
throw new Error('不支持的比例尺');
}
// 生成最终编号
return rowIn100W + scaleCode + rowNum + colNum;
}
// 获取当前视角矩形范围(二维模式)
function getViewExtend() {
let params = {};
let extend = viewer.camera.computeViewRectangle();
if (viewer.scene.mode == 2) {
//2D下会可能拾取不到坐标extend返回undefined,所以做以下转换
let canvas = viewer.scene.canvas;
let upperLeft = new Cesium.Cartesian2(0, 0);//canvas左上角坐标转2d坐标
let lowerRight = new Cesium.Cartesian2(
canvas.clientWidth,
canvas.clientHeight
);//canvas右下角坐标转2d坐标
let ellipsoid = viewer.scene.globe.ellipsoid;
let upperLeft3 = viewer.camera.pickEllipsoid(
upperLeft,
ellipsoid
);//2D转3D世界坐标
let lowerRight3 = viewer.camera.pickEllipsoid(
lowerRight,
ellipsoid
);//2D转3D世界坐标
if (!upperLeft3) {
let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, { x: 0, y: 0, z: 6356755 });
upperLeft.y = cartesian2.y + 5
upperLeft3 = viewer.camera.pickEllipsoid(
upperLeft,
ellipsoid
);
}
if (!lowerRight3) {
let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, { x: 0, y: 0, z: -6356755 });
lowerRight.y = cartesian2.y - 5
lowerRight3 = viewer.camera.pickEllipsoid(
lowerRight,
ellipsoid
);
// console.log('lowerRight3', lowerRight, lowerRight3)
}
let upperLeftCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(
upperLeft3
);//3D世界坐标转弧度
let lowerRightCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(
lowerRight3
);//3D世界坐标转弧度
if ((lowerRight.y - upperLeft.y) / (lowerRight.x - upperLeft.x) <= 0.49998752339363695) {
extend = new Cesium.Rectangle(Cesium.Math.toRadians(-180), Cesium.Math.toRadians(-90), Cesium.Math.toRadians(180), Cesium.Math.toRadians(90))
}
else {
extend = new Cesium.Rectangle(upperLeftCartographic.longitude, lowerRightCartographic.latitude, lowerRightCartographic.longitude, upperLeftCartographic.latitude);
}
// console.log("经度:" + minx + "----" + maxx);
// console.log("纬度:" + miny + "----" + maxy);
return extend;
} else {
//3D获取方式
return extend;
}
}
}
function close(sdk) {
let viewer = sdk.viewer;
let gridPrimitives
let labelCollection
for (let i = 0; i < viewer.scene.primitives._primitives.length; i++) {
if (viewer.scene.primitives._primitives[i].name === 'SheetIndexGridPrimitives') {
gridPrimitives = viewer.scene.primitives._primitives[i];
for (let j = 0; j < gridPrimitives._primitives.length; j++) {
if (gridPrimitives._primitives[j].name === 'SheetIndexLabelCollection') {
labelCollection = gridPrimitives._primitives[j];
break;
}
}
break;
}
}
labelCollection && (labelCollection.removeAll());
gridPrimitives && (gridPrimitives.removeAll());
gridPrimitives && (viewer.scene.postRender.removeEventListener(gridPrimitives.postRenderEvent));
}
export { SheetIndexStatusSwitch, changeScale, getStatus }

30
src/Global/Skin/index.js Normal file
View File

@ -0,0 +1,30 @@
let theme = {
"yingguangse": new Map(),
"gonganlan": new Map(),
"hong": new Map(),
}
// 主色
theme.yingguangse.set("--color-sdk-base", "#00ffff")
// 辅色
theme.yingguangse.set("--color-sdk-auxiliary", "#004242")
theme.yingguangse.set("--color-sdk-auxiliary-public", "#ffffff")
// 预警色
theme.yingguangse.set("--color-sdk-warning-0", "#1BF8C3")
theme.yingguangse.set("--color-sdk-warning-1", "#F16C55")
theme.yingguangse.set("--color-sdk-warning-2", "#FFA145")
theme.yingguangse.set("--color-sdk-warning-3", "#FFDF53")
// 文本色
theme.yingguangse.set("--color-sdk-text-head", "#FFFFFF")
theme.yingguangse.set("--color-sdk-text-head-1", "#E6F7FF")
theme.yingguangse.set("--color-sdk-text-head-2", "#ADF1FF")
// 渐变色
theme.yingguangse.set("--color-sdk-gradual", "#00ffff 6.25%, #00ffff 100%")
theme.yingguangse.set("--color-sdk-bg-gradual", "#00ffff33 0%, #00ffff00 100%")
export default theme;
function setSkin(name) {
document.documentElement.style.setProperty('--color-sdk-base', 'rgba(0, 55, 55, 1)');
}
export { setSkin }

View File

@ -0,0 +1,578 @@
/**
* @name: click
* @author: Administrator
* @date: 2023-05-28 11:05
* @descriptionclick
* @update: 2023-05-28 11:05
*/
let leftClickHandler = null
let rightClickHandler = null
let MoveHandler = null
let leftClickCallbackMap = new Map()
let rightClickCallbackMap = new Map()
let MoveCallbackMap = new Map()
let selectedFeature;
function cartesian3Towgs84(cartesian, viewer) {
var ellipsoid = viewer.scene.globe.ellipsoid
var cartesian3 = new Cesium.Cartesian3(
cartesian.x,
cartesian.y,
cartesian.z
)
var cartographic = ellipsoid.cartesianToCartographic(cartesian3)
var lat = Cesium.Math.toDegrees(cartographic.latitude)
var lng = Cesium.Math.toDegrees(cartographic.longitude)
var alt = cartographic.height < 0 ? 0 : cartographic.height
return {
lng: lng,
lat: lat,
alt: alt,
}
}
function getcartesian(sdk, movement) {
if (movement.endPosition) {
movement.endPosition.y -= 2
}
let position = movement.position || movement.endPosition
// 获取世界坐标系地表坐标,考虑地形,不包括模型,倾斜摄影模型表面;
let cartesian = sdk.viewer.scene.pickPosition(position)
if (!cartesian) {
const ray = sdk.viewer.camera.getPickRay(position); //相交的射线
cartesian = sdk.viewer.scene.globe.pick(ray, sdk.viewer.scene);
}
return cartesian
}
function openLeftClick(sdk, cb) {
if (!sdk || !sdk.viewer) {
return
}
let click = true
leftClickHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
leftClickHandler.setInputAction((movement) => {
let cartesian = sdk.viewer.scene.pickPosition(movement.position)
if (!cartesian) {
const ray = sdk.viewer.camera.getPickRay(movement.position); //相交的射线
cartesian = sdk.viewer.scene.globe.pick(ray, sdk.viewer.scene);
}
if (!cartesian) {
return
}
let pos84 = cartesian3Towgs84(cartesian, sdk.viewer)
cb && cb(pos84)
if (click) {
click = false
setTimeout(() => {
click = true
}, 600);
if (!YJ.Measure.GetMeasureStatus() && cartesian) {
let flag = false
for (let i = leftClickCallbackMap.size - 1; i >= 0; i--) {
let key = Array.from(leftClickCallbackMap.keys())[i]
let obj = leftClickCallbackMap.get(key)
if (obj) {
if (obj.that) {
// 是否为多边形
if (obj.that.type === 'PolygonObject') {
// 是否可点击y
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 3) {
let pt = turf.point([pos84.lng, pos84.lat]);
let polyPos = []
for (let i = 0; i < obj.that.options.positions.length; i++) {
polyPos.push([
obj.that.options.positions[i].lng,
obj.that.options.positions[i].lat
])
}
polyPos.push([
obj.that.options.positions[0].lng,
obj.that.options.positions[0].lat
])
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 聚集地
else if (obj.that.type === 'AssembleObject') {
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 3) {
let positions = obj.that.computeAssemble(obj.that.options.positions, true)
let pt = turf.point([pos84.lng, pos84.lat]);
let polyPos = []
for (let i = 0; i < positions.length; i += 2) {
polyPos.push([
positions[i],
positions[i + 1]
])
}
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 单箭头
else if (obj.that.type === 'AttackArrowObject') {
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 3) {
let pt = turf.point([pos84.lng, pos84.lat]);
let positions = obj.that.computeAttackArrow(obj.that.options.positions)
let polyPos = []
for (let m = 0; m < positions.length; m++) {
let pos84 = cartesian3Towgs84(positions[m], sdk.viewer)
polyPos.push([pos84.lng, pos84.lat])
}
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 双箭头
else if (obj.that.type === 'PincerArrowObject') {
if (obj.that.picking) {
if (obj.that.options.positions && obj.that.options.positions.length >= 5) {
let pt = turf.point([pos84.lng, pos84.lat]);
let positions = obj.that.computePincerArrow(obj.that.options.positions)
let polyPos = []
for (let m = 0; m < positions.length; m++) {
let pos84 = cartesian3Towgs84(positions[m], sdk.viewer)
polyPos.push([pos84.lng, pos84.lat])
}
let pos84_0 = cartesian3Towgs84(positions[0], sdk.viewer)
polyPos.push([pos84_0.lng, pos84_0.lat])
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 圆
else if (obj.that.type === 'CircleObject') {
if (obj.that.picking) {
let pt = turf.point([pos84.lng, pos84.lat]);
if (obj.that.options.center && obj.that.options.radius) {
let center = [obj.that.options.center.lng, obj.that.options.center.lat];
let radius = obj.that.options.radius / 1000;
let options = { steps: 360, units: 'kilometers' };
let circle = turf.circle(center, radius, options);
let contain = turf.booleanPointInPolygon(pt, circle);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
// 扇形
else if (obj.that.type === 'SectorObject') {
if (obj.that.picking) {
let pt = turf.point([pos84.lng, pos84.lat]);
if (obj.that.options.center && obj.that.options.radius && obj.that.options.startAngle && obj.that.options.endAngle) {
let positions = obj.that.calSector(obj.that.options.center, obj.that.options.radius, obj.that.options.startAngle, obj.that.options.endAngle, undefined, true)
let polyPos = []
for (let m = 0; m < positions.length; m++) {
polyPos.push([positions[m].lng, positions[m].lat])
}
let poly = turf.polygon([polyPos]);
let contain = turf.booleanPointInPolygon(pt, poly);
if (contain) {
obj.callback(
movement,
obj.that.options.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
flag = true
break
}
}
}
}
}
}
}
if (!flag) {
const pick = sdk.viewer.scene.pick(movement.position)
if (pick) {
if (pick.id) {
let entityId
// 矢量
if (pick.id.type && pick.id.type === 'vector' && pick.id.parentId) {
let obj = leftClickCallbackMap.get(pick.id.parentId)
if (obj.that.picking && obj.that.geojson) {
for (let i = 0; i < obj.that.geojson.features.length; i++) {
if (obj.that.geojson.features[i].id === pick.id._id) {
obj.callback(
movement,
obj.that.geojson.features[i].id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
else if (typeof pick.id.id == 'string') {
let array = pick.id.id.split('-')
array.splice(array.length - 1, 1)
entityId = array.join('-')
}
if (pick.id.properties && pick.id.properties.id && leftClickCallbackMap.has(pick.id.properties.id._value)) {
let obj = leftClickCallbackMap.get(pick.id.properties.id._value)
if (obj.that.picking) {
obj.callback(
movement,
pick.id.properties.id._value,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else if (leftClickCallbackMap.has(pick.id.id)) {
let obj = leftClickCallbackMap.get(pick.id.id)
if (obj.that.picking) {
obj.callback(
movement,
pick.id.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else if (entityId && leftClickCallbackMap.has(entityId)) {
let obj = leftClickCallbackMap.get(entityId)
if (obj.that.picking) {
obj.callback(
movement,
entityId,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else if (pick.primitive) {
if (typeof pick.id == 'string' && leftClickCallbackMap.has(pick.id)) {
let obj = leftClickCallbackMap.get(pick.id)
obj.callback(
movement,
pick.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
else {
if (pick.primitive && pick.primitive.id) {
if (leftClickCallbackMap.has(pick.primitive.id)) {
let obj = leftClickCallbackMap.get(pick.primitive.id)
if (obj.that.picking) {
if (obj.that.type === 'bim') {
if (YJ.Global.getBimPickStatus(sdk)) {
obj.callback(
movement,
pick.primitive,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else {
obj.callback(
movement,
pick.primitive.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
}
if (pick.content && (!pick.primitive || !pick.primitive.id)) {
if (leftClickCallbackMap.has(pick.content.tileset.id)) {
let obj = leftClickCallbackMap.get(pick.content.tileset.id)
if (obj.that.picking) {
if (obj.that.type === 'bim') {
if (YJ.Global.getBimPickStatus(sdk)) {
obj.callback(
movement,
pick.content.tileset,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
else {
obj.callback(
movement,
pick.content.tileset.id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
}
}
}
}
// if (click) {
// click = false
// setTimeout(() => {
// click = true
// }, 300);
// if (!YJ.Measure.GetMeasureStatus()) {
// }
// }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
// leftClickHandler.setInputAction(function (movement) {
// const feature = sdk.viewer.scene.pick(movement.endPosition);
// // unselectFeature(selectedFeature);
// if (selectedFeature) {
// selectedFeature.color = Cesium.Color.WHITE;
// }
// selectedFeature = feature
// if (feature) {
// feature.color = Cesium.Color.YELLOW;
// }
// }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
// }
}
function closeLeftClick(sdk) {
leftClickHandler.destroy() //关闭事件句柄
leftClickHandler = null
// }
}
function openRightClick(sdk) {
if (!sdk || !sdk.viewer) {
return
}
rightClickHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
rightClickHandler.setInputAction((movement) => {
if (!YJ.Measure.GetMeasureStatus()) {
const pick = sdk.viewer.scene.pick(movement.position)
if (pick && pick.id) {
let id
if (pick.id.type && pick.id.type === 'vector' && pick.id.parentId) {
let obj = rightClickCallbackMap.get(pick.id.parentId)
if (obj.that.picking && obj.that.geojson) {
for (let i = 0; i < obj.that.geojson.features.length; i++) {
if (obj.that.geojson.features[i].id === pick.id._id) {
obj.callback(
movement,
obj.that.geojson.features[i].id,
cartesian3Towgs84(getcartesian(sdk, movement), sdk.viewer), obj.that)
}
}
}
}
else {
if (typeof pick.id === 'string') {
id = pick.id
}
else {
id = pick.id.id
}
if (rightClickCallbackMap.has(id)) {
let obj = rightClickCallbackMap.get(id)
if (obj.that.picking) {
let cartesian = getcartesian(sdk, movement)
if (!cartesian) {
return
}
obj.callback(
movement,
id,
cartesian3Towgs84(cartesian, sdk.viewer), obj.that)
}
}
}
}
if (pick && pick.content) {
if (rightClickCallbackMap.has(pick.content.tileset.id)) {
let obj = rightClickCallbackMap.get(pick.content.tileset.id)
if (obj.that.picking) {
if (obj.that.type === 'bim') {
if (YJ.Global.getBimPickStatus(sdk)) {
let cartesian = getcartesian(sdk, movement)
if (!cartesian) {
return
}
obj.callback(
movement,
pick.getProperty('id'),
cartesian3Towgs84(cartesian, sdk.viewer), obj.that)
}
}
else {
let cartesian = getcartesian(sdk, movement)
if (!cartesian) {
return
}
obj.callback(
movement,
pick.content.tileset.id,
cartesian3Towgs84(cartesian, sdk.viewer), obj.that)
}
}
}
}
}
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
}
function closeRightClick() {
if (rightClickHandler) {
rightClickHandler.destroy() //关闭事件句柄
rightClickHandler = null
}
}
function openMove(sdk) {
MoveHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
MoveHandler.setInputAction(function (movement) {
const pick = sdk.viewer.scene.pick(movement.endPosition);
// unselectFeature(selectedFeature);
// if (selectedFeature) {
// let color = '#fff'
// let state = selectedFeature.getProperty('state')
// switch (state) {
// case '0':
// color = '#fff'
// break;
// case '1':
// color = '#f00'
// break;
// case '2':
// color = '#0f0'
// break;
// case '3':
// color = '#00f'
// break;
// default:
// }
// selectedFeature.color = Cesium.Color.fromCssColorString(color).withAlpha(selectedFeature.tileset.transparency)
// }
// if (pick && pick.id) { }
// if (pick && pick.content) {
// if (MoveCallbackMap.has(pick.content.tileset.id)) {
// let obj = MoveCallbackMap.get(pick.content.tileset.id)
// if (obj.that.picking) {
// if (obj.that.type === 'bim') {
// if (YJ.Global.getBimPickStatus(sdk)) {
// selectedFeature = pick
// pick.color = Cesium.Color.YELLOW;
// }
// else {
// selectedFeature = null
// }
// }
// else {
// selectedFeature = pick
// pick.color = Cesium.Color.YELLOW;
// }
// }
// else {
// selectedFeature = null
// }
// }
// }
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}
function closeMove() {
if (MoveHandler) {
MoveHandler.destroy() //关闭事件句柄
MoveHandler = null
}
}
/*注册左键回调*/
function regLeftClickCallback(id, callback, that) {
leftClickCallbackMap.set(id, { callback, that })
}/*取消左键回调*/
function unRegLeftClickCallback(id,) {
leftClickCallbackMap.delete(id,)
}
/*注册右键回调*/
function regRightClickCallback(id, callback, that) {
rightClickCallbackMap.set(id, { callback, that })
}/*取消右键回调*/
function unRegRightClickCallback(id,) {
rightClickCallbackMap.delete(id,)
}
/*注册左键回调*/
function regMoveCallback(id, callback, that) {
MoveCallbackMap.set(id, { callback, that })
}/*取消左键回调*/
function unregMoveCallback(id,) {
MoveCallbackMap.delete(id,)
}
function getLeftClickState() {
if (leftClickHandler) {
return true
}
else {
false
}
}
function getRightClickState() {
if (rightClickHandler) {
return true
}
else {
false
}
}
function getMoveState() {
if (MoveHandler) {
return true
}
else {
false
}
}
export { openLeftClick, closeLeftClick, regLeftClickCallback, unRegLeftClickCallback, openRightClick, closeRightClick, regRightClickCallback, unRegRightClickCallback, openMove, closeMove, regMoveCallback, unregMoveCallback, getLeftClickState, getRightClickState, getMoveState }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,366 @@
/*
let datasource=null
let dataSourcePromise = null
// let enabled = true
let dataSourcexg = null
function createCluster(viewer) {
datasource = new Cesium.CustomDataSource("dataSource1");
dataSourcePromise = viewer.dataSources.add(datasource);
dataSourcePromise.then((dataSource)=> {
// return;
const pixelRange = 15;
const minimumClusterSize = 3;
const enabled = false;
dataSourcexg = dataSource
dataSource.clustering.enabled = enabled; //聚合开启
dataSource.clustering.pixelRange = pixelRange; //设置像素范围,以扩展显示边框
dataSource.clustering.minimumClusterSize = minimumClusterSize; //设置最小的聚合点数目,超过此数目才能聚合
let removeListener;
//按聚合层级创建对应图标
const pinBuilder = new Cesium.PinBuilder();
// console.log('pinBuilder',pinBuilder);
var pin100 = pinBuilder
.fromText("100+", Cesium.Color.BLUE, 48)
.toDataURL();
var pin50 = pinBuilder
.fromText("50+", Cesium.Color.BLUE, 48)
.toDataURL();
var pin40 = pinBuilder
.fromText("40+", Cesium.Color.RED, 48)
.toDataURL();
var pin30 = pinBuilder
.fromText("30+", Cesium.Color.RED, 48)
.toDataURL();
var pin20 = pinBuilder
.fromText("20+", Cesium.Color.RED, 48)
.toDataURL();
var pin10 = pinBuilder
.fromText("10+", Cesium.Color.RED, 48)
.toDataURL();
// 10以内聚合图标
const singleDigitPins = new Array(8);
for (let i = 0; i < singleDigitPins.length; ++i) {
singleDigitPins[i] = pinBuilder
.fromText(`${i + 2}`, Cesium.Color.VIOLET, 48)
.toDataURL();
}
function customStyle() {
if (Cesium.defined(removeListener)) {
removeListener();
removeListener = undefined;
} else {
removeListener = dataSource.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.BOTTOM;
if (clusteredEntities.length >= 100) {
cluster.billboard.image = pin100;
} else if (clusteredEntities.length >= 50) {
cluster.billboard.image = pin50;
} else if (clusteredEntities.length >= 40) {
cluster.billboard.image = pin40;
} else if (clusteredEntities.length >= 30) {
cluster.billboard.image = pin30;
} else if (clusteredEntities.length >= 20) {
cluster.billboard.image = pin20;
} else if (clusteredEntities.length >= 10) {
cluster.billboard.image = pin10;
} else {
cluster.billboard.image =
singleDigitPins[clusteredEntities.length - 2];
}
}
);
}
// force a re-cluster with the new styling
const pixelRange = dataSource.clustering.pixelRange;
dataSource.clustering.pixelRange = 0;
dataSource.clustering.pixelRange = pixelRange;
}
customStyle();
var viewModel = {
pixelRange: pixelRange,
minimumClusterSize: minimumClusterSize,
};
Cesium.knockout.track(viewModel);
function subscribeParameter(name) {
Cesium.knockout
.getObservable(viewModel, name)
.subscribe(function (newValue) {
dataSource.clustering[name] = newValue;
});
}
subscribeParameter("pixelRange");
subscribeParameter("minimumClusterSize");
});
}
function addCluster(entity) {
datasource.entities.add(entity)
}
function remove_entity_from_cluster(entity) {
datasource.entities.remove(entity)
}
function switchCluster(status){
dataSourcexg.clustering.enabled = status
}
*/
import Tools from '../../Tools'
import {
getGroundCover
} from '../../Global/global'
/*创建聚合,只能聚合point billboardlabel*/
function createCluster(viewer) {
let tools = new Tools()
let cluster = new Cesium.CustomDataSource("sdk-dataSource1")
let dataSourcePromise = viewer.dataSources.add(cluster)
dataSourcePromise.then(dataSource => {
// if (!get2DView()) {
// dataSource.entities.collectionChanged.addEventListener((entities) => {
// syncDataSources(dataSource, 'entities')
// })
// }
var pixelRange = 15;
var minimumClusterSize = 2;
var enabled = false;
dataSource.clustering.enabled = enabled;
dataSource.clustering.pixelRange = pixelRange;
dataSource.clustering.minimumClusterSize = minimumClusterSize;
var removeListener;
var pinBuilder = new Cesium.PinBuilder();
var pin50 = pinBuilder
.fromText("50+", Cesium.Color.RED, 48)
.toDataURL();
var pin40 = pinBuilder
.fromText("40+", Cesium.Color.ORANGE, 48)
.toDataURL();
var pin30 = pinBuilder
.fromText("30+", Cesium.Color.YELLOW, 48)
.toDataURL();
var pin20 = pinBuilder
.fromText("20+", Cesium.Color.GREEN, 48)
.toDataURL();
var pin10 = pinBuilder
.fromText("10+", Cesium.Color.BLUE, 48)
.toDataURL();
var singleDigitPins = new Array(8);
for (var i = 0; i < singleDigitPins.length; ++i) {
singleDigitPins[i] = pinBuilder
.fromText("" + (i + 2), Cesium.Color.VIOLET, 48)
.toDataURL();
}
function customStyle() {
if (Cesium.defined(removeListener)) {
removeListener();
removeListener = undefined;
} else {
removeListener = dataSource.clustering.clusterEvent.addEventListener(
function (clusteredEntities, cluster) {
// cluster.label.show = false;
// cluster.label.verticalOrigin = false;
cluster.billboard.show = true;
cluster.billboard.id = cluster.label.id;
cluster.billboard.verticalOrigin =
Cesium.VerticalOrigin.BOTTOM;
// 根据聚合数量的多少设置不同层级的图片以及大小
/*if (clusteredEntities.length >= 50) {
cluster.billboard.image = that.combineIconAndLabel(host + '1_大红.png', clusteredEntities.length, 64);
cluster.billboard.width = 72;
cluster.billboard.height = 72;
} else if (clusteredEntities.length >= 40) {
cluster.billboard.image = that.combineIconAndLabel(host + '1_大黄.png', clusteredEntities.length, 64);
cluster.billboard.width = 56;
cluster.billboard.height = 56;
} else if (clusteredEntities.length >= 30) {
cluster.billboard.image = that.combineIconAndLabel(host + '1_大蓝.png', clusteredEntities.length, 64);
cluster.billboard.width = 48;
cluster.billboard.height = 48;
} else if (clusteredEntities.length >= 20) {
cluster.billboard.image = that.combineIconAndLabel(host + '1_小红.png', clusteredEntities.length, 64);
cluster.billboard.width = 48;
cluster.billboard.height = 48;
} else if (clusteredEntities.length >= 10) {
cluster.billboard.image = that.combineIconAndLabel(host + '1_小黄.png', clusteredEntities.length, 64);
cluster.billboard.width = 48;
cluster.billboard.height = 48;
} else {
cluster.billboard.image = that.combineIconAndLabel(host + '1_小蓝.png', clusteredEntities.length, 64);
cluster.billboard.width = 40;
cluster.billboard.height = 40;
}*/
cluster.billboard.image = tools.getSourceRootPath() + '/img/cluster.png'
cluster.billboard.disableDepthTestDistance = getGroundCover() ? undefined : Number.POSITIVE_INFINITY
cluster.label.verticalOrigin = Cesium.VerticalOrigin.CENTER
cluster.label.font = "18px Arial,sans-serif",
// cluster.label.scale = 0.5
cluster.label.disableDepthTestDistance = getGroundCover() ? undefined : Number.POSITIVE_INFINITY
cluster.label.style = Cesium.LabelStyle.FILL
cluster.label.showBackground = true
cluster.label.backgroundColor = Cesium.Color.WHITE.withAlpha(0.0)
if (clusteredEntities.length >= 1000) {
cluster.billboard.scale = 1.5;
cluster.label.pixelOffset = new Cesium.Cartesian2(-28, -46)
} else if (clusteredEntities.length >= 100) {
cluster.billboard.scale = 1.25;
cluster.label.pixelOffset = new Cesium.Cartesian2(-21, -40)
} else if (clusteredEntities.length >= 50) {
cluster.billboard.scale = 1.1;
cluster.label.pixelOffset = new Cesium.Cartesian2(-16, -36)
} else if (clusteredEntities.length >= 40) {
cluster.billboard.scale = 1.05;
cluster.label.pixelOffset = new Cesium.Cartesian2(-16, -34)
} else if (clusteredEntities.length >= 30) {
cluster.billboard.scale = 1;
cluster.label.pixelOffset = new Cesium.Cartesian2(-16, -32)
} else if (clusteredEntities.length >= 20) {
cluster.billboard.scale = 0.95;
cluster.label.pixelOffset = new Cesium.Cartesian2(-16, -30)
} else if (clusteredEntities.length >= 10) {
cluster.billboard.scale = 0.9;
cluster.label.pixelOffset = new Cesium.Cartesian2(-16, -28)
} else {
cluster.billboard.scale = 0.8;
cluster.label.pixelOffset = new Cesium.Cartesian2(-11, -25)
}
// if (clusteredEntities.length >= 50) {
// cluster.billboard.image = pin50;
// } else if (clusteredEntities.length >= 40) {
// cluster.billboard.image = pin40;
// } else if (clusteredEntities.length >= 30) {
// cluster.billboard.image = pin30;
// } else if (clusteredEntities.length >= 20) {
// cluster.billboard.image = pin20;
// } else if (clusteredEntities.length >= 10) {
// cluster.billboard.image = pin10;
// } else {
// cluster.billboard.image =
// singleDigitPins[clusteredEntities.length - 2];
// }
}
);
}
// force a re-cluster with the new styling
var pixelRange = dataSource.clustering.pixelRange;
dataSource.clustering.pixelRange = 0;
dataSource.clustering.pixelRange = pixelRange;
}
// start with custom style
customStyle();
var viewModel = {
pixelRange: pixelRange,
minimumClusterSize: minimumClusterSize,
};
Cesium.knockout.track(viewModel);
function subscribeParameter(name) {
Cesium.knockout
.getObservable(viewModel, name)
.subscribe(function (newValue) {
dataSource.clustering[name] = newValue;
});
}
subscribeParameter("pixelRange");
subscribeParameter("minimumClusterSize");
// var handler = new Cesium.ScreenSpaceEventHandler(this.sdk.viewer.scene.canvas);
// handler.setInputAction((movement) => {
// var pickedLabel = this.sdk.viewer.scene.pick(movement.position);
//
// if (Cesium.defined(pickedLabel)) {
// this.log(pickedLabel)
// var ids = pickedLabel.id;
// if (Array.isArray(ids)) {
// for (var i = 0; i < ids.length; ++i) {
// ids[i].billboard.color = Cesium.Color.RED;
// }
// }
// }
// }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
})
}
/**
* @description 开启/关闭聚合效果
* @method set_cluster_status
* @param [enable=false] {boolean}默认关闭
* @memberOf Tool-3D
* */
function switchCluster(sdk, enable = false) {
let viewer = sdk.viewer
for (let i = 0; i < viewer.dataSources._dataSources.length; i++) {
if (viewer.dataSources._dataSources[i].name === "sdk-dataSource1") {
viewer.dataSources._dataSources[i].clustering.enabled = enable
// syncDataSources(viewer.dataSources._dataSources[i], 'clustering')
break
}
}
}
function addCluster(sdk, entity) {
let viewer = sdk.viewer
if(!viewer) {
return
}
for (let i = 0; i < viewer.dataSources._dataSources.length; i++) {
if (viewer.dataSources._dataSources[i].name === "sdk-dataSource1") {
viewer.dataSources._dataSources[i].entities.add(entity)
break
}
}
}
function remove_entity_from_cluster(viewer, entity) {
for (let i = 0; i < viewer.dataSources._dataSources.length; i++) {
if (viewer.dataSources._dataSources[i].name === "sdk-dataSource1") {
viewer.dataSources._dataSources[i].entities.remove(entity)
break
}
}
}
function updateCluster(viewer) {
if(!viewer) {
return
}
for (let i = 0; i < viewer.dataSources._dataSources.length; i++) {
if (viewer.dataSources._dataSources[i].name === "sdk-dataSource1") {
viewer.dataSources._dataSources[i].clustering._cluster()
break
}
}
}
export { createCluster, addCluster, switchCluster, remove_entity_from_cluster, updateCluster }

159
src/Global/efflect/index.js Normal file
View File

@ -0,0 +1,159 @@
/*全局特效*/
let rainStages = null;
let snowStages = null;
let fogStages = null;
let nightVisionStages = null;
// 雨
const FS_Rain = `uniform sampler2D colorTexture;//输入的场景渲染照片
varying vec2 v_textureCoordinates;
uniform float tiltAngle;
uniform float rainSize;
uniform float rainWidth;
uniform float rainSpeed;
float hash(float x){
return fract(sin(x*133.3)*13.13);
}
void main(void){
float time = czm_frameNumber / rainSpeed;
vec2 resolution = czm_viewport.zw;
vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);
vec3 c=vec3(.6,.7,.8);
float a= tiltAngle;
float si=sin(a),co=cos(a);
uv*=mat2(co,-si,si,co);
uv*=length(uv+vec2(0,4.9))*rainSize+1.;
float v=1.-sin(hash(floor(uv.x*rainWidth))*2.);
float b=clamp(abs(sin(20.*time*v+uv.y*(5./(2.+v))))-.95,0.,1.)*20.;
c*=v*b; //屏幕上雨的颜色
gl_FragColor = mix(texture2D(colorTexture, v_textureCoordinates), vec4(c,1), 0.5); //将雨和三维场景融合
}`
// 雪
const FS_Snow = `uniform sampler2D colorTexture;
varying vec2 v_textureCoordinates;
uniform float snowSize;
uniform float snowSpeed;
float snow(vec2 uv,float scale)
{
float time = czm_frameNumber / snowSpeed;
float w=smoothstep(1.,0.,-uv.y*(scale/10.));if(w<.1)return 0.;
uv+=time/scale;uv.y+=time*2./scale;uv.x+=sin(uv.y+time*.5)/scale;
uv*=scale;vec2 s=floor(uv),f=fract(uv),p;float k=3.,d;
p=.5+.35*sin(11.*fract(sin((s+p+scale)*mat2(7,3,6,5))*5.))-f;d=length(p);k=min(d,k);
k=smoothstep(0.,k,sin(f.x+f.y)*0.01*snowSize);
return k*w;
}
void main(void){
vec2 resolution = czm_viewport.zw;
vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);
vec3 finalColor=vec3(0);
//float c=smoothstep(1.,0.3,clamp(uv.y*.3+.8,0.,.75));
float c = 0.0;
c+=snow(uv,30.)*.0;
c+=snow(uv,20.)*.0;
c+=snow(uv,15.)*.0;
c+=snow(uv,10.);
c+=snow(uv,8.);
c+=snow(uv,6.);
c+=snow(uv,5.);
finalColor=(vec3(c));
gl_FragColor = mix(texture2D(colorTexture, v_textureCoordinates), vec4(finalColor,1), 0.5);
}
`;
// 雾
const FS_Fog = `
uniform sampler2D colorTexture;
uniform sampler2D depthTexture;
uniform float visibility;
uniform vec4 fogColor;
varying vec2 v_textureCoordinates;
void main(void)
{
vec4 origcolor = texture2D(colorTexture, v_textureCoordinates);
float depth = czm_readDepth(depthTexture, v_textureCoordinates);
vec4 depthcolor = texture2D(depthTexture, v_textureCoordinates);
float f = visibility * (depthcolor.r - 0.3) / 0.2;
if (f < 0.0) f = 0.0;
else if (f > 1.0) f = 1.0;
gl_FragColor = mix(origcolor, fogColor, f);
}
`;
/*雨天*/
function rain(sdk, status = false) {
rainStages && sdk.viewer.scene.postProcessStages.remove(rainStages)
if (status) {
rainStages = new Cesium.PostProcessStage({
name: "rain",
fragmentShader: FS_Rain,
uniforms: {
tiltAngle: -0.4, // 倾斜角度
rainSize: 0.3, // 雨大小
rainWidth: 40, //雨长度
rainSpeed: 100, //雨速
},
});
sdk.viewer.scene.postProcessStages.add(rainStages);
}
}
// 雪
function snow(sdk, status = false) {
snowStages && sdk.viewer.scene.postProcessStages.remove(snowStages)
if (status) {
snowStages = new Cesium.PostProcessStage({
name: "snow",
fragmentShader: FS_Snow,
uniforms: {
snowSize: 2, // 大小
snowSpeed: 60, //速度
},
});
sdk.viewer.scene.postProcessStages.add(snowStages);
}
}
// 雾天
function fog(sdk, status = false) {
fogStages && sdk.viewer.scene.postProcessStages.remove(fogStages)
if (status) {
fogStages = new Cesium.PostProcessStage({
name: "fog",
fragmentShader: FS_Fog,
uniforms: {
visibility: 0.2, //
fogColor: Cesium.Color.WHITE,
},
});
sdk.viewer.scene.postProcessStages.add(fogStages);
}
}
// 夜视
function nightVision(sdk, status = false) {
nightVisionStages && sdk.viewer.scene.postProcessStages.remove(nightVisionStages)
if (status) {
nightVisionStages = Cesium.PostProcessStageLibrary.createNightVisionStage();
sdk.viewer.scene.postProcessStages.add(nightVisionStages);
}
}
// 星空
function skyStarry(sdk, status = false) {
sdk.viewer.scene.skyAtmosphere.show = !status
}
// 光照
function illumination(sdk, status = false) {
sdk.viewer.shadows = status
sdk.viewer._shadows = status
}
export { rain, snow, fog, nightVision, skyStarry, illumination }

825
src/Global/global.js Normal file
View File

@ -0,0 +1,825 @@
/**
* @name: global
* @author: Administrator
* @date: 2023-12-01 14:15
* @descriptionglobal
* @update: 2023-12-01 14:15
*/
/*获取当前视角*/
import MouseEvent from '../Event/index'
import Tools from "../Tools";
import { Proj } from "../Tools/proj";
import { getTheme, setTheme } from "../Obj/Element/theme";
import { setActiveViewer as setMultiViewportActiveViewer } from './MultiViewportMode'
import { setActiveViewer as setSplitActiveViewer, getSdk } from './SplitScreen'
import { updateCluster } from './cluster/cluster'
let coordinateSystem = 'EPSG:4326'
let _cartesian
let GroundCover = false
let bimPickObject = {}
let containerObject = {}
let rotateAroundObject = {}
function getCurrentView(sdk) {
let tools = new Tools()
let viewer = sdk.viewer
return JSON.parse(JSON.stringify({
// heading: viewer.camera.heading,
// pitch: viewer.camera.pitch,
// roll: viewer.camera.roll,
position: tools.cartesian3Towgs84(viewer.camera.position, viewer),
orientation: {
heading: Cesium.Math.toDegrees(viewer.camera.heading),
pitch: Cesium.Math.toDegrees(viewer.camera.pitch),
roll: Cesium.Math.toDegrees(viewer.camera.roll)
}
}))
}
/*设置默认视角*/
function setDefaultView(sdk, options) {
let viewer = sdk.viewer
if (options) {
viewer.CAMERA_DEFAULT_VIEW_RECTANGLE = {
destination: options.destination || {},
orientation: options.orientation || {}
}
}
else {
viewer.CAMERA_DEFAULT_VIEW_RECTANGLE = undefined
//设置cesium的默认视角
Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(
//西边的经度
89.5,
//南边的纬度
10.4,
//东边的经度
110.4,
//北边的维度
61.2
)
}
}
/*定位到指定视角*/
async function flyTo(sdk, options, duration = 3) {
let tools = new Tools(sdk)
let destination
let orientation = options.orientation
if (options.position) {
if (options.position.alt !== 0 && !options.position.alt) {
options.position.alt = await tools.getClampToHeight(options.position)
}
let h = 0
if (!orientation) {
h = 500
}
destination = Cesium.Cartesian3.fromDegrees(options.position.lng, options.position.lat, options.position.alt + h)
}
else {
let bbox = tools.cal_envelope(options.positions)
destination = new Cesium.Rectangle(
Cesium.Math.toRadians(bbox[3][0]),
Cesium.Math.toRadians(bbox[3][1]),
Cesium.Math.toRadians(bbox[1][0]),
Cesium.Math.toRadians(bbox[1][1])
)
}
closeRotateAround(sdk)
sdk.viewer.camera.flyTo({ destination, duration, orientation, complete: options.complete, })
}
/*相机锁定*/
function CameraController(sdk, status = true) {
if (!sdk || !sdk.viewer) {
return
}
let viewer = sdk.viewer
viewer.scene.screenSpaceCameraController.enableRotate = status;
viewer.scene.screenSpaceCameraController.enableTranslate = status;
viewer.scene.screenSpaceCameraController.enableZoom = status;
viewer.scene.screenSpaceCameraController.enableTilt = status;
viewer.scene.screenSpaceCameraController.enableLook = status;
}
/*控件显隐*/
function CesiumContainer(sdk, options) {
if (!sdk || !sdk.viewer) {
return
}
containerObject[sdk.viewer._element.className] || (containerObject[sdk.viewer._element.className] = {})
containerObject[sdk.viewer._element.className].event && containerObject[sdk.viewer._element.className].event.destroy()
let tools = new Tools()
let element = sdk.viewer._element
let proj = sdk.proj
for (let key in options) {
switch (key) {
case 'compass':
let compass = element.getElementsByClassName('compass')[0]
let navigation = element.getElementsByClassName('navigation-controls')[0]
if (options[key]) {
compass && (compass.style.display = 'block')
navigation && (navigation.style.display = 'flex')
}
else {
compass && (compass.style.display = 'none')
navigation && (navigation.style.display = 'none')
}
break;
case 'legend':
let distanceLegend = element.getElementsByClassName('distance-legend')[0]
if (options[key]) {
distanceLegend && (distanceLegend.parentNode.style.display = 'block')
}
else {
distanceLegend && (distanceLegend.parentNode.style.display = 'none')
}
break;
case 'info':
let infoElm = element.getElementsByClassName('cesium-info')[0]
if (options[key]) {
if (infoElm) {
update()
infoElm.style.display = 'block'
}
else {
infoElm = document.createElement('div');
infoElm.className = "cesium-info"
infoElm.style.position = 'absolute';
infoElm.style.bottom = '32px';
infoElm.style.right = '240px';
infoElm.style['font-size'] = '14px';
infoElm.style['background-color'] = 'rgba(47,53,60,.8)';
infoElm.style.color = '#fff';
infoElm.style.padding = '4px 10px';
infoElm.style['border-radius'] = '18px';
if (coordinateSystem === 'EPSG:4326') {
infoElm.innerHTML = `
<span>经度:</span><span>-</span>
<span>纬度:</span><span>-</span>
<span>海拔高度:</span><span>-</span>
`
}
else {
infoElm.innerHTML = `
<span>x</span><span>-</span>
<span>y</span><span>-</span>
<span>z</span><span>-</span>
`
}
sdk.viewer._element.appendChild(infoElm)
}
let event = new MouseEvent(sdk)
containerObject[sdk.viewer._element.className].event = event
event.mouse_move((movement, cartesian) => {
_cartesian = cartesian
update()
})
function update() {
if (!_cartesian) {
return
}
let position = tools.cartesian3Towgs84(_cartesian, sdk.viewer)
if (coordinateSystem === 'EPSG:4326') {
infoElm.innerHTML = `
<span>经度:</span><span>${Number(position.lng.toFixed(6))}° </span>
<span>纬度:</span><span>${Number(position.lat.toFixed(6))}° </span>
<span>海拔高度:</span><span>${Number(position.alt.toFixed(2))}米</span>
`
}
else {
let result = proj.convert([{ x: position.lng, y: position.lat, z: position.alt }], 'EPSG:4326', coordinateSystem)
infoElm.innerHTML = `
<span>x</span><span>${Number(result.points[0].x.toFixed(6))}</span>
<span style="margin-left: 5px;">y</span><span>${Number(result.points[0].y.toFixed(6))}</span>
<span style="margin-left: 5px;">z</span><span>${Number(result.points[0].z.toFixed(6))}</span>
`
}
}
}
else {
infoElm && (infoElm.style.display = 'none')
}
break;
case 'frame':
if (options[key]) {
sdk.viewer.scene.debugShowFramesPerSecond = true;
setTimeout(() => {
let cesiumWidgetContainerElm = sdk.viewer._element.getElementsByClassName('cesium-viewer-cesiumWidgetContainer')[0]
let defaultContainer = cesiumWidgetContainerElm.getElementsByClassName('cesium-performanceDisplay-defaultContainer')[0]
if (defaultContainer) {
cesiumWidgetContainerElm.appendChild(defaultContainer)
}
}, 50);
}
else {
sdk.viewer.scene.debugShowFramesPerSecond = false;
}
break;
}
}
// let compass = element.getElementsByClassName('compass')[0]
// let navigation = element.getElementsByClassName('navigation-controls')[0]
// let distanceLegend = element.getElementsByClassName('distance-legend')[0]
// if(status) {
// compass && (compass.style.display = 'block')
// navigation && (navigation.style.display = 'block')
// distanceLegend && (distanceLegend.style.display = 'block')
// }
// else {
// compass && (compass.style.display = 'none')
// navigation && (navigation.style.display = 'none')
// distanceLegend && (distanceLegend.style.display = 'none')
// viewer.cesiumNavigation.distanceLegendViewModel.destroy()
// }
}
/*设置广告牌默认图标*/
function setBillboardDefaultUrl(url, name) {
if (name) {
name = 'billboard_default_url_' + name
}
else {
name = 'billboard_default_url'
}
localStorage.setItem(name, url);
}
/*获取广告牌默认图标*/
function getBillboardDefaultUrl(name) {
if (name) {
name = 'billboard_default_url_' + name
}
else {
name = 'billboard_default_url'
}
return localStorage.getItem(name);
}
/*设置高度参考*/
function setGroundCover(sdk, status) {
GroundCover = status ? true : false
updateCluster(sdk.viewer)
}
/*获取高度参考*/
function getGroundCover() {
return GroundCover
}
function setBimPickStatus(sdk, status) {
if (!sdk || !sdk.viewer) {
return
}
bimPickObject[sdk.viewer._element.className] || (bimPickObject[sdk.viewer._element.className] = {})
bimPickObject[sdk.viewer._element.className].status = status
if (bimPickObject[sdk.viewer._element.className].MoveHandler) {
bimPickObject[sdk.viewer._element.className].MoveHandler.destroy()
}
if (!status) {
return
}
bimPickObject[sdk.viewer._element.className].MoveHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
bimPickObject[sdk.viewer._element.className].MoveHandler.setInputAction(function (movement) {
const pick = sdk.viewer.scene.pick(movement.endPosition);
let selectedId = bimPickObject[sdk.viewer._element.className].selectedId
let that = sdk.entityMap.get(bimPickObject[sdk.viewer._element.className].id)
// if (selectedFeatureId) {
// let color = '#fff'
// let state = selectedFeature.getProperty('state')
// switch (state) {
// case '0':
// color = '#fff'
// break;
// case '1':
// color = '#f00'
// break;
// case '2':
// color = '#0f0'
// break;
// case '3':
// color = '#00f'
// break;
// default:
// }
// selectedFeature.color = Cesium.Color.fromCssColorString(color).withAlpha(selectedFeature.tileset.transparency)
// }
if (that) {
if (that.features.has(selectedId)) {
let features = that.features.get(selectedId).features
for (let key in features) {
if (features[key].content._model) {
let color = features[key].customColor || Cesium.Color.fromCssColorString('#fff')
features[key].color = Cesium.Color.fromCssColorString(`rgba(${Cesium.Color.floatToByte(color.red)},${Cesium.Color.floatToByte(color.green)},${Cesium.Color.floatToByte(color.blue)},${color.alpha * ((features[key].customAlpha || features[key].customAlpha === 0) ? features[key].customAlpha : 1)})`)
}
}
}
}
if (pick && pick.content) {
let obj = sdk.getIncetance(pick.content.tileset.id)
if (obj.type === 'bim') {
if (pick.primitive && pick.primitive.id) {
let that = sdk.entityMap.get(pick.primitive.id)
selectedId = pick.getProperty('id')
if (that.features.has(selectedId)) {
let features = that.features.get(selectedId).features
for (let key in features) {
if (features[key].content._model) {
features[key].color = Cesium.Color.fromCssColorString('#ffeb3b')
}
}
}
bimPickObject[sdk.viewer._element.className].id = pick.primitive.id
bimPickObject[sdk.viewer._element.className].selectedId = selectedId
}
}
else {
pick.primitive.id = null
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
}
function getBimPickStatus(sdk) {
if (!sdk || !sdk.viewer) {
return
}
return bimPickObject[sdk.viewer._element.className] ? bimPickObject[sdk.viewer._element.className].status : false
}
/* 围绕坐标旋转 */
function rotateAround(sdk, position) {
if (!sdk || !sdk.viewer) {
return
}
setActiveViewer(0)
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
// 关闭Controller
sdk.entityMap.forEach((item) => {
item.editObj && item.editObj.destroy()
item.ControllerObject && item.ControllerObject.destroy()
})
rotateAroundObject[sdk.viewer._element.className] || (rotateAroundObject[sdk.viewer._element.className] = {})
rotateAroundObject[sdk.viewer._element.className].animate && TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
rotateAroundObject[sdk.viewer._element.className].event && rotateAroundObject[sdk.viewer._element.className].event.destroy()
if (!position) {
CameraController(sdk, true)
return
}
let point = Cesium.Cartesian3.fromDegrees(position.lng, position.lat, position.alt)
let angle = Cesium.Math.toDegrees(sdk.viewer.camera.heading)
let range = Cesium.Cartesian3.distance(sdk.viewer.camera.position, point);
CameraController(sdk, false)
let pitch = sdk.viewer.camera.pitch
let degrees = Cesium.Math.toDegrees(pitch)
if (degrees < -89.99) {
pitch = Cesium.Math.toRadians(-89.99)
}
rotateAroundObject[sdk.viewer._element.className].animate = new TWEEN.Tween({ angle: angle }).to({ angle: angle - 360 }, 30000).easing(TWEEN.Easing.Linear.None).repeat(Infinity).onUpdate(async (r, a) => {
if (!sdk.viewer) {
TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
return
}
sdk.viewer.camera.lookAt(
point,
new Cesium.HeadingPitchRange(Cesium.Math.toRadians(r.angle), pitch, range)
)
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
}).start()
let event = new MouseEvent(sdk)
rotateAroundObject[sdk.viewer._element.className].event = event
event.mouse_left_down(() => {
rotateAroundObject[sdk.viewer._element.className].animate && TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
rotateAroundObject[sdk.viewer._element.className].event && rotateAroundObject[sdk.viewer._element.className].event.destroy()
CameraController(sdk, true)
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
})
}
/* 关闭围绕坐标旋转 */
function closeRotateAround(sdk) {
if (!sdk || !sdk.viewer) {
return
}
if (rotateAroundObject[sdk.viewer._element.className]) {
rotateAroundObject[sdk.viewer._element.className].animate && TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
rotateAroundObject[sdk.viewer._element.className].event && rotateAroundObject[sdk.viewer._element.className].event.destroy()
CameraController(sdk, true)
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
}
}
function closeViewFollow(sdk) {
if (sdk && sdk.entityMap) {
let entityMap = sdk.entityMap
for (let [key, value] of entityMap) {
if (value.type === 'TrajectoryMotion' && value.viewFollow) {
value.viewFollow = false
}
}
}
}
/* 方里网状态开关 */
function FlwStatusSwitch(sdk, status) {
if(!sdk) {
return
}
let layer
let sdkD = getSdk().sdkD
if(sdkD && sdk !== sdkD) {
FlwStatusSwitch(sdkD, status)
}
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'flw') {
layer = sdk.viewer.imageryLayers._layers[i]
break
}
}
if (layer) {
sdk.viewer.imageryLayers.remove(layer)
}
if (status) {
sdk.viewer.imageryLayers.addImageryProvider(new Cesium.TileCoordinatesImageryProviderFlw(
{
tileWidth: 128,
tileHeight: 128,
}
));
}
}
function getFlwStatus(sdk) {
let status = false
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'flw') {
status = true
break
}
}
return status
}
/* 经纬网状态开关 */
function JwwStatusSwitch(sdk, status) {
if(!sdk) {
return
}
let layer
let sdkD = getSdk().sdkD
if(sdkD && sdk !== sdkD) {
JwwStatusSwitch(sdkD, status)
}
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'jww') {
layer = sdk.viewer.imageryLayers._layers[i]
break
}
}
if (layer) {
sdk.viewer.imageryLayers.remove(layer)
}
if (status) {
sdk.viewer.imageryLayers.addImageryProvider(new Cesium.TileCoordinatesImageryProviderJww());
}
}
function getJwwStatus(sdk) {
let status = false
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'jww') {
status = true
break
}
}
return status
}
function splitScreen2(sdk, status) {
let sliderElm = sdk.viewer._element.getElementsByClassName('YJ-custom-slider')[0]
let leftElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-left')[0]
let rightElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-right')[0]
if (sliderElm) {
sdk.viewer._element.removeChild(sliderElm)
sdk.viewer._element.removeChild(leftElm)
sdk.viewer._element.removeChild(rightElm)
}
if (status) {
sliderElm = document.createElement('div');
sliderElm.className = 'YJ-custom-slider'
sliderElm.style.position = 'absolute'
sliderElm.style.left = '50%'
sliderElm.style.top = '0px'
leftElm = document.createElement('input');
leftElm.className = 'YJ-custom-checkbox-left'
leftElm.type = 'checkbox'
leftElm.style.position = 'absolute'
leftElm.style.left = 'calc(50% - 50px)'
rightElm = document.createElement('input');
rightElm.className = 'YJ-custom-checkbox-right'
rightElm.type = 'checkbox'
rightElm.style.position = 'absolute'
rightElm.style.right = 'calc(50% - 50px)'
sdk.viewer._element.appendChild(leftElm)
sdk.viewer._element.appendChild(rightElm)
leftElm.checked = true
leftElm.addEventListener('change', (e) => {
if (!e.target.checked) {
if (!rightElm.checked) {
rightElm.checked = true
}
}
changeEntitySplitStatus()
})
rightElm.addEventListener('change', (e) => {
if (!e.target.checked) {
if (!leftElm.checked) {
leftElm.checked = true
}
}
changeEntitySplitStatus()
})
sliderElm.addEventListener('mousedown', () => {
document.body.addEventListener('mousemove', mousemove)
sliderElm.addEventListener('mouseup', () => {
document.body.removeEventListener('mousemove', mousemove)
})
})
function mousemove(a, b) {
if (sdk.viewer._element.getElementsByTagName('canvas')[0] === a.target) {
sliderElm.style.left = (a.offsetX / sdk.viewer._element.scrollWidth * 100) + '%'
sdk.viewer.scene.splitPosition = a.offsetX / sdk.viewer._element.scrollWidth
}
}
sdk.viewer._element.appendChild(sliderElm)
sdk.viewer.scene.splitStatus = status
sdk.viewer.scene.splitPosition = 0.5
changeEntitySplitStatus()
}
else {
sdk.viewer.scene.splitPosition = 0
changeEntitySplitStatus(0)
sdk.viewer.scene.splitStatus = status
}
function changeEntitySplitStatus(v) {
let value
if (v === undefined || v === null) {
if (leftElm.checked && rightElm.checked) {
value = 0
}
else {
if (leftElm.checked) {
value = -1
}
if (rightElm.checked) {
value = 1
}
}
}
else {
value = v
}
sdk.entityMap.forEach((item, key) => {
if (sdk.viewer.scene.splitStatus) {
if (item.entity.billboard) {
item.entity.billboard.splitDirection = value
}
else {
item.entity && (item.entity.splitDirection = value)
}
}
console.log()
})
}
}
function splitScreen(sdk, status) {
let sliderElm = sdk.viewer._element.getElementsByClassName('YJ-custom-slider')[0]
let leftElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-left')[0]
let rightElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-right')[0]
if (sliderElm) {
sdk.viewer._element.removeChild(sliderElm)
sdk.viewer._element.removeChild(leftElm)
sdk.viewer._element.removeChild(rightElm)
}
if (status) {
sliderElm = document.createElement('div');
sliderElm.className = 'YJ-custom-slider'
sliderElm.style.position = 'absolute'
sliderElm.style.left = '50%'
sliderElm.style.top = '0px'
leftElm = document.createElement('input');
leftElm.className = 'YJ-custom-checkbox-left'
leftElm.type = 'checkbox'
leftElm.style.position = 'absolute'
leftElm.style.left = 'calc(50% - 50px)'
rightElm = document.createElement('input');
rightElm.className = 'YJ-custom-checkbox-right'
rightElm.type = 'checkbox'
rightElm.style.position = 'absolute'
rightElm.style.right = 'calc(50% - 50px)'
sdk.viewer._element.appendChild(leftElm)
sdk.viewer._element.appendChild(rightElm)
leftElm.checked = true
leftElm.addEventListener('change', (e) => {
if (!e.target.checked) {
if (!rightElm.checked) {
rightElm.checked = true
}
}
changeEntitySplitStatus()
})
rightElm.addEventListener('change', (e) => {
if (!e.target.checked) {
if (!leftElm.checked) {
leftElm.checked = true
}
}
changeEntitySplitStatus()
})
sliderElm.addEventListener('mousedown', () => {
document.body.addEventListener('mousemove', mousemove)
sliderElm.addEventListener('mouseup', () => {
document.body.removeEventListener('mousemove', mousemove)
})
})
function mousemove(a, b) {
if (sdk.viewer._element.getElementsByTagName('canvas')[0] === a.target) {
sliderElm.style.left = (a.offsetX / sdk.viewer._element.scrollWidth * 100) + '%'
sdk.viewer.scene.splitPosition = a.offsetX / sdk.viewer._element.scrollWidth
}
}
sdk.viewer._element.appendChild(sliderElm)
sdk.viewer.scene.splitStatus = status
sdk.viewer.scene.splitPosition = 0.5
changeEntitySplitStatus()
}
else {
sdk.viewer.scene.splitPosition = 0
changeEntitySplitStatus(0)
sdk.viewer.scene.splitStatus = status
}
function changeEntitySplitStatus(v) {
let value
if (v === undefined || v === null) {
if (leftElm.checked && rightElm.checked) {
value = 0
}
else {
if (leftElm.checked) {
value = -1
}
if (rightElm.checked) {
value = 1
}
}
}
else {
value = v
}
sdk.entityMap.forEach((item, key) => {
if (sdk.viewer.scene.splitStatus) {
if (item.entity.billboard) {
item.entity.billboard.splitDirection = value
}
else {
item.entity && (item.entity.splitDirection = value)
}
}
console.log()
})
}
}
function getCoordinateSystem() {
return coordinateSystem
}
function setCoordinateSystem(sdk, epsg) {
coordinateSystem = epsg || 'EPSG:4326'
if (!sdk || !sdk.viewer || !sdk.viewer._element) {
return
}
let infoElm = sdk.viewer._element.getElementsByClassName('cesium-info')[0]
if (!_cartesian || !infoElm) {
return
}
let tools = new Tools()
let proj = sdk.proj
let position = tools.cartesian3Towgs84(_cartesian, sdk.viewer)
if (coordinateSystem === 'EPSG:4326') {
infoElm.innerHTML = `
<span>经度:</span><span>${Number(position.lng.toFixed(6))}° </span>
<span>纬度:</span><span>${Number(position.lat.toFixed(6))}° </span>
<span>海拔高度:</span><span>${Number(position.alt.toFixed(2))}米</span>
`
}
else {
let result = proj.convert([{ x: position.lng, y: position.lat, z: position.alt }], 'EPSG:4326', coordinateSystem)
infoElm.innerHTML = `
<span>x</span><span>${Number(result.points[0].x.toFixed(6))}</span>
<span style="margin-left: 5px;">y</span><span>${Number(result.points[0].y.toFixed(6))}</span>
<span style="margin-left: 5px;">z</span><span>${Number(result.points[0].z.toFixed(6))}</span>
`
}
}
function cameraChanged(sdk, cb) {
let tools = new Tools()
//设置相机变化的监听事件
let removeChanged = sdk.viewer.camera.changed.addEventListener(percentage => {
cb({
position: tools.cartesian3Towgs84(sdk.viewer.camera.position, sdk.viewer),
orientation: {
heading: sdk.viewer.camera.heading,
pitch: sdk.viewer.camera.pitch,
roll: sdk.viewer.camera.roll
}
})
})
return removeChanged
}
function setMaximumRequestsPerServer(v) {
if (typeof v == 'number')
Cesium.RequestScheduler.maximumRequestsPerServer = v
}
/* 键盘事件 */
function setKeyboardEventActive(sdk, status) {
if (!sdk) {
return
}
if (status) {
sdk.viewer._disableKeyboardEvent = false
}
else {
sdk.viewer._disableKeyboardEvent = true
}
}
function getCesiumIndexedDBMaxSize() {
const baseUnit = 1024 * 1024 * 1024
let size = Number(Number(localStorage.getItem('IndexedDBMaxSize')).toFixed(0))
if (isNaN(size) || size < baseUnit) {
size = baseUnit
}
return size
}
function setCesiumIndexedDBMaxSize(v) {
const baseUnit = 1024 * 1024 * 1024
let maxSize = Number(Number(v).toFixed(0))
if (isNaN(maxSize) || maxSize < baseUnit) {
maxSize = baseUnit
}
Cesium.ManageIndexedDB && Cesium.ManageIndexedDB.SetIndexedDBMaxSize(maxSize)
localStorage.setItem('IndexedDBMaxSize', maxSize)
}
function getCesiumManageIndexexDBState() {
let state = localStorage.getItem('ManageIndexexDBState')
if (state === 'false') {
return false
}
return Boolean(state)
}
function setCesiumManageIndexexDBState(v) {
if (typeof v === "boolean") {
Cesium.ManageIndexedDB && Cesium.ManageIndexedDB.SetManageIndexexDBState(v)
localStorage.setItem('ManageIndexexDBState', v)
} else {
console.error("参数必须为boolean")
}
}
function getCesiumIndexedDBCurrentSize() {
return Cesium.ManageIndexedDB && Cesium.ManageIndexedDB.GetIndexedDBCurrentSize()
}
function setActiveViewer(v) {
setMultiViewportActiveViewer(v)
setSplitActiveViewer(v)
}
// 设置地球透明度
function enablePerspective(sdk, alpha = 1) {
if (!alpha && alpha != 0) {
alpha = 1
}
sdk.viewer.scene.globe.translucency.frontFaceAlpha = alpha
}
export { getCurrentView, setDefaultView, flyTo, CameraController, CesiumContainer, setBillboardDefaultUrl, getBillboardDefaultUrl, setGroundCover, getGroundCover, getBimPickStatus, setBimPickStatus, rotateAround, closeRotateAround, closeViewFollow, FlwStatusSwitch, JwwStatusSwitch, getFlwStatus, getJwwStatus, getCoordinateSystem, setCoordinateSystem, cameraChanged, setMaximumRequestsPerServer, setKeyboardEventActive, getTheme, setTheme, getCesiumIndexedDBMaxSize, setCesiumIndexedDBMaxSize, getCesiumManageIndexexDBState, setCesiumManageIndexexDBState, getCesiumIndexedDBCurrentSize, setActiveViewer, enablePerspective }

View File

@ -0,0 +1,218 @@
/* 右键点击菜单 */
import MouseEvent from '../../Event/index'
import Tools from '../../Tools'
import { rotateAround } from '../../Global/global'
import { getSdk } from '../SplitScreen'
let eventListener = {}
function MouseRightMenu(sdk, status, callBack) {
if (!sdk || !sdk.div_id) {
return
}
let sdkD = getSdk().sdkD
let _element = document.getElementById(sdk.div_id).getElementsByClassName('cesium-viewer')[0]
let tools = new Tools()
if (!eventListener[sdk.div_id]) {
eventListener[sdk.div_id] = {}
}
if (eventListener[sdk.div_id].mousedown) {
document.removeEventListener(
'mousedown',
eventListener[sdk.div_id].mousedown
)
}
if (eventListener[sdk.div_id].click) {
document.removeEventListener('click', eventListener[sdk.div_id].click)
}
if(!eventListener[sdk.div_id].callBack) {
eventListener[sdk.div_id].callBack = callBack
}
if(sdk !== sdkD) {
eventListener[sdk.div_id].mouseRightMenuEvent &&
eventListener[sdk.div_id].mouseRightMenuEvent.destroy()
}
let menuElm = document.getElementById('custom-menu')
if (menuElm) {
_element.removeChild(menuElm)
}
eventListener[sdk.div_id].status = status
if (status) {
eventListener[sdk.div_id].mousedown = e => {
if (
(e.target.parentNode && e.target.parentNode.id == 'custom-menu') ||
(e.target.parentNode &&
e.target.parentNode.parentNode &&
e.target.parentNode.parentNode.id == 'custom-menu')
) {
return
}
let menuElm = document.getElementById('custom-menu')
if (menuElm) {
_element.removeChild(menuElm)
}
}
document.addEventListener('mousedown', eventListener[sdk.div_id].mousedown)
eventListener[sdk.div_id].click = e => {
if (
(e.target.parentNode && e.target.parentNode.id == 'custom-menu') ||
(e.target.parentNode &&
e.target.parentNode.parentNode &&
e.target.parentNode.parentNode.id == 'custom-menu')
) {
return
}
let menuElm = document.getElementById('custom-menu')
if (menuElm) {
_element.removeChild(menuElm)
}
}
document.addEventListener('click', eventListener[sdk.div_id].click)
eventListener[sdk.div_id].mouseRightMenuEvent = new MouseEvent(sdk)
eventListener[sdk.div_id].mouseRightMenuEvent.mouse_right(
(movement, cartesian) => {
if (YJ.Measure.GetMeasureStatus() || sdk.viewer.trackedEntity) {
return
}
let entity = sdk.viewer.entities.getById('svg-control-points_0')
if (entity && entity.show) {
return
}
let menuElm = document.getElementById('custom-menu')
if (menuElm) {
_element.removeChild(menuElm)
}
let entityId = getEntityId(movement)
let targetId
if(Object.prototype.toString.call(entityId) === '[object Object]') {
targetId = entityId.id
entityId = entityId.parentId
}
let addedMenu = ''
let that = sdk.entityMap.get(entityId)
if (!that && entityId) {
let array = entityId.split('-')
array.splice(array.length - 1, 1)
entityId = array.join('-')
that = sdk.entityMap.get(entityId)
}
if (that && that.picking) {
addedMenu = `
<span class="divider" style="display: block;border-top: 1px solid #ddd;margin: 5px;"></span>
<ul class="added" style="list-style: none;padding: 0;margin: 0;font-size: 12px;">
<li style="padding: 3px 10px;cursor: pointer;">属性</li>
</ul>
`
}
let position = tools.cartesian3Towgs84(cartesian, sdk.viewer)
menuElm = document.createElement('div')
menuElm.id = 'custom-menu'
menuElm.style.position = 'absolute'
menuElm.style.width = '110px'
menuElm.style.backgroundColor = '#00000085'
menuElm.style.color = '#ffffff'
menuElm.style.padding = '6px 0'
menuElm.style.boxShadow = '4px 4px 4px 0px rgba(0, 0, 0, 0.8)'
menuElm.innerHTML = `
<ul class="base" style="list-style: none;padding: 0;margin: 0;font-size: 12px;">
<li style="padding: 3px 10px;cursor: pointer;">绕鼠标点旋转</li>
</ul>
${addedMenu}
`
_element.appendChild(menuElm)
let left = movement.position.x
let top = movement.position.y
if (
movement.position.x + menuElm.offsetWidth >
_element.offsetWidth
) {
left = movement.position.x - menuElm.offsetWidth
}
if (
movement.position.y + menuElm.offsetHeight >
_element.offsetHeight
) {
top = movement.position.y - menuElm.offsetHeight
}
menuElm.style.left = left + 'px'
menuElm.style.top = top + 'px'
menuElm.addEventListener('contextmenu', function(event) {
event.preventDefault()
})
let liElms = menuElm.getElementsByTagName('li')
let object = {}
for (let i = 0; i < liElms.length; i++) {
liElms[i].addEventListener('mouseover', () => {
liElms[i].style.backgroundColor = '#5e5e5e'
})
liElms[i].addEventListener('mouseout', () => {
liElms[i].style.backgroundColor = 'unset'
})
liElms[i].addEventListener('click', () => {
let key = ''
switch (liElms[i].innerHTML) {
case '绕鼠标点旋转':
object.position = position
key = 'rotateAround'
// this.rotateAround(position)
break
case '属性':
if(targetId) {
object.id = targetId
object.parentId = that.options.id
}
else {
object.id = that.options.id
}
key = 'attribute'
// that.edit(true)
// this.attribute(entityId)
break
}
eventListener[sdk.div_id].callBack(key, object)
_element.removeChild(menuElm)
})
}
}
)
}
function getEntityId(movement) {
let pick = sdk.viewer.scene.pick(movement.position)
if (pick) {
if (pick.id) {
if (pick.id.type && pick.id.type === 'vector' && pick.id.parentId) {
return {
parentId: pick.id.parentId,
id: pick.id.id
}
}
else if (pick.id.id) {
return pick.id.id
} else if (typeof pick.id == 'string') {
return pick.id
}
} else {
if (pick.primitive && pick.primitive.id) {
return pick.primitive.id
}
}
}
}
}
function getMouseRightMenuStatus(sdk) {
if (!sdk || !sdk.div_id || !eventListener[sdk.div_id]) {
return
}
else {
return eventListener[sdk.div_id].status
}
}
export { MouseRightMenu, getMouseRightMenuStatus }

View File

@ -0,0 +1,156 @@
/* 右键点击菜单 */
import MouseEvent from '../../Event/index'
import Tools from '../../Tools';
import { rotateAround } from '../../Global/global'
class mouseRightMenu {
constructor(sdk, cd) {
this.sdk = sdk
this.callBack = cd
this.mouseRightMenuEvent
this.tools = new Tools()
document.addEventListener('mousedown', (e)=>{
if((e.target.parentNode && e.target.parentNode.id == "custom-menu") || (e.target.parentNode && e.target.parentNode.parentNode && e.target.parentNode.parentNode.id == "custom-menu")) {
return
}
let menuElm = document.getElementById('custom-menu')
if (menuElm) {
this.sdk.viewer._element.removeChild(menuElm)
}
})
document.addEventListener('click', (e)=>{
if((e.target.parentNode && e.target.parentNode.id == "custom-menu") || (e.target.parentNode && e.target.parentNode.parentNode && e.target.parentNode.parentNode.id == "custom-menu")) {
return
}
let menuElm = document.getElementById('custom-menu')
if (menuElm) {
this.sdk.viewer._element.removeChild(menuElm)
}
})
}
open() {
this.mouseRightMenuEvent && this.mouseRightMenuEvent.destroy()
this.mouseRightMenuEvent = new MouseEvent(this.sdk)
this.mouseRightMenuEvent.mouse_right((movement, cartesian) => {
if (YJ.Measure.GetMeasureStatus()) {
return
}
let menuElm = document.getElementById('custom-menu')
if (menuElm) {
this.sdk.viewer._element.removeChild(menuElm)
}
let entityId = this.getEntityId(movement)
let addedMenu = ''
let that = this.sdk.entityMap.get(entityId)
if(!that && entityId) {
let array = entityId.split("-");
array.splice(array.length - 1, 1)
entityId = array.join('-')
that = this.sdk.entityMap.get(entityId)
}
if (that && that.picking) {
addedMenu = `
<span class="divider" style="display: block;border-top: 1px solid #ddd;margin: 5px;"></span>
<ul class="added" style="list-style: none;padding: 0;margin: 0;font-size: 12px;">
<li style="padding: 3px 10px;cursor: pointer;">属性</li>
</ul>
`
}
let position = this.tools.cartesian3Towgs84(cartesian, this.sdk.viewer)
menuElm = document.createElement('div');
menuElm.id = 'custom-menu'
menuElm.style.position = 'absolute'
menuElm.style.width = '110px'
menuElm.style.backgroundColor = '#00000085'
menuElm.style.color = '#ffffff'
menuElm.style.padding = '6px 0'
menuElm.style.boxShadow = '4px 4px 4px 0px rgba(0, 0, 0, 0.8)'
menuElm.innerHTML = `
<ul class="base" style="list-style: none;padding: 0;margin: 0;font-size: 12px;">
<li style="padding: 3px 10px;cursor: pointer;">绕鼠标点旋转</li>
</ul>
${addedMenu}
`
this.sdk.viewer._element.appendChild(menuElm)
let left = movement.position.x
let top = movement.position.y
if ((movement.position.x + menuElm.offsetWidth) > this.sdk.viewer._element.offsetWidth) {
left = movement.position.x - menuElm.offsetWidth
}
if ((movement.position.y + menuElm.offsetHeight) > this.sdk.viewer._element.offsetHeight) {
top = movement.position.y - menuElm.offsetHeight
}
menuElm.style.left = left + 'px'
menuElm.style.top = top + 'px'
menuElm.addEventListener('contextmenu', function (event) {
event.preventDefault();
})
let liElms = menuElm.getElementsByTagName('li')
let object = {}
for (let i = 0; i < liElms.length; i++) {
liElms[i].addEventListener('mouseover', () => {
liElms[i].style.backgroundColor = '#5e5e5e'
})
liElms[i].addEventListener('mouseout', () => {
liElms[i].style.backgroundColor = 'unset'
})
liElms[i].addEventListener('click', () => {
switch (liElms[i].innerHTML) {
case '绕中心点旋转':
object.position = position
// this.rotateAround(position)
break
case '属性':
object.id = that.options.id
// that.edit(true)
// this.attribute(entityId)
break
}
this.callBack(liElms[i].innerHTML, object)
this.sdk.viewer._element.removeChild(menuElm)
})
}
})
}
getEntityId(movement) {
let pick = this.sdk.viewer.scene.pick(movement.position)
if (pick) {
if (pick.id) {
if (pick.id.id) {
return pick.id.id
}
else if (typeof pick.id == 'string') {
return pick.id
}
}
else {
if (pick.primitive && pick.primitive.id) {
return pick.primitive.id
}
}
}
}
rotateAround(position) {
rotateAround(this.sdk, position)
}
attribute(entityId) {
if(entityId.endsWith('-label')) {
entityId = entityId.replace('-label', '')
}
let that = this.sdk.entityMap.get(entityId)
that && that.edit(true)
}
close() {
this.mouseRightMenuEvent && this.mouseRightMenuEvent.destroy()
}
}
export default mouseRightMenu