Compare commits

...

4 Commits

Author SHA1 Message Date
zh
de4aead219 解决通视分析未加载地形时会报错的问题 2025-08-19 10:58:07 +08:00
zh
ef2c158727 解决颜色输入框输入无效果的问题 2025-08-19 10:57:41 +08:00
zh
9ecb3c7269 限制文字长度 2025-08-19 10:56:10 +08:00
zh
1936a142b1 解决scale太小时flyto高度问题 2025-08-19 10:56:01 +08:00
5 changed files with 163 additions and 9 deletions

View File

@ -63,11 +63,15 @@ class VisibilityAnalysis extends Tools {
that.tip.set_text("左键创建视角终点,右键结束通视分析") that.tip.set_text("左键创建视角终点,右键结束通视分析")
if (!that.resultObject.viewPoint) { if (!that.resultObject.viewPoint) {
let pos84 = that.cartesian3Towgs84(cartesian, that.viewer) let pos84 = that.cartesian3Towgs84(cartesian, that.viewer)
let positions = await Cesium.sampleTerrainMostDetailed( let positions
that.sdk.viewer.terrainProvider, if(that.sdk.viewer.terrainProvider.availability)
[Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat)] {
); positions = await Cesium.sampleTerrainMostDetailed(
if (positions[0].height > pos84.alt) { that.sdk.viewer.terrainProvider,
[Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat)]
);
}
if (positions && positions[0].height > pos84.alt) {
pos84.alt = positions[0].height pos84.alt = positions[0].height
} }
pos84.alt = pos84.alt + that.viewPointHeight pos84.alt = pos84.alt + that.viewPointHeight

View File

@ -54,7 +54,7 @@ function html(that) {
<div class="row"> <div class="row">
<div class="col" style="flex: 5;"> <div class="col" style="flex: 5;">
<span class="label">文字内容</span> <span class="label">文字内容</span>
<input class="input" type="text" @model="textValue"> <input class="input" type="text" @model="textValue" maxlength="30">
</div> </div>
<div class="col"> <div class="col">
<button class="btn" @click="textPosPick">设置位置</span> <button class="btn" @click="textPosPick">设置位置</span>

View File

@ -10,6 +10,7 @@ import { FontLoader } from '../../../../static/3rdparty/three/jsm/loaders/FontLo
import { TextGeometry } from '../../../../static/3rdparty/three/jsm/geometries/TextGeometry.js'; import { TextGeometry } from '../../../../static/3rdparty/three/jsm/geometries/TextGeometry.js';
import * as variable from '../../../../static/3rdparty/three/fonts/FZZongYi-M05S_regular.typeface.json' import * as variable from '../../../../static/3rdparty/three/fonts/FZZongYi-M05S_regular.typeface.json'
import Base from "../index"; import Base from "../index";
import { setActiveViewer, closeRotateAround, closeViewFollow } from '../../../Global/global'
import { setSplitDirection, syncSplitData, setActiveId } from '../../../Global/SplitScreen' import { setSplitDirection, syncSplitData, setActiveId } from '../../../Global/SplitScreen'
class GroundSvg extends Base { class GroundSvg extends Base {
@ -2171,6 +2172,59 @@ class GroundSvg extends Base {
} }
this._update() this._update()
} }
async flyTo(options = {}) {
if (this._error) {
return
}
setActiveViewer(0)
closeRotateAround(this.sdk)
closeViewFollow(this.sdk)
if (this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation) {
let orientation = {
heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),
pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),
roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)
}
let lng = this.options.customView.relativePosition.lng
let lat = this.options.customView.relativePosition.lat
let alt = this.options.customView.relativePosition.alt
let destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt)
let position = { ...this.options.position }
// 如果没有高度值,则获取紧贴高度计算
if (!position.hasOwnProperty('alt')) {
position.alt = await this.getClampToHeight(position)
}
lng = this.options.customView.relativePosition.lng + position.lng
lat = this.options.customView.relativePosition.lat + position.lat
alt = this.options.customView.relativePosition.alt + position.alt
destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt)
this.sdk.viewer.camera.flyTo({
destination: destination,
orientation: orientation
})
}
else {
let array = []
for (let i = 0; i < this.controlPoints.length; i++) {
let height = await this.getClampToHeight({lng: this.controlPoints[i][0], lat: this.controlPoints[i][1]})
let cartesian = Cesium.Cartesian3.fromDegrees(this.controlPoints[i][0], this.controlPoints[i][1], height)
array.push(cartesian.x, cartesian.y, cartesian.z)
}
let BoundingSphere = Cesium.BoundingSphere.fromVertices(array)
this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {
offset: options.orientation || {
heading: Cesium.Math.toRadians(0.0),
pitch: Cesium.Math.toRadians(-60.0),
roll: Cesium.Math.toRadians(0.0)
}
})
}
}
} }
export default GroundSvg export default GroundSvg

View File

@ -160,6 +160,64 @@ class YJColorPicker {
let dropbtns = picker.getElementsByClassName('ew-color-dropbtns')[0] let dropbtns = picker.getElementsByClassName('ew-color-dropbtns')[0]
picker.insertBefore(colorInputBox, dropbtns) picker.insertBefore(colorInputBox, dropbtns)
RInput.addEventListener('blur', (e) => {
let value = e.target.value
if (e.target.value || (e.target.dataset.null !== 'undefined' && e.target.dataset.null !== '' && !Boolean(e.target.dataset.null))) {
value = Number(value)
if ((e.target.max) && value > Number(e.target.max)) {
value = Number(e.target.max)
}
if ((e.target.min) && value < Number(e.target.min)) {
value = Number(e.target.min)
}
if ((e.target.dataset.min) && value < Number(e.target.dataset.min)) {
value = Number(e.target.dataset.min)
}
RInput.value = parseInt(value)
_this.colorPicker.hsba = colorRgbaToHsba(`rgb(${RInput.value}, ${GInput.value}, ${BInput.value})`)
_this.colorPicker.changeColor(_this.colorPicker, _this.colorPicker.pickerPanel.offsetWidth,_this.colorPicker.pickerPanel.offsetHeight)
}
})
GInput.addEventListener('blur', (e) => {
let value = e.target.value
if (e.target.value || (e.target.dataset.null !== 'undefined' && e.target.dataset.null !== '' && !Boolean(e.target.dataset.null))) {
value = Number(value)
if ((e.target.max) && value > Number(e.target.max)) {
value = Number(e.target.max)
}
if ((e.target.min) && value < Number(e.target.min)) {
value = Number(e.target.min)
}
if ((e.target.dataset.min) && value < Number(e.target.dataset.min)) {
value = Number(e.target.dataset.min)
}
GInput.value = parseInt(value)
_this.colorPicker.hsba = colorRgbaToHsba(`rgb(${RInput.value}, ${GInput.value}, ${BInput.value})`)
_this.colorPicker.changeColor(_this.colorPicker, _this.colorPicker.pickerPanel.offsetWidth,_this.colorPicker.pickerPanel.offsetHeight)
}
})
BInput.addEventListener('blur', (e) => {
let value = e.target.value
if (e.target.value || (e.target.dataset.null !== 'undefined' && e.target.dataset.null !== '' && !Boolean(e.target.dataset.null))) {
value = Number(value)
if ((e.target.max) && value > Number(e.target.max)) {
value = Number(e.target.max)
}
if ((e.target.min) && value < Number(e.target.min)) {
value = Number(e.target.min)
}
if ((e.target.dataset.min) && value < Number(e.target.dataset.min)) {
value = Number(e.target.dataset.min)
}
BInput.value = parseInt(value)
_this.colorPicker.hsba = colorRgbaToHsba(`rgb(${RInput.value}, ${GInput.value}, ${BInput.value})`)
_this.colorPicker.changeColor(_this.colorPicker, _this.colorPicker.pickerPanel.offsetWidth,_this.colorPicker.pickerPanel.offsetHeight)
}
})
if (options.alpha) { if (options.alpha) {
Inputs[0].style.width = '52px' Inputs[0].style.width = '52px'
Inputs[1].style.width = '52px' Inputs[1].style.width = '52px'
@ -170,7 +228,6 @@ class YJColorPicker {
<input class="input" type="number" title="" step="0.01" min="0" max="1"> <input class="input" type="number" title="" step="0.01" min="0" max="1">
<span class="arrow"></span>` <span class="arrow"></span>`
pickerInput.parentNode.insertBefore(pickAlpha, pickerInput.nextSibling) pickerInput.parentNode.insertBefore(pickAlpha, pickerInput.nextSibling)
pickerInput.style.width = '106px'
pickAlpha.style.width = '66px' pickAlpha.style.width = '66px'
pickAlpha.style.margin = '0 6px 0 0' pickAlpha.style.margin = '0 6px 0 0'
AInput = pickAlpha.getElementsByClassName('input')[0] AInput = pickAlpha.getElementsByClassName('input')[0]
@ -202,7 +259,7 @@ class YJColorPicker {
AInput.value = parseInt(_this.pickAlphaInputValue * 100) / 100 AInput.value = parseInt(_this.pickAlphaInputValue * 100) / 100
} }
else { else {
AInput.value = CesiumColor ? parseInt(CesiumColor.alpha * 100) / 100 : 1 AInput.value = CesiumColor ? parseInt(Number(CesiumColor.alpha.toFixed(2)) * 100) / 100 : 1
} }
_this.pickAlphaInputValue = AInput.value _this.pickAlphaInputValue = AInput.value
box.style.background = Cesium.Color.fromCssColorString(_this.colorPicker.config.defaultColor || '#ffffff').withAlpha(AInput.value).toCssColorString() box.style.background = Cesium.Color.fromCssColorString(_this.colorPicker.config.defaultColor || '#ffffff').withAlpha(AInput.value).toCssColorString()
@ -374,7 +431,7 @@ class YJColorPicker {
function clickDefineColor(color) { function clickDefineColor(color) {
if (AInput) { if (AInput) {
let c = Cesium.Color.fromCssColorString(color) let c = Cesium.Color.fromCssColorString(color)
AInput.value = parseInt(c.alpha * 100) / 100 AInput.value = parseInt(Number(c.alpha.toFixed(2)) * 100) / 100
} }
} }
@ -459,6 +516,44 @@ class YJColorPicker {
} }
} }
function colorRgbaToHsba(e) {
var t = e.slice(e.indexOf("(") + 1, e.lastIndexOf(")")).split(",")
, r = t.length < 4 ? 1 : Number(t[3])
, n = Number(t[0]) / 255
, o = Number(t[1]) / 255
, i = Number(t[2]) / 255
, a = void 0
, s = void 0
, l = void 0
, c = Math.min(n, o, i)
, d = l = Math.max(n, o, i)
, u = d - c;
if (d === c)
a = 0;
else {
switch (d) {
case n:
a = (o - i) / u + (o < i ? 6 : 0);
break;
case o:
a = 2 + (i - n) / u;
break;
case i:
a = 4 + (n - o) / u
}
a = Math.round(60 * a)
}
s = 0 === d ? 0 : 1 - c / d;
return s = Math.round(100 * s),
l = Math.round(100 * l),
{
h: a,
s: s,
b: l,
a: r
}
}
function pickerInputChange(v) { function pickerInputChange(v) {
if (_this.colorPicker && _this.colorPicker.pickerInput) { if (_this.colorPicker && _this.colorPicker.pickerInput) {
let rgbaColor = colorHexToRgba(v || _this.colorPicker.pickerInput.value) let rgbaColor = colorHexToRgba(v || _this.colorPicker.pickerInput.value)

View File

@ -810,6 +810,7 @@
else else
this.init(o, this.config) this.init(o, this.config)
} }
this.changeColor = g
this.close = () => { this.close = () => {
this.pickerFlag = !this.pickerFlag, this.pickerFlag = !this.pickerFlag,
this.picker.style.opacity = 0 this.picker.style.opacity = 0