Merge branch 'project' of http://xny.yj-3d.com:3000/zh/sdk4.0 into project
This commit is contained in:
@ -1,45 +1,89 @@
|
|||||||
class eventBinding {
|
class EventBinding {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.element = {}
|
this.element = {}
|
||||||
}
|
}
|
||||||
static event = {}
|
static event = {}
|
||||||
|
|
||||||
getEvent(name) {
|
getEvent(name) {
|
||||||
return eventBinding.event[name]
|
return EventBinding.event[name]
|
||||||
}
|
}
|
||||||
|
|
||||||
getEventAll() {
|
getEventAll() {
|
||||||
return eventBinding.event
|
return EventBinding.event
|
||||||
}
|
}
|
||||||
|
|
||||||
setEvent(name, event) {
|
setEvent(name, event) {
|
||||||
eventBinding.event[name] = event
|
EventBinding.event[name] = event
|
||||||
}
|
}
|
||||||
|
|
||||||
on(that, elements) {
|
on(that, elements) {
|
||||||
|
this.element = {}
|
||||||
for (let i = 0; i < elements.length; i++) {
|
for (let i = 0; i < elements.length; i++) {
|
||||||
let Event = []
|
|
||||||
let isEvent = false
|
|
||||||
let removeName = []
|
|
||||||
if (!elements[i] || !elements[i].attributes) {
|
if (!elements[i] || !elements[i].attributes) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
let Event = {
|
||||||
|
'input': [],
|
||||||
|
'change': [],
|
||||||
|
'blur': [],
|
||||||
|
'click': []
|
||||||
|
}
|
||||||
|
let isEvent = false
|
||||||
|
let removeName = []
|
||||||
for (let m of elements[i].attributes) {
|
for (let m of elements[i].attributes) {
|
||||||
switch (m.name) {
|
switch (m.name) {
|
||||||
case '@model': {
|
case '@model': {
|
||||||
isEvent = true
|
isEvent = true
|
||||||
if (elements[i].type == 'checkbox') {
|
if (elements[i].type == 'checkbox') {
|
||||||
Event.push((e) => { that[m.value] = e.target.checked })
|
Event.change.push((e) => { that[m.value] = e.target.checked })
|
||||||
elements[i].checked = that[m.value]
|
elements[i].checked = that[m.value]
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Event.push((e) => {
|
if (elements[i].type == 'number') {
|
||||||
|
Event.input.push((e) => {
|
||||||
|
if (e.target.value || e.target.value === 0) {
|
||||||
let value = e.target.value
|
let value = e.target.value
|
||||||
if (e.target.type == 'number') {
|
|
||||||
value = Number(value)
|
value = Number(value)
|
||||||
|
if (e.data != '.' && (e.data != '-' || e.target.value)) {
|
||||||
|
if (((!e.target.max) && (!e.target.min)) || ((value <= Number(e.target.max)) && value >= Number(e.target.min))) {
|
||||||
|
// that[m.value] = value
|
||||||
|
value = 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)
|
||||||
|
// }
|
||||||
|
that[m.value] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
Event.blur.push((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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
that[m.value] = value
|
that[m.value] = value
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Event.input.push((e) => {
|
||||||
|
that[m.value] = e.target.value
|
||||||
|
})
|
||||||
|
}
|
||||||
if (elements[i].nodeName == 'IMG') {
|
if (elements[i].nodeName == 'IMG') {
|
||||||
elements[i].src = that[m.value]
|
elements[i].src = that[m.value]
|
||||||
}
|
}
|
||||||
@ -57,13 +101,13 @@ class eventBinding {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '@click': {
|
case '@click': {
|
||||||
elements[i].addEventListener('click', (e) => {
|
isEvent = true
|
||||||
if (typeof (that.Dialog[m.value]) === 'function') {
|
Event.click.push((e) => {
|
||||||
that.Dialog[m.value](e)
|
if (typeof (that[m.value]) === 'function') {
|
||||||
|
that[m.value](e)
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
removeName.push(m.name)
|
removeName.push(m.name)
|
||||||
// elements[i].attributes.removeNamedItem(m.name)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,19 +118,18 @@ class eventBinding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isEvent) {
|
if (isEvent) {
|
||||||
let ventType = 'input'
|
for (let key in Event) {
|
||||||
if (elements[i].tagName != 'INPUT' || elements[i].type == 'checkbox') {
|
if (Event[key].length > 0) {
|
||||||
ventType = 'change'
|
elements[i].addEventListener(key, (e) => {
|
||||||
}
|
for (let t = 0; t < Event[key].length; t++) {
|
||||||
elements[i].addEventListener(ventType, (e) => {
|
Event[key][t](e)
|
||||||
for (let t = 0; t < Event.length; t++) {
|
|
||||||
Event[t](e)
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const EventBinding = new eventBinding();
|
|
||||||
export default EventBinding;
|
export default EventBinding;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
import Dialog from '../../../Obj/Element/Dialog';
|
import Dialog from '../../../Obj/Element/Dialog';
|
||||||
import { html } from "./_element";
|
import { html } from "./_element";
|
||||||
import EventBinding from '../../../Obj/Element/Dialog/eventBinding';
|
import EventBinding from './eventBinding';
|
||||||
import { syncData } from '../../MultiViewportMode'
|
import { syncData } from '../../MultiViewportMode'
|
||||||
import Tools from '../../../Tools'
|
import Tools from '../../../Tools'
|
||||||
import TimeLine from './TimeLine'
|
import TimeLine from './TimeLine'
|
||||||
|
@ -187,7 +187,7 @@ import DrawTakeOff from '../Obj/AirLine/DrawTakeOff'
|
|||||||
import FlowLine from '../Obj/Base/FlowLine'
|
import FlowLine from '../Obj/Base/FlowLine'
|
||||||
import Sunshine from '../Global/efflect/Sunshine'
|
import Sunshine from '../Global/efflect/Sunshine'
|
||||||
// import Road2 from '../Obj/Base/RoadObject'
|
// import Road2 from '../Obj/Base/RoadObject'
|
||||||
// import TextBox from '../Obj/Base/TextBox'
|
import TextBox from '../Obj/Base/TextBox'
|
||||||
import BatchModel from '../Obj/Base/BatchModel'
|
import BatchModel from '../Obj/Base/BatchModel'
|
||||||
|
|
||||||
const YJEarthismeasuring = Symbol('测量状态')
|
const YJEarthismeasuring = Symbol('测量状态')
|
||||||
@ -262,7 +262,7 @@ if (!window.YJ) {
|
|||||||
Dialog,
|
Dialog,
|
||||||
FlowLine,
|
FlowLine,
|
||||||
// Road2,
|
// Road2,
|
||||||
// TextBox,
|
TextBox,
|
||||||
BatchModel
|
BatchModel
|
||||||
},
|
},
|
||||||
YJEarth,
|
YJEarth,
|
||||||
|
@ -292,7 +292,7 @@ class PolygonObject extends Base {
|
|||||||
}
|
}
|
||||||
set labelShow(v) {
|
set labelShow(v) {
|
||||||
this.options.label.show = v
|
this.options.label.show = v
|
||||||
if (this.show) {
|
if (this.show && !this.showView || this.showView == 3) {
|
||||||
this.label.show = v
|
this.label.show = v
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
229
src/Obj/Base/BatchModel/_element_拓展.js
Normal file
229
src/Obj/Base/BatchModel/_element_拓展.js
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
import { attributeElm } from '../../Element/elm_html'
|
||||||
|
|
||||||
|
function html(that) {
|
||||||
|
return `
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<div class="div-item">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">颜色</span>
|
||||||
|
<div class="color"></div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<div class="div-item">
|
||||||
|
<div class="row">
|
||||||
|
<div style="width: 46%;">
|
||||||
|
<div class="row add-type-box">
|
||||||
|
<div class="lable-left-line">添加方式
|
||||||
|
<div class="input input-select add-type" style="margin-left: 20px;"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="width: 50%;">
|
||||||
|
<div class="row" style="margin-bottom: 5px;">
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">朝向偏移</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" min="0" max="360" @model="deviation">
|
||||||
|
<span class="unit">°</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4>模型间隔</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="YJ-custom-checkbox-box" style="display: flex;align-items: center;cursor: pointer;">
|
||||||
|
<input type="checkbox" class="YJ-custom-checkbox">
|
||||||
|
<span style="margin-left: 10px; margin-bottom: 1px;user-select: none;">自定义距离</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<div class="YJ-custom-checkbox-box" style="display: flex;align-items: center;cursor: pointer;">
|
||||||
|
<input type="checkbox" class="YJ-custom-checkbox">
|
||||||
|
<span style="margin-left: 10px; margin-bottom: 1px;user-select: none;">固定距离</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">模型间隔</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" min="0" max="360" @model="spacing">
|
||||||
|
<span class="unit">米</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4>线型选择</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="YJ-custom-checkbox-box" style="display: flex;align-items: center;cursor: pointer;">
|
||||||
|
<input type="checkbox" class="YJ-custom-checkbox">
|
||||||
|
<span style="margin-left: 10px; margin-bottom: 1px;user-select: none;">折线</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<div class="YJ-custom-checkbox-box" style="display: flex;align-items: center;cursor: pointer;">
|
||||||
|
<input type="checkbox" class="YJ-custom-checkbox">
|
||||||
|
<span style="margin-left: 10px; margin-bottom: 1px;user-select: none;">曲线</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">线条数量</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" min="0" max="360" @model="lineNum">
|
||||||
|
<span class="unit">条</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">线条间隔</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" min="0" max="360" @model="lineSpacing">
|
||||||
|
<span class="unit">米</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="YJ-custom-checkbox-box" style="display: flex;align-items: center;cursor: pointer;">
|
||||||
|
<input type="checkbox" class="YJ-custom-checkbox">
|
||||||
|
<span style="margin-left: 10px; margin-bottom: 1px;user-select: none;">随机采样</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">随机数量</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" min="0" max="360" @model="lineNum">
|
||||||
|
<span class="unit">个</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col"></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="YJ-custom-checkbox-box" style="display: flex;align-items: center;cursor: pointer;">
|
||||||
|
<input type="checkbox" class="YJ-custom-checkbox">
|
||||||
|
<span style="margin-left: 10px; margin-bottom: 1px;user-select: none;">网格采样</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">首边间隔</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" min="0" max="360" @model="fistLineSpacing">
|
||||||
|
<span class="unit">米</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">次边间隔</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" min="0" max="360" @model="secondLineSpacing">
|
||||||
|
<span class="unit">米</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<div class="row">
|
||||||
|
<DIV-cy-tabs id="point-object-edit-tabs">
|
||||||
|
<DIV-cy-tab-pane label="空间信息">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col height-mode-box">
|
||||||
|
<span class="label" style="flex: 0 0 56px;">高度模式</span>
|
||||||
|
<div class="height-mode"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div style="width: 46%;">
|
||||||
|
<div class="row add-type-box">
|
||||||
|
<div class="lable-left-line">缩放
|
||||||
|
<div class="YJ-custom-checkbox-box" style="display: flex;align-items: center;cursor: pointer;">
|
||||||
|
<input type="checkbox" class="YJ-custom-checkbox">
|
||||||
|
<span style="margin-left: 10px; margin-bottom: 1px;user-select: none;">是否等比例缩放</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</DIV-cy-tab-pane>
|
||||||
|
<DIV-cy-tab-pane label="标注风格">
|
||||||
|
<div>
|
||||||
|
<div class="row" style="margin-bottom: 10px;">
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">新增模型风格设置</span>
|
||||||
|
<button @click="openRichTextEditor">初始风格</button>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<button @click="openRichTextEditor">当前风格</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row" style="margin-bottom: 10px;">
|
||||||
|
<div class="col" style="flex: 0 0 80px;">
|
||||||
|
<span class="label" style="flex: none;">显隐</span>
|
||||||
|
<input class="btn-switch" type="checkbox" @model="billboardShow">
|
||||||
|
</div>
|
||||||
|
<div class="col" style="flex: 0 0 90px;">
|
||||||
|
<span class="label" style="flex: none;">图标</span>
|
||||||
|
<div class="image-box" @click="clickChangeImage">
|
||||||
|
<img class="image" src="" alt="" @model="billboardImage">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col" style="flex: 0 0 90px;">
|
||||||
|
<span class="label" style="flex: none;">默认图标</span>
|
||||||
|
<div class="image-box" @click="clickChangeDefaultImage">
|
||||||
|
<img class="image" src="" alt="" @model="billboardDefaultImage">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">图标倍数</span>
|
||||||
|
<div class="input-number input-number-unit-2">
|
||||||
|
<input class="input" type="number" title="" min="0.1" max="99" @model="billboardScale">
|
||||||
|
<span class="unit">倍</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h4>文字设置</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col" style="flex: 0 0 80px;">
|
||||||
|
<span class="label" style="flex: none;">显隐</span>
|
||||||
|
<input class="btn-switch" type="checkbox" @model="labelShow">
|
||||||
|
</div>
|
||||||
|
<div class="col font-select-box">
|
||||||
|
<span class="label" style="flex: none;">字体选择</span>
|
||||||
|
<div class="input input-select font-select"></div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">文字大小</span>
|
||||||
|
<div class="input-number input-number-unit-2">
|
||||||
|
<input class="input" type="number" title="" min="1" max="99" @model="labelFontSize" style="width: 70px;">
|
||||||
|
<span class="unit">px</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">文字颜色</span>
|
||||||
|
<div class="labelColor"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</DIV-cy-tab-pane>
|
||||||
|
</DIV-cy-tabs>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
|
export { html }
|
@ -48,7 +48,7 @@ class BatchModel extends Base {
|
|||||||
this.sdk.addIncetance(this.options.id, this)
|
this.sdk.addIncetance(this.options.id, this)
|
||||||
// BatchModel.computeDis(this)
|
// BatchModel.computeDis(this)
|
||||||
// if (this.options.positions.length > 0 || this.options.positions.lng) {
|
// if (this.options.positions.length > 0 || this.options.positions.lng) {
|
||||||
if (options.type && options.spacing != undefined) {
|
if ((options.type && options.spacing != undefined) || options.type == '点') {
|
||||||
// BatchModel.computeDis(this)
|
// BatchModel.computeDis(this)
|
||||||
|
|
||||||
let Draw
|
let Draw
|
||||||
|
@ -40,6 +40,11 @@ import {
|
|||||||
import { getGoodsList } from '../../../Tools/getGoodsList'
|
import { getGoodsList } from '../../../Tools/getGoodsList'
|
||||||
|
|
||||||
class BillboardObject extends Base {
|
class BillboardObject extends Base {
|
||||||
|
#_postRenderEvent = null
|
||||||
|
#_destroyMouseEvent = null
|
||||||
|
#_billboardHeight = 0
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
* @description 创建点标注
|
* @description 创建点标注
|
||||||
@ -118,6 +123,7 @@ class BillboardObject extends Base {
|
|||||||
this.options.positions.alt = Number(
|
this.options.positions.alt = Number(
|
||||||
Number(options.positions.alt || 0).toFixed(2)
|
Number(options.positions.alt || 0).toFixed(2)
|
||||||
)
|
)
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
// this.options.diffuseShow = options.diffuseShow || false
|
// this.options.diffuseShow = options.diffuseShow || false
|
||||||
// this.options.diffuseRadius = (options.diffuseRadius || options.diffuseRadius === 0) ? options.diffuseRadius : 10
|
// this.options.diffuseRadius = (options.diffuseRadius || options.diffuseRadius === 0) ? options.diffuseRadius : 10
|
||||||
// this.options.diffuseDuration = (options.diffuseDuration || options.diffuseDuration === 0) ? options.diffuseDuration : 2000
|
// this.options.diffuseDuration = (options.diffuseDuration || options.diffuseDuration === 0) ? options.diffuseDuration : 2000
|
||||||
@ -145,11 +151,18 @@ class BillboardObject extends Base {
|
|||||||
this.options.attribute.goods.content || []
|
this.options.attribute.goods.content || []
|
||||||
this.options.attributeType = options.attributeType || 'richText'
|
this.options.attributeType = options.attributeType || 'richText'
|
||||||
this.options.coordinate = options.coordinate || ''
|
this.options.coordinate = options.coordinate || ''
|
||||||
|
this.options.attributeBoxState = options.attributeBoxState || false
|
||||||
this.operate = {}
|
this.operate = {}
|
||||||
this._elms = {}
|
this._elms = {}
|
||||||
this.previous = {
|
this.previous = {
|
||||||
positions: { ...this.options.positions }
|
positions: { ...this.options.positions }
|
||||||
}
|
}
|
||||||
|
this.options.attributePos = options.attributePos || {
|
||||||
|
x: 60,
|
||||||
|
y: 60,
|
||||||
|
width: 200,
|
||||||
|
height: 120
|
||||||
|
}
|
||||||
this.entity
|
this.entity
|
||||||
this._proj = this.sdk.proj
|
this._proj = this.sdk.proj
|
||||||
|
|
||||||
@ -182,7 +195,109 @@ class BillboardObject extends Base {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.#_destroyMouseEvent = () => {
|
||||||
|
this.attributeElm && (this.attributeElm.style.pointerEvents = 'unset')
|
||||||
|
this.sdk.viewer._element.onmousemove = null
|
||||||
|
document.removeEventListener('mouseup', this.#_destroyMouseEvent)
|
||||||
|
document.removeEventListener('mouseleave', this.#_destroyMouseEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#_postRenderEvent = () => {
|
||||||
|
let siteInfoPosition = Cesium.Cartesian3.fromDegrees(
|
||||||
|
this.options.positions.lng,
|
||||||
|
this.options.positions.lat,
|
||||||
|
this.#_billboardHeight
|
||||||
|
)
|
||||||
|
if (this.attributeElm && this.entity) {
|
||||||
|
let winpos = this.sdk.viewer.scene.cartesianToCanvasCoordinates(
|
||||||
|
siteInfoPosition
|
||||||
|
)
|
||||||
|
let pixelOffset = this.entity.label.pixelOffset.getValue()
|
||||||
|
if (winpos) {
|
||||||
|
let scale = getCurrentBillboardScale(this.entity, this.sdk.viewer.scene)
|
||||||
|
let height = ((this.entity.billboard.height.getValue() * (this.options.billboard.scale || 0)) + this.options.label.fontSize) * (1 - (scale * scale))
|
||||||
|
let flag = false
|
||||||
|
let lineElm = this.attributeElm.getElementsByClassName('billboard-attribute-box-line')[0]
|
||||||
|
let leftTopElm = this.attributeElm.getElementsByClassName('left-top')[0]
|
||||||
|
let rightTopElm = this.attributeElm.getElementsByClassName('right-top')[0]
|
||||||
|
this.attributeElm.style.left = (winpos.x + this.options.attributePos.x).toFixed(0) + 'px'
|
||||||
|
this.attributeElm.style.top = (winpos.y + pixelOffset.y - (this.options.label.show ? (this.options.label.fontSize / 2) : -(this.options.label.fontSize / 2)) - this.attributeElm.offsetHeight - this.options.attributePos.y + height).toFixed(0) + 'px'
|
||||||
|
this.attributeElm.style.width = this.options.attributePos.width + 'px'
|
||||||
|
this.attributeElm.style.height = this.options.attributePos.height + 'px'
|
||||||
|
lineElm.style.zIndex = '-1'
|
||||||
|
if (this.options.attributePos.x < -this.options.attributePos.width / 2) {
|
||||||
|
flag = true
|
||||||
|
lineElm.style.left = 'unset'
|
||||||
|
lineElm.style.right = '0'
|
||||||
|
leftTopElm.style.display = 'block'
|
||||||
|
rightTopElm.style.display = 'none'
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lineElm.style.left = '0'
|
||||||
|
lineElm.style.right = 'unset'
|
||||||
|
leftTopElm.style.display = 'none'
|
||||||
|
rightTopElm.style.display = 'block'
|
||||||
|
}
|
||||||
|
|
||||||
|
let lineLength
|
||||||
|
let lineAngleRad
|
||||||
|
let lineAngle
|
||||||
|
let x
|
||||||
|
let y
|
||||||
|
if (flag) {
|
||||||
|
x = this.attributeElm.offsetWidth + this.options.attributePos.x
|
||||||
|
y = this.options.attributePos.y ? this.options.attributePos.y : 0
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x = this.options.attributePos.x
|
||||||
|
y = this.options.attributePos.y ? this.options.attributePos.y : 0
|
||||||
|
}
|
||||||
|
lineLength = Math.sqrt((x * x) + (y * y)).toFixed(2);
|
||||||
|
lineAngleRad = Math.atan(x / y);
|
||||||
|
lineAngle = parseFloat((lineAngleRad * 180 / Math.PI).toFixed(2));
|
||||||
|
if (this.options.attributePos.y < 0) {
|
||||||
|
lineAngle = lineAngle + 180
|
||||||
|
}
|
||||||
|
// if(this.options.attributePos.y<-this.options.attributePos.height/2) {
|
||||||
|
// lineElm.style.bottom = 'unset'
|
||||||
|
// lineElm.style.top = '0'
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// lineElm.style.bottom = -lineLength + 'px'
|
||||||
|
// lineElm.style.top = 'unset'
|
||||||
|
// }
|
||||||
|
lineElm.style.height = lineLength + 'px'
|
||||||
|
lineElm.style.transform = 'rotate(' + lineAngle + 'deg)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentBillboardScale(entity, scene) {
|
||||||
|
// 获取相机到Billboard的距离
|
||||||
|
const distance = Cesium.Cartesian3.distance(
|
||||||
|
scene.camera.positionWC,
|
||||||
|
entity.position.getValue()
|
||||||
|
);
|
||||||
|
// 获取缩放距离配置
|
||||||
|
const scaleByDistance = entity.billboard.scaleByDistance ? entity.billboard.scaleByDistance.getValue() : undefined;
|
||||||
|
|
||||||
|
if (!scaleByDistance) {
|
||||||
|
// 如果没有设置距离缩放,则使用基础缩放值
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析缩放距离参数 [near, nearScale, far, farScale]
|
||||||
|
const { near, nearValue, far, farValue } = scaleByDistance;
|
||||||
|
if (distance <= near) {
|
||||||
|
return nearValue;
|
||||||
|
} else if (distance >= far) {
|
||||||
|
return farValue;
|
||||||
|
} else {
|
||||||
|
// 计算中间距离的缩放值(线性插值)
|
||||||
|
const t = (distance - near) / (far - near);
|
||||||
|
return Cesium.Math.lerp(nearValue, farValue, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
this.sdk.addIncetance(this.options.id, this)
|
this.sdk.addIncetance(this.options.id, this)
|
||||||
@ -243,6 +358,7 @@ class BillboardObject extends Base {
|
|||||||
that.entity.billboard.imgHeight = 0
|
that.entity.billboard.imgHeight = 0
|
||||||
that.entity.billboard.image = canvas
|
that.entity.billboard.image = canvas
|
||||||
addCluster(that.sdk, that.entity)
|
addCluster(that.sdk, that.entity)
|
||||||
|
that.attributeBoxState && (that.attributeBoxState = true)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -267,6 +383,7 @@ class BillboardObject extends Base {
|
|||||||
return img
|
return img
|
||||||
}, false)
|
}, false)
|
||||||
addCluster(that.sdk, that.entity)
|
addCluster(that.sdk, that.entity)
|
||||||
|
that.attributeBoxState && (that.attributeBoxState = true)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -298,6 +415,7 @@ class BillboardObject extends Base {
|
|||||||
that.entity.billboard.imgHeight = height
|
that.entity.billboard.imgHeight = height
|
||||||
that.entity.billboard.image = canvas
|
that.entity.billboard.image = canvas
|
||||||
addCluster(that.sdk, that.entity)
|
addCluster(that.sdk, that.entity)
|
||||||
|
that.attributeBoxState && (that.attributeBoxState = true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
image.onerror = function (err) {
|
image.onerror = function (err) {
|
||||||
@ -309,6 +427,7 @@ class BillboardObject extends Base {
|
|||||||
that.entity.billboard.imgHeight = 0
|
that.entity.billboard.imgHeight = 0
|
||||||
that.entity.billboard.image = canvas
|
that.entity.billboard.image = canvas
|
||||||
addCluster(that.sdk, that.entity)
|
addCluster(that.sdk, that.entity)
|
||||||
|
that.attributeBoxState && (that.attributeBoxState = true)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -471,9 +590,30 @@ class BillboardObject extends Base {
|
|||||||
}
|
}
|
||||||
if (!this.showView || this.showView == 3) {
|
if (!this.showView || this.showView == 3) {
|
||||||
this.entity && (this.entity.show = this.options.show)
|
this.entity && (this.entity.show = this.options.show)
|
||||||
|
if (this.attributeBoxState && this.options.show) {
|
||||||
|
this.attributeBoxState = this.options.show
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 关闭属性框
|
||||||
|
document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
if (this.attributeElm) {
|
||||||
|
this.sdk.viewer._element.removeChild(this.attributeElm)
|
||||||
|
this.attributeElm = null
|
||||||
|
}
|
||||||
|
this.sdk.viewer.scene.postRender.removeEventListener(this.#_postRenderEvent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.entity && (this.entity.show = false)
|
this.entity && (this.entity.show = false)
|
||||||
|
// 关闭属性框
|
||||||
|
document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
if (this.attributeElm) {
|
||||||
|
this.sdk.viewer._element.removeChild(this.attributeElm)
|
||||||
|
this.attributeElm = null
|
||||||
|
}
|
||||||
|
this.sdk.viewer.scene.postRender.removeEventListener(this.#_postRenderEvent)
|
||||||
}
|
}
|
||||||
syncData(this.sdk, this.options.id)
|
syncData(this.sdk, this.options.id)
|
||||||
syncSplitData(this.sdk, this.options.id)
|
syncSplitData(this.sdk, this.options.id)
|
||||||
@ -562,6 +702,26 @@ class BillboardObject extends Base {
|
|||||||
if (this.entity) {
|
if (this.entity) {
|
||||||
this.entity.billboard.heightReference = heightMode
|
this.entity.billboard.heightReference = heightMode
|
||||||
this.entity.label.heightReference = heightMode
|
this.entity.label.heightReference = heightMode
|
||||||
|
if(heightMode == Cesium.HeightReference.CLAMP_TO_GROUND) {
|
||||||
|
if (this.sdk.viewer.scene.terrainProvider.availability) {
|
||||||
|
Cesium.sampleTerrainMostDetailed(
|
||||||
|
this.sdk.viewer.scene.terrainProvider,
|
||||||
|
[
|
||||||
|
Cesium.Cartographic.fromDegrees(
|
||||||
|
this.options.positions.lng,
|
||||||
|
this.options.positions.lat
|
||||||
|
)
|
||||||
|
]
|
||||||
|
).then(position => {
|
||||||
|
this.#_billboardHeight = position[0].height
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.#_billboardHeight = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this._elms.heightMode && (this._elms.heightMode.value = heightModeName)
|
this._elms.heightMode && (this._elms.heightMode.value = heightModeName)
|
||||||
}
|
}
|
||||||
@ -616,6 +776,7 @@ class BillboardObject extends Base {
|
|||||||
}
|
}
|
||||||
set alt(v) {
|
set alt(v) {
|
||||||
this.options.positions.alt = Number(Number(v).toFixed(2))
|
this.options.positions.alt = Number(Number(v).toFixed(2))
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
// this.scan && (this.scan.alt = v)
|
// this.scan && (this.scan.alt = v)
|
||||||
// this.diffuse && (this.diffuse.alt = v)
|
// this.diffuse && (this.diffuse.alt = v)
|
||||||
this.renewPoint()
|
this.renewPoint()
|
||||||
@ -1716,6 +1877,22 @@ class BillboardObject extends Base {
|
|||||||
this.cameraSelect && this.cameraSelect()
|
this.cameraSelect && this.cameraSelect()
|
||||||
this.ISCSelect && this.ISCSelect()
|
this.ISCSelect && this.ISCSelect()
|
||||||
this.goodsSelect && this.goodsSelect()
|
this.goodsSelect && this.goodsSelect()
|
||||||
|
|
||||||
|
let col = document.createElement('div')
|
||||||
|
col.className = 'col'
|
||||||
|
col.style.flex = '0 0 110px'
|
||||||
|
col.innerHTML = `
|
||||||
|
<span class="label">属性框</span>
|
||||||
|
<input class="btn-switch" type="checkbox">
|
||||||
|
`
|
||||||
|
|
||||||
|
let row = this._DialogObject._element.content.getElementsByClassName('attribute')[0].getElementsByClassName('row')[0]
|
||||||
|
row.appendChild(col)
|
||||||
|
let boxSwitch = col.getElementsByClassName('btn-switch')[0]
|
||||||
|
boxSwitch.checked = this.attributeBoxState
|
||||||
|
boxSwitch.addEventListener('change', (e) => {
|
||||||
|
this.attributeBoxState = boxSwitch.checked
|
||||||
|
})
|
||||||
let tagData = this.attributeSelect
|
let tagData = this.attributeSelect
|
||||||
let attributeElm = this._DialogObject._element.content.getElementsByClassName(
|
let attributeElm = this._DialogObject._element.content.getElementsByClassName(
|
||||||
'attribute-select-box'
|
'attribute-select-box'
|
||||||
@ -2227,6 +2404,7 @@ class BillboardObject extends Base {
|
|||||||
this.attributeCamera = this.options.attribute.camera.content
|
this.attributeCamera = this.options.attribute.camera.content
|
||||||
this.attributeGoods = this.options.attribute.goods.content
|
this.attributeGoods = this.options.attribute.goods.content
|
||||||
this.attributeISC = this.options.attribute.ISC.content
|
this.attributeISC = this.options.attribute.ISC.content
|
||||||
|
this.attributeBoxState = this.options.attributeBoxState
|
||||||
this.cameraSelect && this.cameraSelect()
|
this.cameraSelect && this.cameraSelect()
|
||||||
this.goodsSelect && this.goodsSelect()
|
this.goodsSelect && this.goodsSelect()
|
||||||
}
|
}
|
||||||
@ -2234,6 +2412,7 @@ class BillboardObject extends Base {
|
|||||||
async remove() {
|
async remove() {
|
||||||
await remove_entity_from_cluster(this.sdk.viewer, this.entity)
|
await remove_entity_from_cluster(this.sdk.viewer, this.entity)
|
||||||
this.entity = null
|
this.entity = null
|
||||||
|
this.attributeBoxState = false
|
||||||
if (!this.sdk.viewer || !this.sdk.viewer.entities) {
|
if (!this.sdk.viewer || !this.sdk.viewer.entities) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -2424,6 +2603,7 @@ class BillboardObject extends Base {
|
|||||||
}
|
}
|
||||||
if (height !== undefined) {
|
if (height !== undefined) {
|
||||||
this.options.positions.alt = Number(Number(height).toFixed(2))
|
this.options.positions.alt = Number(Number(height).toFixed(2))
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
this._elms.alt &&
|
this._elms.alt &&
|
||||||
this._elms.alt.forEach(item => {
|
this._elms.alt.forEach(item => {
|
||||||
item.value = this.options.positions.alt
|
item.value = this.options.positions.alt
|
||||||
@ -2439,6 +2619,7 @@ class BillboardObject extends Base {
|
|||||||
switch (this._elms.heightMode.value) {
|
switch (this._elms.heightMode.value) {
|
||||||
case '海拔高度':
|
case '海拔高度':
|
||||||
heightElm.value = this.options.positions.alt
|
heightElm.value = this.options.positions.alt
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
break
|
break
|
||||||
case '相对地表':
|
case '相对地表':
|
||||||
if (this.sdk.viewer.scene.terrainProvider.availability) {
|
if (this.sdk.viewer.scene.terrainProvider.availability) {
|
||||||
@ -2454,15 +2635,18 @@ class BillboardObject extends Base {
|
|||||||
heightElm.value = Number(
|
heightElm.value = Number(
|
||||||
(this.options.positions.alt - position[0].height).toFixed(2)
|
(this.options.positions.alt - position[0].height).toFixed(2)
|
||||||
)
|
)
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
heightElm.value = this.options.positions.alt
|
heightElm.value = this.options.positions.alt
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case '依附地表':
|
case '依附地表':
|
||||||
break
|
break
|
||||||
case '依附模型':
|
case '依附模型':
|
||||||
heightElm.value = this.options.positions.alt
|
heightElm.value = this.options.positions.alt
|
||||||
|
this.#_billboardHeight = this.options.positions.alt
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2736,6 +2920,216 @@ class BillboardObject extends Base {
|
|||||||
(this.originalOptions.customView = this.options.customView)
|
(this.originalOptions.customView = this.options.customView)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get attributeBoxState() {
|
||||||
|
return this.options.attributeBoxState
|
||||||
|
}
|
||||||
|
|
||||||
|
set attributeBoxState(state) {
|
||||||
|
state = state ? true : false
|
||||||
|
this.options.attributeBoxState = state
|
||||||
|
document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
if (this.attributeElm) {
|
||||||
|
this.sdk.viewer._element.removeChild(this.attributeElm)
|
||||||
|
this.attributeElm = null
|
||||||
|
}
|
||||||
|
this.sdk.viewer.scene.postRender.removeEventListener(this.#_postRenderEvent)
|
||||||
|
if (state && this.sdk && this.sdk.viewer && this.sdk.viewer._element && this.show) {
|
||||||
|
let attributeElm = document.createElement('div')
|
||||||
|
this.attributeElm = attributeElm
|
||||||
|
attributeElm.className = 'billboard-attribute-box'
|
||||||
|
attributeElm.style.top = '0px'
|
||||||
|
attributeElm.style.left = '0px'
|
||||||
|
attributeElm.style.width = 0
|
||||||
|
attributeElm.style.height = 0
|
||||||
|
// attributeElm.innerHTML = this.options.richTextContent
|
||||||
|
this.sdk.viewer._element.appendChild(attributeElm)
|
||||||
|
let linkHtml = ''
|
||||||
|
let goodsHtml = ''
|
||||||
|
let richTextHtml = ''
|
||||||
|
for (let i = 0; i < this.options.attribute.link.content.length; i++) {
|
||||||
|
linkHtml += `<DIV-cy-tab-pane label="${this.options.attribute.link.content[i].name}"><iframe width='100%' height='100%' src="${this.options.attribute.link.content[i].url}"></iframe></DIV-cy-tab-pane>`
|
||||||
|
}
|
||||||
|
if (this.options.attribute.goods && this.options.attribute.goods.content && this.options.attribute.goods.content.length > 0) {
|
||||||
|
goodsHtml += `<DIV-cy-tab-pane label="物资">
|
||||||
|
<div class="table">
|
||||||
|
<div class="table-head">
|
||||||
|
<div class="tr">
|
||||||
|
<div class="th" style="width: 20%; flex: 0 20%;">序号</div>
|
||||||
|
<div class="th" style="width: 40%; flex: 0 40%;">名称</div>
|
||||||
|
<div class="th" style="width: 40%; flex: 0 40%;">数量</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="table-body">
|
||||||
|
`
|
||||||
|
for (let i = 0; i < this.options.attribute.goods.content.length; i++) {
|
||||||
|
goodsHtml += `<div class="tr">
|
||||||
|
<div class="td" style="width: 20%; flex: 0 20%;">${i + 1}</div>
|
||||||
|
<div class="td" style="width: 40%; flex: 0 40%;">${this.options.attribute.goods.content[i].name}</div>
|
||||||
|
<div class="td" style="width: 40%; flex: 0 40%;">${this.options.attribute.goods.content[i].cnt}</div>
|
||||||
|
</div>`
|
||||||
|
}
|
||||||
|
goodsHtml += `</div></div></DIV-cy-tab-pane>`
|
||||||
|
}
|
||||||
|
if (this.options.richTextContent) {
|
||||||
|
richTextHtml = `<DIV-cy-tab-pane label="富文本">
|
||||||
|
${this.options.richTextContent}
|
||||||
|
</DIV-cy-tab-pane>`
|
||||||
|
}
|
||||||
|
|
||||||
|
let boxHtml = `
|
||||||
|
<span class="drag-nook left-top"></span>
|
||||||
|
<span class="drag-nook right-top"></span>
|
||||||
|
`
|
||||||
|
|
||||||
|
if (!linkHtml && !goodsHtml && !richTextHtml) {
|
||||||
|
boxHtml = boxHtml + '<p style="margin: 0;width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;backdrop-filter: blur(2px);">暂无属性信息</p><div class="billboard-attribute-box-line"></div>'
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
boxHtml = boxHtml + `
|
||||||
|
<DIV-cy-tabs class="tabs">
|
||||||
|
${richTextHtml}
|
||||||
|
${goodsHtml}
|
||||||
|
${linkHtml}
|
||||||
|
</DIV-cy-tabs>
|
||||||
|
<div class="billboard-attribute-box-line"></div>`
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeElm.innerHTML = boxHtml
|
||||||
|
|
||||||
|
if (attributeElm.getElementsByClassName('tabs')[0]) {
|
||||||
|
let tabsElm = new cy_tabs(attributeElm.getElementsByClassName('tabs')[0], undefined, this.sdk)
|
||||||
|
}
|
||||||
|
|
||||||
|
let imgElm = attributeElm.getElementsByTagName('img')
|
||||||
|
for (let i = 0; i < imgElm.length; i++) {
|
||||||
|
if (!imgElm[i].style.width) {
|
||||||
|
imgElm[i].style.width = '100%'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sdk.viewer.scene.postRender.addEventListener(this.#_postRenderEvent)
|
||||||
|
let leftOnmousedown = (e) => {
|
||||||
|
if (this.options.attributePos.width < 200) {
|
||||||
|
this.options.attributePos.width = 200
|
||||||
|
}
|
||||||
|
if (this.options.attributePos.height < 120) {
|
||||||
|
this.options.attributePos.height = 120
|
||||||
|
}
|
||||||
|
let x = e.x
|
||||||
|
let y = e.y
|
||||||
|
let width = this.options.attributePos.width
|
||||||
|
let height = this.options.attributePos.height
|
||||||
|
let positionx = this.options.attributePos.x
|
||||||
|
this.sdk.viewer._element.onmousemove = (e2) => {
|
||||||
|
this.options.attributePos.width = width + (x - e2.x)
|
||||||
|
this.options.attributePos.height = height + (y - e2.y)
|
||||||
|
if (this.options.attributePos.width < 200) {
|
||||||
|
this.options.attributePos.width = 200
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.options.attributePos.x = positionx - (x - e2.x)
|
||||||
|
}
|
||||||
|
if (this.options.attributePos.height < 120) {
|
||||||
|
this.options.attributePos.height = 120
|
||||||
|
}
|
||||||
|
// this.options.attributePos.y = positiony + (y - e2.y)
|
||||||
|
}
|
||||||
|
document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
}
|
||||||
|
let rightOnmousedown = (e) => {
|
||||||
|
let x = e.x
|
||||||
|
let y = e.y
|
||||||
|
if (this.options.attributePos.width < 200) {
|
||||||
|
this.options.attributePos.width = 200
|
||||||
|
}
|
||||||
|
if (this.options.attributePos.height < 120) {
|
||||||
|
this.options.attributePos.height = 120
|
||||||
|
}
|
||||||
|
let width = this.options.attributePos.width
|
||||||
|
let height = this.options.attributePos.height
|
||||||
|
this.sdk.viewer._element.onmousemove = (e2) => {
|
||||||
|
this.options.attributePos.width = width + (e2.x - x)
|
||||||
|
this.options.attributePos.height = height + (y - e2.y)
|
||||||
|
}
|
||||||
|
document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
}
|
||||||
|
// leftTopElm.onmousedown = (e) => {
|
||||||
|
// console.log(1111111111)
|
||||||
|
// if (this.options.attributePos.width < 200) {
|
||||||
|
// this.options.attributePos.width = 200
|
||||||
|
// }
|
||||||
|
// if (this.options.attributePos.height < 120) {
|
||||||
|
// this.options.attributePos.height = 120
|
||||||
|
// }
|
||||||
|
// let x = e.x
|
||||||
|
// let y = e.y
|
||||||
|
// let width = this.options.attributePos.width
|
||||||
|
// let height = this.options.attributePos.height
|
||||||
|
// let positionx = this.options.attributePos.x
|
||||||
|
// this.sdk.viewer._element.onmousemove = (e2) => {
|
||||||
|
// this.options.attributePos.width = width + (x - e2.x)
|
||||||
|
// this.options.attributePos.height = height + (y - e2.y)
|
||||||
|
// if (this.options.attributePos.width < 200) {
|
||||||
|
// this.options.attributePos.width = 200
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// this.options.attributePos.x = positionx - (x - e2.x)
|
||||||
|
// }
|
||||||
|
// if (this.options.attributePos.height < 120) {
|
||||||
|
// this.options.attributePos.height = 120
|
||||||
|
// }
|
||||||
|
// // this.options.attributePos.y = positiony + (y - e2.y)
|
||||||
|
// }
|
||||||
|
// document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
// document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
// }
|
||||||
|
// rightTopElm.onmousedown = (e) => {
|
||||||
|
// let x = e.x
|
||||||
|
// let y = e.y
|
||||||
|
// if (this.options.attributePos.width < 200) {
|
||||||
|
// this.options.attributePos.width = 200
|
||||||
|
// }
|
||||||
|
// if (this.options.attributePos.height < 120) {
|
||||||
|
// this.options.attributePos.height = 120
|
||||||
|
// }
|
||||||
|
// let width = this.options.attributePos.width
|
||||||
|
// let height = this.options.attributePos.height
|
||||||
|
// this.sdk.viewer._element.onmousemove = (e2) => {
|
||||||
|
// this.options.attributePos.width = width + (e2.x - x)
|
||||||
|
// this.options.attributePos.height = height + (y - e2.y)
|
||||||
|
// }
|
||||||
|
// document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
// document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
// }
|
||||||
|
|
||||||
|
attributeElm.onmousedown = (e) => {
|
||||||
|
attributeElm.style.pointerEvents = 'none'
|
||||||
|
if (e.target.className.indexOf('left-top') != -1) {
|
||||||
|
leftOnmousedown(e)
|
||||||
|
}
|
||||||
|
else if (e.target.className.indexOf('right-top') != -1) {
|
||||||
|
rightOnmousedown(e)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let x = e.x
|
||||||
|
let y = e.y
|
||||||
|
let oldX = this.options.attributePos.x
|
||||||
|
let oldXY = this.options.attributePos.y
|
||||||
|
let height = this.options.attributePos.height
|
||||||
|
this.sdk.viewer._element.onmousemove = (e2) => {
|
||||||
|
this.options.attributePos.x = oldX + (e2.x - x)
|
||||||
|
this.options.attributePos.y = oldXY - (e2.y - y)
|
||||||
|
}
|
||||||
|
document.addEventListener('mouseup', this.#_destroyMouseEvent);
|
||||||
|
document.addEventListener('mouseleave', this.#_destroyMouseEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default BillboardObject
|
export default BillboardObject
|
||||||
|
39
src/Obj/Base/RoadObject/_element.js
Normal file
39
src/Obj/Base/RoadObject/_element.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
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" maxlength="40" type="text" @model="name">
|
||||||
|
</div>
|
||||||
|
<div class="col road-box">
|
||||||
|
<span class="label" style="flex: 0 0 56px;">道路类型</span>
|
||||||
|
<div class="road-type"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
<div class="div-item">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">车道宽度</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" max="99999" min="1" step="1" @model="carRoadWidth">
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">人行道宽度</span>
|
||||||
|
<div class="input-number input-number-unit-1">
|
||||||
|
<input class="input" type="number" title="" max="99999" min="1" step="1" @model="sideWidth">
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider"></span>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
|
export { html }
|
92
src/Obj/Base/RoadObject/eventBinding.js
Normal file
92
src/Obj/Base/RoadObject/eventBinding.js
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
class eventBinding {
|
||||||
|
constructor() {
|
||||||
|
this.element = {}
|
||||||
|
}
|
||||||
|
static event = {}
|
||||||
|
|
||||||
|
getEvent(name) {
|
||||||
|
return eventBinding.event[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
getEventAll() {
|
||||||
|
return eventBinding.event
|
||||||
|
}
|
||||||
|
|
||||||
|
setEvent(name, event) {
|
||||||
|
eventBinding.event[name] = event
|
||||||
|
}
|
||||||
|
|
||||||
|
on(that, elements) {
|
||||||
|
for (let i = 0; i < elements.length; i++) {
|
||||||
|
let Event = []
|
||||||
|
let isEvent = false
|
||||||
|
let removeName = []
|
||||||
|
if (!elements[i] || !elements[i].attributes) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (let m of elements[i].attributes) {
|
||||||
|
switch (m.name) {
|
||||||
|
case '@model': {
|
||||||
|
isEvent = true
|
||||||
|
if (elements[i].type == 'checkbox') {
|
||||||
|
Event.push((e) => { that[m.value] = e.target.checked })
|
||||||
|
elements[i].checked = that[m.value]
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Event.push((e) => {
|
||||||
|
let value = e.target.value
|
||||||
|
if (e.target.type == 'number') {
|
||||||
|
value = Number(value)
|
||||||
|
}
|
||||||
|
that[m.value] = value
|
||||||
|
})
|
||||||
|
if (elements[i].nodeName == 'IMG') {
|
||||||
|
elements[i].src = that[m.value]
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
elements[i].value = that[m.value]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.element[m.value]) {
|
||||||
|
this.element[m.value].push(elements[i])
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.element[m.value] = [elements[i]]
|
||||||
|
}
|
||||||
|
removeName.push(m.name)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case '@click': {
|
||||||
|
elements[i].addEventListener('click', (e) => {
|
||||||
|
if (typeof (that.Dialog[m.value]) === 'function') {
|
||||||
|
that.Dialog[m.value](e)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
removeName.push(m.name)
|
||||||
|
// elements[i].attributes.removeNamedItem(m.name)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// elements[i].attributes[m] = undefined
|
||||||
|
}
|
||||||
|
for (let n = 0; n < removeName.length; n++) {
|
||||||
|
elements[i].attributes.removeNamedItem(removeName[n])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEvent) {
|
||||||
|
let ventType = 'input'
|
||||||
|
if (elements[i].tagName != 'INPUT' || elements[i].type == 'checkbox') {
|
||||||
|
ventType = 'change'
|
||||||
|
}
|
||||||
|
elements[i].addEventListener(ventType, (e) => {
|
||||||
|
for (let t = 0; t < Event.length; t++) {
|
||||||
|
Event[t](e)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const EventBinding = new eventBinding();
|
||||||
|
export default EventBinding;
|
1549
src/Obj/Base/RoadObject/index-8.4.js
Normal file
1549
src/Obj/Base/RoadObject/index-8.4.js
Normal file
File diff suppressed because it is too large
Load Diff
1704
src/Obj/Base/RoadObject/index-last.js
Normal file
1704
src/Obj/Base/RoadObject/index-last.js
Normal file
File diff suppressed because it is too large
Load Diff
889
src/Obj/Base/RoadObject/index-拐角连接.js
Normal file
889
src/Obj/Base/RoadObject/index-拐角连接.js
Normal file
@ -0,0 +1,889 @@
|
|||||||
|
/**
|
||||||
|
* @description 道路
|
||||||
|
*/
|
||||||
|
import Dialog from '../../Element/Dialog';
|
||||||
|
import { html } from "./_element";
|
||||||
|
import EventBinding from '../../Element/Dialog/eventBinding';
|
||||||
|
import Base from "../index";
|
||||||
|
import { syncData } from '../../../Global/MultiViewportMode'
|
||||||
|
import { setSplitDirection, syncSplitData, setActiveId } from '../../../Global/SplitScreen'
|
||||||
|
import { setActiveViewer, closeRotateAround, closeViewFollow } from '../../../Global/global'
|
||||||
|
|
||||||
|
class Road extends Base {
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @param sdk
|
||||||
|
* @description 道路
|
||||||
|
* @param options {object} 道路属性
|
||||||
|
* @param options.name=未命名对象 {string} 名称
|
||||||
|
* @param options.carRoadWidth=2 {number} 车道宽度
|
||||||
|
* @param options.sideWidth=2 {number} 人行道宽度
|
||||||
|
* @param options.positions=[] {array} 道路positions
|
||||||
|
* @param options.roadImage='' {string} 车道贴图
|
||||||
|
* @param options.sideImage='' {string} 人行道贴图
|
||||||
|
* @param Dialog {object} 弹框对象
|
||||||
|
* @param Dialog.confirmCallBack {function} 弹框确认时的回调
|
||||||
|
* */
|
||||||
|
constructor(sdk, options = {}, _Dialog = {}) {
|
||||||
|
super(sdk, options);
|
||||||
|
this.viewer = this.sdk.viewer
|
||||||
|
this.options.name = options.name || '道路'
|
||||||
|
this.options.carRoadWidth = options.carRoadWidth || 10
|
||||||
|
this.options.sideWidth = options.sideWidth || 5
|
||||||
|
this.options.positions = options.positions || []
|
||||||
|
this.options.roadImage = options.roadImage || (this.getSourceRootPath() + '/img/roadPhoto.png')
|
||||||
|
this.options.sideImage = options.sideImage || (this.getSourceRootPath() + '/img/sidePhoto.png')
|
||||||
|
this.options.show = (options.show || options.show === false) ? options.show : true
|
||||||
|
this.Dialog = _Dialog
|
||||||
|
this._EventBinding = new EventBinding()
|
||||||
|
this._elms = {};
|
||||||
|
this.positionArea = []
|
||||||
|
this.positions = []
|
||||||
|
this.lineEntity = ''
|
||||||
|
|
||||||
|
this.sdk.addIncetance(this.options.id, this)
|
||||||
|
Road.create(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建道路
|
||||||
|
static create(that) {
|
||||||
|
let positions = []
|
||||||
|
that.options.positions.forEach(v => {
|
||||||
|
positions.push(new Cesium.Cartesian3.fromDegrees(v.lng, v.lat, v.alt))
|
||||||
|
})
|
||||||
|
|
||||||
|
let area = [[], [], []]
|
||||||
|
area[1] = that.createLineBufferPolygon2(positions, that.options.carRoadWidth / 2)
|
||||||
|
area[0] = that.createLineBufferPolygonSide(area[1][2], -that.options.sideWidth)
|
||||||
|
area[2] = that.createLineBufferPolygonSide(area[1][1], that.options.sideWidth)
|
||||||
|
|
||||||
|
//判断道路边是否相交
|
||||||
|
for (let i = 0; i < area[0].length - 1; i++) {
|
||||||
|
|
||||||
|
let leftItem = area[0][i]
|
||||||
|
let leftItem2 = area[0][i + 1]
|
||||||
|
let rightItem = area[2][i]
|
||||||
|
let rightItem2 = area[2][i + 1]
|
||||||
|
let carItem = area[1][0][i]
|
||||||
|
let carItem2 = area[1][0][i + 1]
|
||||||
|
let leftLine = that.getIntersects(leftItem[1], leftItem[2], leftItem2[1], leftItem2[2])
|
||||||
|
let rightLine = that.getIntersects(rightItem[1], rightItem[2], rightItem2[1], rightItem2[2])
|
||||||
|
|
||||||
|
console.log(leftLine, 'leftLine')
|
||||||
|
if (leftLine) {//左侧相交
|
||||||
|
//获取右侧延长交点
|
||||||
|
let point1 = that.getExtendPoint(rightItem[1], rightItem[2], 1000)
|
||||||
|
let point2 = that.getExtendPoint(rightItem2[2], rightItem2[1], 1000)
|
||||||
|
let rightIntersection = that.getIntersects(rightItem[2], point1, rightItem2[1], point2)
|
||||||
|
//将其他几条边都延长
|
||||||
|
let leftLineNeiPoint = that.getExtendPoint(leftItem[0], leftItem[3], 1000)
|
||||||
|
let carLeftPoint = that.getExtendPoint(carItem[3], carItem[2], 1000)
|
||||||
|
let carRightPoint = that.getExtendPoint(carItem[0], carItem[1], 1000)
|
||||||
|
let rightLineNeiPoint = that.getExtendPoint(rightItem[0], rightItem[3], 1000)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//跟左侧里相交点
|
||||||
|
let leftLineNei = that.getIntersects(leftLine, rightIntersection, leftItem[0], leftLineNeiPoint)
|
||||||
|
//跟车道左侧相交点
|
||||||
|
let carLeft = that.getIntersects(leftLine, rightIntersection, carItem[3], carLeftPoint)
|
||||||
|
//跟车道右侧相交点
|
||||||
|
let carRight = that.getIntersects(leftLine, rightIntersection, carItem[0], carRightPoint)
|
||||||
|
let rightLineNei = that.getIntersects(leftLine, rightIntersection, rightItem[0], rightLineNeiPoint)
|
||||||
|
|
||||||
|
// let leftLineNei = that.getIntersects(leftLine, rightItem[2], leftItem[0], leftItem[3])
|
||||||
|
// let carLeft = that.getIntersects(leftLine, rightItem[2], carItem[3], carItem[2])
|
||||||
|
// let carRight = that.getIntersects(leftLine, rightItem[2], carItem[0], carItem[1])
|
||||||
|
// let rightLineNei = that.getIntersects(leftLine, rightItem[2], rightItem[0], rightItem[3])
|
||||||
|
|
||||||
|
// let leftLineNei = that.getIntersects(leftLine, intersection, leftItem[0], leftItem[3])
|
||||||
|
// //跟车道左侧相交点
|
||||||
|
// let carLeft = that.getIntersects(leftLine, intersection, carItem[3], carItem[2])
|
||||||
|
// //跟车道右侧相交点
|
||||||
|
// let carRight = that.getIntersects(leftLine, intersection, carItem[0], carItem[1])
|
||||||
|
// let rightLineNei = that.getIntersects(leftLine, intersection, rightItem[0], rightItem[3])
|
||||||
|
|
||||||
|
leftItem[2] = leftLine
|
||||||
|
leftItem[3] = leftLineNei
|
||||||
|
carItem[2] = carLeft
|
||||||
|
carItem[1] = carRight
|
||||||
|
rightItem[3] = rightLineNei
|
||||||
|
rightItem[2] = rightIntersection
|
||||||
|
console.log(leftItem, carItem, rightItem, 'leftItemleft')
|
||||||
|
|
||||||
|
|
||||||
|
//将其他几条边都延长
|
||||||
|
let leftLineNeiPoint2 = that.getExtendPoint(leftItem2[3], leftItem2[0], 1000)
|
||||||
|
let carLeftPoint2 = that.getExtendPoint(carItem2[2], carItem2[3], 1000)
|
||||||
|
let carRightPoint2 = that.getExtendPoint(carItem2[1], carItem2[0], 1000)
|
||||||
|
let rightLineNeiPoint2 = that.getExtendPoint(rightItem2[3], rightItem2[0], 1000)
|
||||||
|
|
||||||
|
// let leftLineNei2 = that.getIntersects(leftLine, rightItem2[1], leftItem2[0], leftItem2[3])
|
||||||
|
// let carLeft2 = that.getIntersects(leftLine, rightItem2[1], carItem2[3], carItem2[2])
|
||||||
|
// let carRight2 = that.getIntersects(leftLine, rightItem2[1], carItem2[0], carItem2[1])
|
||||||
|
// let rightLineNei2 = that.getIntersects(leftLine, rightItem2[1], rightItem2[0], rightItem2[3])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let leftLineNei2 = that.getIntersects(leftLine, rightIntersection, leftItem2[3], leftLineNeiPoint2)
|
||||||
|
let carLeft2 = that.getIntersects(leftLine, rightIntersection, carItem2[2], carLeftPoint2)
|
||||||
|
let carRight2 = that.getIntersects(leftLine, rightIntersection, carItem2[1], carRightPoint2)
|
||||||
|
let rightLineNei2 = that.getIntersects(leftLine, rightIntersection, rightItem2[3], rightLineNeiPoint2)
|
||||||
|
|
||||||
|
// let arr = [leftLine, rightIntersection, leftItem2[3], leftLineNeiPoint2]
|
||||||
|
// arr.forEach((item, index) => {
|
||||||
|
// that.sdk.viewer.entities.add({
|
||||||
|
// name: 'node-secondary-edit-point',
|
||||||
|
// index: i,
|
||||||
|
// position: item,
|
||||||
|
// billboard: {
|
||||||
|
// image: that.getSourceRootPath() + '/img/point.png',
|
||||||
|
// width: 15,
|
||||||
|
// height: 15,
|
||||||
|
// disableDepthTestDistance: Number.POSITIVE_INFINITY,
|
||||||
|
// color: Cesium.Color.WHITE.withAlpha(0.99)
|
||||||
|
// },
|
||||||
|
// label: {
|
||||||
|
// text: '' + index,
|
||||||
|
// pixelOffset: { x: 0, y: -20 },
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
|
||||||
|
// let leftLineNei2 = that.getIntersects(leftLine, intersection, leftItem2[0], leftItem2[3])
|
||||||
|
// //跟车道左侧相交点
|
||||||
|
// let carLeft2 = that.getIntersects(leftLine, intersection, carItem2[3], carItem2[2])
|
||||||
|
// //跟车道右侧相交点
|
||||||
|
// let carRight2 = that.getIntersects(leftLine, intersection, carItem2[0], carItem2[1])
|
||||||
|
// let rightLineNei2 = that.getIntersects(leftLine, intersection, rightItem2[0], rightItem2[3])
|
||||||
|
|
||||||
|
leftItem2[1] = leftLine
|
||||||
|
leftItem2[0] = leftLineNei2
|
||||||
|
carItem2[3] = carLeft2
|
||||||
|
carItem2[0] = carRight2
|
||||||
|
rightItem2[0] = rightLineNei2
|
||||||
|
rightItem2[1] = rightIntersection
|
||||||
|
console.log(leftItem2, carItem2, rightItem2, 'leftItem2left')
|
||||||
|
|
||||||
|
} else if (rightLine) {//右侧相交
|
||||||
|
|
||||||
|
//获取左侧延长交点
|
||||||
|
let point1 = that.getExtendPoint(leftItem[1], leftItem[2], 1000)
|
||||||
|
let point2 = that.getExtendPoint(leftItem2[2], leftItem2[1], 1000)
|
||||||
|
let rightIntersection = that.getIntersects(leftItem[2], point1, leftItem2[1], point2)
|
||||||
|
//将其他几条边都延长
|
||||||
|
let leftLineNeiPoint = that.getExtendPoint(leftItem[0], leftItem[3], 1000)
|
||||||
|
let carLeftPoint = that.getExtendPoint(carItem[3], carItem[2], 1000)
|
||||||
|
let carRightPoint = that.getExtendPoint(carItem[0], carItem[1], 1000)
|
||||||
|
let rightLineNeiPoint = that.getExtendPoint(rightItem[0], rightItem[3], 1000)
|
||||||
|
|
||||||
|
// //跟左侧里相交点
|
||||||
|
let leftLineNei = that.getIntersects(rightLine, rightIntersection, leftItem[0], leftLineNeiPoint)
|
||||||
|
//跟车道左侧相交点
|
||||||
|
let carLeft = that.getIntersects(rightLine, rightIntersection, carItem[3], carLeftPoint)
|
||||||
|
//跟车道右侧相交点
|
||||||
|
let carRight = that.getIntersects(rightLine, rightIntersection, carItem[0], carRightPoint)
|
||||||
|
let rightLineNei = that.getIntersects(rightLine, rightIntersection, rightItem[0], rightLineNeiPoint)
|
||||||
|
// //跟左侧里相交点
|
||||||
|
// let leftLineNei = that.getIntersects(rightLine, leftItem[2], leftItem[0], leftItem[3])
|
||||||
|
// //跟车道左侧相交点
|
||||||
|
// let carLeft = that.getIntersects(rightLine, leftItem[2], carItem[3], carItem[2])
|
||||||
|
// //跟车道右侧相交点
|
||||||
|
// let carRight = that.getIntersects(rightLine, leftItem[2], carItem[0], carItem[1])
|
||||||
|
// let rightLineNei = that.getIntersects(rightLine, leftItem[2], rightItem[0], rightItem[3])
|
||||||
|
|
||||||
|
|
||||||
|
leftItem[2] = rightIntersection
|
||||||
|
leftItem[3] = leftLineNei
|
||||||
|
carItem[2] = carLeft
|
||||||
|
carItem[1] = carRight
|
||||||
|
rightItem[3] = rightLineNei
|
||||||
|
rightItem[2] = rightLine
|
||||||
|
console.log(leftItem, carItem, rightItem, 'leftItemright')
|
||||||
|
|
||||||
|
//将其他几条边都延长
|
||||||
|
let leftLineNeiPoint2 = that.getExtendPoint(leftItem2[3], leftItem2[0], 1000)
|
||||||
|
let carLeftPoint2 = that.getExtendPoint(carItem2[2], carItem2[3], 1000)
|
||||||
|
let carRightPoint2 = that.getExtendPoint(carItem2[1], carItem2[0], 1000)
|
||||||
|
let rightLineNeiPoint2 = that.getExtendPoint(rightItem2[3], rightItem2[0], 1000)
|
||||||
|
|
||||||
|
let leftLineNei2 = that.getIntersects(rightLine, rightIntersection, leftItem2[3], leftLineNeiPoint2)
|
||||||
|
//跟车道左侧相交点
|
||||||
|
let carLeft2 = that.getIntersects(rightLine, rightIntersection, carItem2[2], carLeftPoint2)
|
||||||
|
//跟车道右侧相交点
|
||||||
|
let carRight2 = that.getIntersects(rightLine, rightIntersection, carItem2[1], carRightPoint2)
|
||||||
|
let rightLineNei2 = that.getIntersects(rightLine, rightIntersection, rightItem2[3], rightLineNeiPoint2)
|
||||||
|
// let leftLineNei2 = that.getIntersects(rightLine, leftItem2[1], leftItem2[0], leftItem2[3])
|
||||||
|
// //跟车道左侧相交点
|
||||||
|
// let carLeft2 = that.getIntersects(rightLine, leftItem2[1], carItem2[3], carItem2[2])
|
||||||
|
// //跟车道右侧相交点
|
||||||
|
// let carRight2 = that.getIntersects(rightLine, leftItem2[1], carItem2[0], carItem2[1])
|
||||||
|
// let rightLineNei2 = that.getIntersects(rightLine, leftItem2[1], rightItem2[0], rightItem2[3])
|
||||||
|
|
||||||
|
leftItem2[1] = rightIntersection
|
||||||
|
leftItem2[0] = leftLineNei2
|
||||||
|
carItem2[3] = carLeft2
|
||||||
|
carItem2[0] = carRight2
|
||||||
|
rightItem2[0] = rightLineNei2
|
||||||
|
rightItem2[1] = rightLine
|
||||||
|
console.log(leftItem2, carItem2, rightItem2, 'leftItem2right')
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
console.log(area[0], 'area')
|
||||||
|
|
||||||
|
if (that.viewer.entities.getById(that.options.id)) {
|
||||||
|
that.viewer.entities.getById(that.options.id)._children.forEach((item) => {
|
||||||
|
that.viewer.entities.remove(item);
|
||||||
|
});
|
||||||
|
that.viewer.entities.remove(that.viewer.entities.getById(that.options.id))
|
||||||
|
}
|
||||||
|
that.lineEntity = that.viewer.entities.add(new Cesium.Entity({ id: that.options.id, show: that.options.show }))
|
||||||
|
|
||||||
|
const myImg = new Image()
|
||||||
|
myImg.src = that.options.roadImage
|
||||||
|
myImg.onload = function () {
|
||||||
|
console.log(area[1][0], 'arr')
|
||||||
|
area[1][0].forEach((item, index) => {
|
||||||
|
that.viewer.entities.add({
|
||||||
|
// id: that.options.id,
|
||||||
|
parent: that.lineEntity,
|
||||||
|
polygon: {
|
||||||
|
hierarchy: new Cesium.PolygonHierarchy(item),
|
||||||
|
material: new Cesium.ImageMaterialProperty({
|
||||||
|
image: that.options.roadImage,
|
||||||
|
transparent: true,// 如果图片有透明部分,需要设置为 true
|
||||||
|
repeat: that.calculateTextureRepeat(item, myImg)
|
||||||
|
}),
|
||||||
|
stRotation: that.calculateRoadAngle(positions[index], positions[index + 1])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const myImg2 = new Image()
|
||||||
|
myImg2.src = that.options.sideImage
|
||||||
|
myImg2.onload = function () {
|
||||||
|
area[0].forEach((item, index) => {
|
||||||
|
that.viewer.entities.add({
|
||||||
|
parent: that.lineEntity,
|
||||||
|
polygon: {
|
||||||
|
hierarchy: new Cesium.PolygonHierarchy(item),
|
||||||
|
material: new Cesium.ImageMaterialProperty({
|
||||||
|
image: that.options.sideImage,
|
||||||
|
transparent: true,// 如果图片有透明部分,需要设置为 true
|
||||||
|
repeat: that.calculateTextureRepeat(item, myImg2)
|
||||||
|
}),
|
||||||
|
stRotation: that.calculateRoadAngle(positions[index], positions[index + 1])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
area[2].forEach((item, index) => {
|
||||||
|
that.viewer.entities.add({
|
||||||
|
polygon: {
|
||||||
|
hierarchy: new Cesium.PolygonHierarchy(item),
|
||||||
|
material: new Cesium.ImageMaterialProperty({
|
||||||
|
image: that.options.sideImage,
|
||||||
|
transparent: true,// 如果图片有透明部分,需要设置为 true
|
||||||
|
repeat: that.calculateTextureRepeat(item, myImg2)
|
||||||
|
}),
|
||||||
|
stRotation: that.calculateRoadAngle(positions[index], positions[index + 1])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
getExtendPoint(position1, position2, distance) {
|
||||||
|
// let position1 = Cesium.Cartesian3.fromDegrees(p1[0], p1[1], 0);
|
||||||
|
// let position2 = Cesium.Cartesian3.fromDegrees(p2[0], p2[1], 0);
|
||||||
|
let pot = Cesium.Cartesian3.subtract(position2, position1, new Cesium.Cartesian3());//方向
|
||||||
|
var dir = Cesium.Cartesian3.normalize(pot, new Cesium.Cartesian3());//向量归一化
|
||||||
|
|
||||||
|
var ray = new Cesium.Ray(position1, dir);
|
||||||
|
let np = Cesium.Ray.getPoint(ray, distance * 10);//计算延长点
|
||||||
|
return np
|
||||||
|
}
|
||||||
|
getArr(arr1, arr2) {
|
||||||
|
arr2 = arr2.reverse()
|
||||||
|
let polygon = []
|
||||||
|
for (let index = 0; index < arr1.length - 1; index++) {
|
||||||
|
polygon.push([arr1[index], arr1[index + 1], arr2[index + 1], arr2[index]])
|
||||||
|
}
|
||||||
|
return polygon
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateRoadAngle(startPoint, endPoint) {
|
||||||
|
// 1. 获取地表法向量
|
||||||
|
const normal = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(startPoint);
|
||||||
|
|
||||||
|
// 2. 构建精确ENU坐标系
|
||||||
|
const enuMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(startPoint, undefined, normal);
|
||||||
|
const inverseMatrix = Cesium.Matrix4.inverse(enuMatrix, new Cesium.Matrix4());
|
||||||
|
|
||||||
|
// 3. 转换终点并计算水平向量
|
||||||
|
const localEnd = Cesium.Matrix4.multiplyByPoint(inverseMatrix, endPoint, new Cesium.Cartesian3());
|
||||||
|
const horizontalVec = new Cesium.Cartesian2(localEnd.x, localEnd.y);
|
||||||
|
Cesium.Cartesian2.normalize(horizontalVec, horizontalVec);
|
||||||
|
|
||||||
|
const north = new Cesium.Cartesian2(1, 0);
|
||||||
|
|
||||||
|
const angle = Cesium.Cartesian2.angleBetween(north, horizontalVec);
|
||||||
|
const cross = Cesium.Cartesian2.cross(north, horizontalVec, new Cesium.Cartesian2());
|
||||||
|
return cross < 0 ? angle : -angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
calculatePolygonOrientation(positions) {
|
||||||
|
|
||||||
|
// 假设 position 是 Cesium.Cartesian3 对象,表示地球上的某个点
|
||||||
|
var position = positions[0]
|
||||||
|
// 获取东、北、上坐标系
|
||||||
|
var eastNorthUp = Cesium.Transforms.eastNorthUpToFixedFrame(position);
|
||||||
|
// northAxis 是北方向向量
|
||||||
|
var northAxis = eastNorthUp.getColumn(1, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(northAxis, northAxis);
|
||||||
|
|
||||||
|
const direction = Cesium.Cartesian3.subtract(positions[0], positions[1], new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(direction, direction);
|
||||||
|
|
||||||
|
|
||||||
|
const dot = Cesium.Cartesian3.dot(northAxis, direction);
|
||||||
|
const magA = Cesium.Cartesian3.magnitude(northAxis);
|
||||||
|
const magB = Cesium.Cartesian3.magnitude(direction);
|
||||||
|
return Math.acos(dot / (magA * magB));
|
||||||
|
}
|
||||||
|
calculateTextureRepeat(polygonPositions, textureSize, meterPerPixel = 0.01) {
|
||||||
|
// 验证纹理尺寸
|
||||||
|
if (!textureSize.width || !textureSize.height) {
|
||||||
|
throw new Error('Texture size must contain width and height in pixels');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建多边形几何体
|
||||||
|
const geometry = Cesium.PolygonGeometry.createGeometry(
|
||||||
|
new Cesium.PolygonGeometry({
|
||||||
|
polygonHierarchy: new Cesium.PolygonHierarchy(polygonPositions),
|
||||||
|
vertexFormat: Cesium.VertexFormat.POSITION_ONLY
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// 计算多边形面积(平方米)
|
||||||
|
let area = 0;
|
||||||
|
const indices = geometry.indices;
|
||||||
|
const positions = geometry.attributes.position.values;
|
||||||
|
for (let i = 0; i < indices.length; i += 3) {
|
||||||
|
const i0 = indices[i] * 3;
|
||||||
|
const i1 = indices[i + 1] * 3;
|
||||||
|
const i2 = indices[i + 2] * 3;
|
||||||
|
|
||||||
|
const p0 = new Cesium.Cartesian3(positions[i0], positions[i0 + 1], positions[i0 + 2]);
|
||||||
|
const p1 = new Cesium.Cartesian3(positions[i1], positions[i1 + 1], positions[i1 + 2]);
|
||||||
|
const p2 = new Cesium.Cartesian3(positions[i2], positions[i2 + 1], positions[i2 + 2]);
|
||||||
|
|
||||||
|
const cross = Cesium.Cartesian3.cross(
|
||||||
|
Cesium.Cartesian3.subtract(p1, p0, new Cesium.Cartesian3()),
|
||||||
|
Cesium.Cartesian3.subtract(p2, p0, new Cesium.Cartesian3()),
|
||||||
|
new Cesium.Cartesian3()
|
||||||
|
);
|
||||||
|
area += Cesium.Cartesian3.magnitude(cross) * 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将像素尺寸转换为实际尺寸(平方米)
|
||||||
|
const textureWidthMeters = textureSize.width * meterPerPixel;
|
||||||
|
const textureHeightMeters = textureSize.height * meterPerPixel;
|
||||||
|
const textureArea = textureWidthMeters * textureHeightMeters;
|
||||||
|
|
||||||
|
// 计算各轴向重复次数
|
||||||
|
const repeatX = Math.sqrt(area) / textureWidthMeters;
|
||||||
|
const repeatY = Math.sqrt(area) / textureHeightMeters;
|
||||||
|
|
||||||
|
return new Cesium.Cartesian2(Math.max(1, Math.ceil(repeatX)), 1.0);
|
||||||
|
}
|
||||||
|
swapLastElements(arr1, arr2) {
|
||||||
|
const last = arr1[arr1.length - 1]
|
||||||
|
const first = arr2[0]
|
||||||
|
arr1[arr1.length - 1] = first
|
||||||
|
arr2[0] = last
|
||||||
|
|
||||||
|
return [arr1, arr2];
|
||||||
|
}
|
||||||
|
createLineBufferPolygonSide(positions, width) {
|
||||||
|
let area = []
|
||||||
|
for (let i = 0; i < positions.length; i++) {
|
||||||
|
const posi = positions[i];
|
||||||
|
|
||||||
|
const dir = Cesium.Cartesian3.subtract(posi[1], posi[0], new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(dir, dir);
|
||||||
|
|
||||||
|
// 获取垂直向量(基于Z轴)
|
||||||
|
const perp = Cesium.Cartesian3.cross(dir, Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(perp, perp);
|
||||||
|
|
||||||
|
// 生成偏移向量
|
||||||
|
const offset = Cesium.Cartesian3.multiplyByScalar(perp, width, new Cesium.Cartesian3());
|
||||||
|
let point1 = Cesium.Cartesian3.add(posi[0], offset, new Cesium.Cartesian3())
|
||||||
|
let point3 = Cesium.Cartesian3.add(posi[1], offset, new Cesium.Cartesian3())
|
||||||
|
|
||||||
|
// i == positions.length - 2 ? area.push(start, point1, end, point3) : area.push(start, point1)
|
||||||
|
area.push([posi[0], point1, point3, posi[1]])
|
||||||
|
}
|
||||||
|
// let arr = []
|
||||||
|
// for (let i = 0; i < area.length - 2; i += 2) {
|
||||||
|
// arr.push([area[i], area[i + 1], area[i + 3], area[i + 2]])
|
||||||
|
// }
|
||||||
|
return area
|
||||||
|
}
|
||||||
|
createLineBufferPolygon2(positions, width) {
|
||||||
|
let area = []
|
||||||
|
let leftPositions = [];
|
||||||
|
let rightPositions = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < positions.length - 1; i++) {
|
||||||
|
const start = positions[i];
|
||||||
|
// const end = positions[i + 1] || positions[i - 1];
|
||||||
|
const end = positions[i + 1];
|
||||||
|
|
||||||
|
const dir = Cesium.Cartesian3.subtract(end, start, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(dir, dir);
|
||||||
|
|
||||||
|
// 获取垂直向量(基于Z轴)
|
||||||
|
const perp = Cesium.Cartesian3.cross(dir, Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(perp, perp);
|
||||||
|
|
||||||
|
const dir2 = Cesium.Cartesian3.subtract(start, end, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(dir2, dir2);
|
||||||
|
|
||||||
|
// 获取垂直向量(基于Z轴)
|
||||||
|
const perp2 = Cesium.Cartesian3.cross(dir2, Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(perp2, perp2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 生成偏移向量
|
||||||
|
const offset = Cesium.Cartesian3.multiplyByScalar(perp, width, new Cesium.Cartesian3());
|
||||||
|
const offset2 = Cesium.Cartesian3.multiplyByScalar(perp, -width, new Cesium.Cartesian3());
|
||||||
|
|
||||||
|
const offsetEnd = Cesium.Cartesian3.multiplyByScalar(perp2, -width, new Cesium.Cartesian3());
|
||||||
|
const offsetEnd2 = Cesium.Cartesian3.multiplyByScalar(perp2, width, new Cesium.Cartesian3());
|
||||||
|
|
||||||
|
let point1 = Cesium.Cartesian3.add(start, offset, new Cesium.Cartesian3())
|
||||||
|
let point2 = Cesium.Cartesian3.add(start, offset2, new Cesium.Cartesian3())
|
||||||
|
let point3 = Cesium.Cartesian3.add(end, offsetEnd, new Cesium.Cartesian3())
|
||||||
|
let point4 = Cesium.Cartesian3.add(end, offsetEnd2, new Cesium.Cartesian3())
|
||||||
|
|
||||||
|
area.push([point1, point3, point4, point2])
|
||||||
|
|
||||||
|
rightPositions.push([point1, point3])
|
||||||
|
leftPositions.push([point2, point4])
|
||||||
|
|
||||||
|
// if (i == positions.length - 2) {
|
||||||
|
// area.push(point1, point2, point3, point4)
|
||||||
|
// rightPositions.push(point1)
|
||||||
|
// leftPositions.push(point2)
|
||||||
|
// leftPositions.push(point4)
|
||||||
|
// rightPositions.push(point3)
|
||||||
|
// } else {
|
||||||
|
// area.push(point1, point2)
|
||||||
|
// rightPositions.push(point1)
|
||||||
|
// leftPositions.push(point2)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// let arr = []
|
||||||
|
// for (let i = 0; i < area.length - 2; i += 2) {
|
||||||
|
// arr.push([area[i], area[i + 1], area[i + 3], area[i + 2]])
|
||||||
|
// }
|
||||||
|
console.log(area, rightPositions, 'rightPositions')
|
||||||
|
let that = this
|
||||||
|
// return [arr, rightPositions, leftPositions]
|
||||||
|
return [area, rightPositions, leftPositions]
|
||||||
|
}
|
||||||
|
getIntersects(point1, point2, point3, point4) {
|
||||||
|
let carPoint1 = this.getLonLat(point1)
|
||||||
|
let carPoint2 = this.getLonLat(point2)
|
||||||
|
let carPoint3 = this.getLonLat(point3)
|
||||||
|
let carPoint4 = this.getLonLat(point4)
|
||||||
|
var line1 = turf.lineString([
|
||||||
|
[carPoint1.lon, carPoint1.lat],
|
||||||
|
[carPoint2.lon, carPoint2.lat]
|
||||||
|
]);
|
||||||
|
var line2 = turf.lineString([
|
||||||
|
[carPoint3.lon, carPoint3.lat],
|
||||||
|
[carPoint4.lon, carPoint4.lat]
|
||||||
|
]);
|
||||||
|
var intersects = turf.lineIntersect(line1, line2);
|
||||||
|
if (intersects.features.length > 0) {
|
||||||
|
console.log(intersects.features, 'ooooo')
|
||||||
|
return Cesium.Cartesian3.fromDegrees(intersects.features[0].geometry.coordinates[0], intersects.features[0].geometry.coordinates[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getLonLat(point) {
|
||||||
|
let pointDe = Cesium.Cartographic.fromCartesian(point)
|
||||||
|
const longitude = Cesium.Math.toDegrees(pointDe.longitude);
|
||||||
|
const latitude = Cesium.Math.toDegrees(pointDe.latitude);
|
||||||
|
return { lon: longitude, lat: latitude }
|
||||||
|
|
||||||
|
}
|
||||||
|
createLineBufferPolygon(viewer, positions, width) {
|
||||||
|
// 计算每个线段的左右偏移点
|
||||||
|
const leftPositions = [];
|
||||||
|
const rightPositions = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < positions.length; i++) {
|
||||||
|
const start = positions[i];
|
||||||
|
const end = positions[i + 1] || positions[i - 1];
|
||||||
|
|
||||||
|
// 计算线段方向向量
|
||||||
|
const direction = Cesium.Cartesian3.subtract(end, start, new Cesium.Cartesian3());
|
||||||
|
// const direction = Cesium.Cartesian3.subtract(start, end, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(direction, direction);
|
||||||
|
|
||||||
|
// 计算垂直向量(使用上向量叉积)
|
||||||
|
const up = Cesium.Cartesian3.UNIT_Z;
|
||||||
|
const perpendicular = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(perpendicular, perpendicular);
|
||||||
|
|
||||||
|
// 计算左右偏移点
|
||||||
|
const leftOffset = Cesium.Cartesian3.multiplyByScalar(
|
||||||
|
perpendicular,
|
||||||
|
width,
|
||||||
|
new Cesium.Cartesian3()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (width > 0) {
|
||||||
|
rightPositions.unshift(Cesium.Cartesian3.add(start, leftOffset, new Cesium.Cartesian3()));
|
||||||
|
} else if (width < 0) {
|
||||||
|
rightPositions.push(Cesium.Cartesian3.add(start, leftOffset, new Cesium.Cartesian3()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return rightPositions
|
||||||
|
}
|
||||||
|
//计算角度
|
||||||
|
calculateAangle(arr) {
|
||||||
|
// let fromDegreesArray = that.calSector(that.options.center, that.options.radius, that.options.startAngle, that.options.endAngle, 360, true)
|
||||||
|
|
||||||
|
function getAangle(start, end) {
|
||||||
|
let rad = Math.PI / 180,
|
||||||
|
lat1 = start.y * rad,
|
||||||
|
lat2 = end.y * rad,
|
||||||
|
lon1 = start.x * rad,
|
||||||
|
lon2 = end.x * rad;
|
||||||
|
const a = Math.sin(lon2 - lon1) * Math.cos(lat2);
|
||||||
|
const b =
|
||||||
|
Math.cos(lat1) * Math.sin(lat2) -
|
||||||
|
Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1);
|
||||||
|
const radians = Math.atan2(a, b)
|
||||||
|
const degrees = radians % (2 * Math.PI);
|
||||||
|
let bearing = 450 - ((degrees * 180) / Math.PI < 0
|
||||||
|
? 360 + (degrees * 180) / Math.PI
|
||||||
|
: (degrees * 180) / Math.PI) - 90;
|
||||||
|
return 360 - (bearing % 360)
|
||||||
|
}
|
||||||
|
|
||||||
|
let center = arr[0]
|
||||||
|
let pos84_1 = arr[1]
|
||||||
|
let pos84_2 = arr[2]
|
||||||
|
|
||||||
|
let start = { x: center.lng, y: center.lat }
|
||||||
|
let end1 = { x: pos84_1.lng, y: pos84_1.lat }
|
||||||
|
let end2 = { x: pos84_2.lng, y: pos84_2.lat }
|
||||||
|
|
||||||
|
let angle1 = getAangle(start, end1)
|
||||||
|
let angle2 = getAangle(start, end2)
|
||||||
|
|
||||||
|
return {
|
||||||
|
angle1,
|
||||||
|
angle2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get carRoadWidth() {
|
||||||
|
return this.options.carRoadWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
set carRoadWidth(v) {
|
||||||
|
this.options.carRoadWidth = v
|
||||||
|
Road.create(this)
|
||||||
|
|
||||||
|
}
|
||||||
|
get sideWidth() {
|
||||||
|
return this.options.sideWidth
|
||||||
|
}
|
||||||
|
set sideWidth(v) {
|
||||||
|
this.options.sideWidth = v
|
||||||
|
Road.create(this)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 编辑框
|
||||||
|
* @param state=false {boolean} 状态: true打开, false关闭
|
||||||
|
*/
|
||||||
|
async edit(state = false) {
|
||||||
|
let _this = this
|
||||||
|
this.originalOptions = this.deepCopyObj(this.options)
|
||||||
|
|
||||||
|
if (this._DialogObject && this._DialogObject.close) {
|
||||||
|
this._DialogObject.close()
|
||||||
|
this._DialogObject = null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state) {
|
||||||
|
this._DialogObject = await new Dialog(this.sdk, this.originalOptions, {
|
||||||
|
title: '道路属性', left: '180px', top: '100px',
|
||||||
|
confirmCallBack: (options) => {
|
||||||
|
this.name = this.name.trim()
|
||||||
|
if (!this.name) {
|
||||||
|
this.name = '道路'
|
||||||
|
}
|
||||||
|
this.originalOptions = this.deepCopyObj(this.options)
|
||||||
|
this._DialogObject.close()
|
||||||
|
this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions)
|
||||||
|
syncData(this.sdk, this.options.id)
|
||||||
|
syncSplitData(this.sdk, this.options.id)
|
||||||
|
},
|
||||||
|
resetCallBack: () => {
|
||||||
|
this.reset()
|
||||||
|
this.Dialog.resetCallBack && this.Dialog.resetCallBack()
|
||||||
|
},
|
||||||
|
closeCallBack: () => {
|
||||||
|
this.reset()
|
||||||
|
this.Dialog.closeCallBack && this.Dialog.closeCallBack()
|
||||||
|
},
|
||||||
|
showCallBack: (show) => {
|
||||||
|
this.show = show
|
||||||
|
this.Dialog.showCallBack && this.Dialog.showCallBack()
|
||||||
|
}
|
||||||
|
}, true)
|
||||||
|
this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' road-surface'
|
||||||
|
let contentElm = document.createElement('div');
|
||||||
|
contentElm.innerHTML = html()
|
||||||
|
this._DialogObject.contentAppChild(contentElm)
|
||||||
|
|
||||||
|
|
||||||
|
// 下拉选项
|
||||||
|
// let heightModeData = [
|
||||||
|
// {
|
||||||
|
// name: '海拔高度',
|
||||||
|
// value: '海拔高度',
|
||||||
|
// key: '0',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '相对地表',
|
||||||
|
// value: '相对地表',
|
||||||
|
// key: '1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '依附模型',
|
||||||
|
// value: '依附模型',
|
||||||
|
// key: '2',
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
// let heightModeObject = legp(
|
||||||
|
// this._DialogObject._element.content.getElementsByClassName(
|
||||||
|
// 'road-box'
|
||||||
|
// )[0],
|
||||||
|
// '.road-type'
|
||||||
|
// )
|
||||||
|
// if (heightModeObject) {
|
||||||
|
// heightModeObject.legp_search(heightModeData)
|
||||||
|
// let heightModeDataLegpElm = this._DialogObject._element.content
|
||||||
|
// .getElementsByClassName('road-type')[0]
|
||||||
|
// .getElementsByTagName('input')[0]
|
||||||
|
// for (let i = 0; i < heightModeData.length; i++) {
|
||||||
|
// if (heightModeData[i].key == this.heightMode) {
|
||||||
|
// heightModeDataLegpElm.value = heightModeData[i].value
|
||||||
|
// heightModeObject.legp_searchActive(
|
||||||
|
// heightModeData[i].value
|
||||||
|
// )
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// heightModeDataLegpElm.addEventListener('input', () => {
|
||||||
|
// for (let i = 0; i < heightModeData.length; i++) {
|
||||||
|
// if (heightModeData[i].value === heightModeDataLegpElm.value) {
|
||||||
|
// this.heightMode = heightModeData[i].key
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
|
||||||
|
|
||||||
|
// this._elms.height = heightElm
|
||||||
|
// this._elms.heightBox = heightBoxElm
|
||||||
|
// this._elms.heightMode = heightModeDataLegpElm
|
||||||
|
// this._elms.heightConfirm = heightConfirmElm
|
||||||
|
// this._elms.heightModeObject = heightModeObject
|
||||||
|
|
||||||
|
// heightConfirmElm.addEventListener('click', () => {
|
||||||
|
// this.positionEditing = false
|
||||||
|
// for (let i = 0; i < this.options.positions.length; i++) {
|
||||||
|
// this.options.positions[i].alt = Number((this.options.positions[i].alt + Number(heightElm.value)).toFixed(2))
|
||||||
|
// this._elms.alt[i].innerHTML = this.options.positions[i].alt
|
||||||
|
// }
|
||||||
|
// let fromDegreesArray = this.renewPositions(this.options.positions)
|
||||||
|
// this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(
|
||||||
|
// fromDegreesArray
|
||||||
|
// )
|
||||||
|
|
||||||
|
// this.positionEditing = false
|
||||||
|
// PolylineObject.closeNodeEdit(this)
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let all_elm = contentElm.getElementsByTagName("*")
|
||||||
|
this._EventBinding.on(this, all_elm)
|
||||||
|
this._elms = this._EventBinding.element
|
||||||
|
} else {
|
||||||
|
// if (this._element_style) {
|
||||||
|
// document.getElementsByTagName('head')[0].removeChild(this._element_style)
|
||||||
|
// this._element_style = null
|
||||||
|
// }
|
||||||
|
// if (this._DialogObject && this._DialogObject.remove) {
|
||||||
|
// this._DialogObject.remove()
|
||||||
|
// this._DialogObject = null
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reset() {
|
||||||
|
if (!this.viewer.entities.getById(this.options.id)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.name = this.originalOptions.name
|
||||||
|
this.carRoadWidth = this.originalOptions.carRoadWidth
|
||||||
|
this.sideWidth = this.originalOptions.sideWidth
|
||||||
|
this.positions = this.originalOptions.positions
|
||||||
|
this.roadImage = this.originalOptions.roadImage
|
||||||
|
this.sideImage = this.originalOptions.sideImage
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 飞到对应实体
|
||||||
|
*/
|
||||||
|
async flyTo(options = {}) {
|
||||||
|
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 = { lng: 0, lat: 0 }
|
||||||
|
if (this.options.position) {
|
||||||
|
position = { ...this.options.position }
|
||||||
|
}
|
||||||
|
else if (this.options.positions) {
|
||||||
|
position = { ...this.options.positions[0] }
|
||||||
|
}
|
||||||
|
else if (this.options.center) {
|
||||||
|
position = { ...this.options.center }
|
||||||
|
}
|
||||||
|
else if (this.options.start) {
|
||||||
|
position = { ...this.options.start }
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.options.hasOwnProperty('lng')) {
|
||||||
|
position.lng = this.options.lng
|
||||||
|
}
|
||||||
|
if (this.options.hasOwnProperty('lat')) {
|
||||||
|
position.lat = this.options.lat
|
||||||
|
}
|
||||||
|
if (this.options.hasOwnProperty('alt')) {
|
||||||
|
position.alt = this.options.alt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 如果没有高度值,则获取紧贴高度计算
|
||||||
|
// 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 positionArray = []
|
||||||
|
for (let i = 0; i < this.positions.length; i++) {
|
||||||
|
let a = Cesium.Cartesian3.fromDegrees(
|
||||||
|
this.positions[i][0],
|
||||||
|
this.positions[i][1],
|
||||||
|
this.options.height + this.options.heightDifference / 2
|
||||||
|
)
|
||||||
|
positionArray.push(a.x, a.y, a.z)
|
||||||
|
}
|
||||||
|
let BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray)
|
||||||
|
this.viewer.camera.flyToBoundingSphere(BoundingSphere, {
|
||||||
|
offset: {
|
||||||
|
heading: Cesium.Math.toRadians(0.0),
|
||||||
|
pitch: Cesium.Math.toRadians(-20.0),
|
||||||
|
roll: Cesium.Math.toRadians(0.0)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getSphere() {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
// entity没有加载完成时 state 不会等于0 所以设置定时器直到获取到为止
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
const sphere = new Cesium.BoundingSphere()
|
||||||
|
const state = this.sdk.viewer._dataSourceDisplay.getBoundingSphere(
|
||||||
|
this.viewer.entities.getById(this.options.id),
|
||||||
|
false,
|
||||||
|
sphere
|
||||||
|
)
|
||||||
|
if (state === Cesium.BoundingSphereState.DONE) {
|
||||||
|
clearInterval(interval)
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
*/
|
||||||
|
async remove() {
|
||||||
|
this.positions = []
|
||||||
|
this.lineEntity = null
|
||||||
|
|
||||||
|
if (this.viewer.entities.getById(this.options.id)) {
|
||||||
|
this.viewer.entities.getById(this.options.id)._children.forEach((item) => {
|
||||||
|
this.viewer.entities.remove(item);
|
||||||
|
});
|
||||||
|
this.viewer.entities.remove(this.viewer.entities.getById(this.options.id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._DialogObject && !this._DialogObject.isDestroy) {
|
||||||
|
this._DialogObject.close()
|
||||||
|
this._DialogObject = null
|
||||||
|
}
|
||||||
|
await this.sdk.removeIncetance(this.options.id)
|
||||||
|
await syncData(this.sdk, this.options.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
flicker() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Road
|
615
src/Obj/Base/RoadObject/index-直接连接.js
Normal file
615
src/Obj/Base/RoadObject/index-直接连接.js
Normal file
@ -0,0 +1,615 @@
|
|||||||
|
/**
|
||||||
|
* @description 道路
|
||||||
|
*/
|
||||||
|
import Dialog from '../../Element/Dialog';
|
||||||
|
import { html } from "./_element";
|
||||||
|
import EventBinding from '../../Element/Dialog/eventBinding';
|
||||||
|
import Base from "../index";
|
||||||
|
import { syncData } from '../../../Global/MultiViewportMode'
|
||||||
|
import { setSplitDirection, syncSplitData, setActiveId } from '../../../Global/SplitScreen'
|
||||||
|
import { setActiveViewer, closeRotateAround, closeViewFollow } from '../../../Global/global'
|
||||||
|
|
||||||
|
class Road extends Base {
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @param sdk
|
||||||
|
* @description 道路
|
||||||
|
* @param options {object} 道路属性
|
||||||
|
* @param options.name=未命名对象 {string} 名称
|
||||||
|
* @param options.carRoadWidth=2 {number} 车道宽度
|
||||||
|
* @param options.sideWidth=2 {number} 人行道宽度
|
||||||
|
* @param options.positions=[] {array} 道路positions
|
||||||
|
* @param options.roadImage='' {string} 车道贴图
|
||||||
|
* @param options.sideImage='' {string} 人行道贴图
|
||||||
|
* @param Dialog {object} 弹框对象
|
||||||
|
* @param Dialog.confirmCallBack {function} 弹框确认时的回调
|
||||||
|
* */
|
||||||
|
constructor(sdk, options = {}, _Dialog = {}) {
|
||||||
|
super(sdk, options);
|
||||||
|
this.viewer = this.sdk.viewer
|
||||||
|
this.options.name = options.name || '道路'
|
||||||
|
this.options.carRoadWidth = options.carRoadWidth || 10
|
||||||
|
this.options.sideWidth = options.sideWidth || 5
|
||||||
|
this.options.positions = options.positions || []
|
||||||
|
this.options.roadImage = options.roadImage || (this.getSourceRootPath() + '/img/roadPhoto.png')
|
||||||
|
this.options.sideImage = options.sideImage || (this.getSourceRootPath() + '/img/sidePhoto.png')
|
||||||
|
this.options.show = (options.show || options.show === false) ? options.show : true
|
||||||
|
this.Dialog = _Dialog
|
||||||
|
this._EventBinding = new EventBinding()
|
||||||
|
this._elms = {};
|
||||||
|
this.positionArea = []
|
||||||
|
this.positions = []
|
||||||
|
this.lineEntity = ''
|
||||||
|
|
||||||
|
this.sdk.addIncetance(this.options.id, this)
|
||||||
|
Road.create(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建道路
|
||||||
|
static create(that) {
|
||||||
|
let positions = []
|
||||||
|
that.options.positions.forEach(v => {
|
||||||
|
positions.push(new Cesium.Cartesian3.fromDegrees(v.lng, v.lat, v.alt))
|
||||||
|
})
|
||||||
|
|
||||||
|
let area = [[], [], []]
|
||||||
|
area[1] = that.createLineBufferPolygon2(positions, that.options.carRoadWidth / 2)
|
||||||
|
area[0] = that.createLineBufferPolygonSide(area[1][2], -that.options.sideWidth)
|
||||||
|
area[2] = that.createLineBufferPolygonSide(area[1][1], that.options.sideWidth)
|
||||||
|
|
||||||
|
if (that.viewer.entities.getById(that.options.id)) {
|
||||||
|
that.viewer.entities.getById(that.options.id)._children.forEach((item) => {
|
||||||
|
that.viewer.entities.remove(item);
|
||||||
|
});
|
||||||
|
that.viewer.entities.remove(that.viewer.entities.getById(that.options.id))
|
||||||
|
}
|
||||||
|
that.lineEntity = that.viewer.entities.add(new Cesium.Entity({ id: that.options.id, show: that.options.show }))
|
||||||
|
|
||||||
|
const myImg = new Image()
|
||||||
|
myImg.src = that.options.roadImage
|
||||||
|
myImg.onload = function () {
|
||||||
|
area[1][0].forEach((item, index) => {
|
||||||
|
that.viewer.entities.add({
|
||||||
|
// id: that.options.id,
|
||||||
|
parent: that.lineEntity,
|
||||||
|
polygon: {
|
||||||
|
hierarchy: new Cesium.PolygonHierarchy(item),
|
||||||
|
material: new Cesium.ImageMaterialProperty({
|
||||||
|
image: that.options.roadImage,
|
||||||
|
transparent: true,// 如果图片有透明部分,需要设置为 true
|
||||||
|
repeat: that.calculateTextureRepeat(item, myImg)
|
||||||
|
}),
|
||||||
|
stRotation: that.calculateRoadAngle(positions[index], positions[index + 1])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const myImg2 = new Image()
|
||||||
|
myImg2.src = that.options.sideImage
|
||||||
|
myImg2.onload = function () {
|
||||||
|
area[0].forEach((item, index) => {
|
||||||
|
that.viewer.entities.add({
|
||||||
|
parent: that.lineEntity,
|
||||||
|
polygon: {
|
||||||
|
hierarchy: new Cesium.PolygonHierarchy(item),
|
||||||
|
material: new Cesium.ImageMaterialProperty({
|
||||||
|
image: that.options.sideImage,
|
||||||
|
transparent: true,// 如果图片有透明部分,需要设置为 true
|
||||||
|
repeat: that.calculateTextureRepeat(item, myImg2)
|
||||||
|
}),
|
||||||
|
stRotation: that.calculateRoadAngle(positions[index], positions[index + 1])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
area[2].forEach((item, index) => {
|
||||||
|
that.viewer.entities.add({
|
||||||
|
polygon: {
|
||||||
|
hierarchy: new Cesium.PolygonHierarchy(item),
|
||||||
|
material: new Cesium.ImageMaterialProperty({
|
||||||
|
image: that.options.sideImage,
|
||||||
|
transparent: true,// 如果图片有透明部分,需要设置为 true
|
||||||
|
repeat: that.calculateTextureRepeat(item, myImg2)
|
||||||
|
}),
|
||||||
|
stRotation: that.calculateRoadAngle(positions[index], positions[index + 1])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
getArr(arr1, arr2) {
|
||||||
|
arr2 = arr2.reverse()
|
||||||
|
let polygon = []
|
||||||
|
for (let index = 0; index < arr1.length - 1; index++) {
|
||||||
|
polygon.push([arr1[index], arr1[index + 1], arr2[index + 1], arr2[index]])
|
||||||
|
}
|
||||||
|
return polygon
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateRoadAngle(startPoint, endPoint) {
|
||||||
|
// 1. 获取地表法向量
|
||||||
|
const normal = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(startPoint);
|
||||||
|
|
||||||
|
// 2. 构建精确ENU坐标系
|
||||||
|
const enuMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(startPoint, undefined, normal);
|
||||||
|
const inverseMatrix = Cesium.Matrix4.inverse(enuMatrix, new Cesium.Matrix4());
|
||||||
|
|
||||||
|
// 3. 转换终点并计算水平向量
|
||||||
|
const localEnd = Cesium.Matrix4.multiplyByPoint(inverseMatrix, endPoint, new Cesium.Cartesian3());
|
||||||
|
const horizontalVec = new Cesium.Cartesian2(localEnd.x, localEnd.y);
|
||||||
|
Cesium.Cartesian2.normalize(horizontalVec, horizontalVec);
|
||||||
|
|
||||||
|
const north = new Cesium.Cartesian2(1, 0);
|
||||||
|
|
||||||
|
const angle = Cesium.Cartesian2.angleBetween(north, horizontalVec);
|
||||||
|
const cross = Cesium.Cartesian2.cross(north, horizontalVec, new Cesium.Cartesian2());
|
||||||
|
return cross < 0 ? angle : -angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
calculatePolygonOrientation(positions) {
|
||||||
|
|
||||||
|
// 假设 position 是 Cesium.Cartesian3 对象,表示地球上的某个点
|
||||||
|
var position = positions[0]
|
||||||
|
// 获取东、北、上坐标系
|
||||||
|
var eastNorthUp = Cesium.Transforms.eastNorthUpToFixedFrame(position);
|
||||||
|
// northAxis 是北方向向量
|
||||||
|
var northAxis = eastNorthUp.getColumn(1, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(northAxis, northAxis);
|
||||||
|
|
||||||
|
const direction = Cesium.Cartesian3.subtract(positions[0], positions[1], new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(direction, direction);
|
||||||
|
|
||||||
|
|
||||||
|
const dot = Cesium.Cartesian3.dot(northAxis, direction);
|
||||||
|
const magA = Cesium.Cartesian3.magnitude(northAxis);
|
||||||
|
const magB = Cesium.Cartesian3.magnitude(direction);
|
||||||
|
return Math.acos(dot / (magA * magB));
|
||||||
|
}
|
||||||
|
calculateTextureRepeat(polygonPositions, textureSize, meterPerPixel = 0.01) {
|
||||||
|
// 验证纹理尺寸
|
||||||
|
if (!textureSize.width || !textureSize.height) {
|
||||||
|
throw new Error('Texture size must contain width and height in pixels');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建多边形几何体
|
||||||
|
const geometry = Cesium.PolygonGeometry.createGeometry(
|
||||||
|
new Cesium.PolygonGeometry({
|
||||||
|
polygonHierarchy: new Cesium.PolygonHierarchy(polygonPositions),
|
||||||
|
vertexFormat: Cesium.VertexFormat.POSITION_ONLY
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// 计算多边形面积(平方米)
|
||||||
|
let area = 0;
|
||||||
|
const indices = geometry.indices;
|
||||||
|
const positions = geometry.attributes.position.values;
|
||||||
|
for (let i = 0; i < indices.length; i += 3) {
|
||||||
|
const i0 = indices[i] * 3;
|
||||||
|
const i1 = indices[i + 1] * 3;
|
||||||
|
const i2 = indices[i + 2] * 3;
|
||||||
|
|
||||||
|
const p0 = new Cesium.Cartesian3(positions[i0], positions[i0 + 1], positions[i0 + 2]);
|
||||||
|
const p1 = new Cesium.Cartesian3(positions[i1], positions[i1 + 1], positions[i1 + 2]);
|
||||||
|
const p2 = new Cesium.Cartesian3(positions[i2], positions[i2 + 1], positions[i2 + 2]);
|
||||||
|
|
||||||
|
const cross = Cesium.Cartesian3.cross(
|
||||||
|
Cesium.Cartesian3.subtract(p1, p0, new Cesium.Cartesian3()),
|
||||||
|
Cesium.Cartesian3.subtract(p2, p0, new Cesium.Cartesian3()),
|
||||||
|
new Cesium.Cartesian3()
|
||||||
|
);
|
||||||
|
area += Cesium.Cartesian3.magnitude(cross) * 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将像素尺寸转换为实际尺寸(平方米)
|
||||||
|
const textureWidthMeters = textureSize.width * meterPerPixel;
|
||||||
|
const textureHeightMeters = textureSize.height * meterPerPixel;
|
||||||
|
const textureArea = textureWidthMeters * textureHeightMeters;
|
||||||
|
|
||||||
|
// 计算各轴向重复次数
|
||||||
|
const repeatX = Math.sqrt(area) / textureWidthMeters;
|
||||||
|
const repeatY = Math.sqrt(area) / textureHeightMeters;
|
||||||
|
|
||||||
|
return new Cesium.Cartesian2(Math.max(1, Math.ceil(repeatX)), 1.0);
|
||||||
|
}
|
||||||
|
swapLastElements(arr1, arr2) {
|
||||||
|
const last = arr1[arr1.length - 1]
|
||||||
|
const first = arr2[0]
|
||||||
|
arr1[arr1.length - 1] = first
|
||||||
|
arr2[0] = last
|
||||||
|
|
||||||
|
return [arr1, arr2];
|
||||||
|
}
|
||||||
|
createLineBufferPolygonSide(positions, width) {
|
||||||
|
let area = []
|
||||||
|
for (let i = 0; i < positions.length - 1; i++) {
|
||||||
|
const start = positions[i];
|
||||||
|
const end = positions[i + 1];
|
||||||
|
|
||||||
|
const dir = Cesium.Cartesian3.subtract(end, start, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(dir, dir);
|
||||||
|
|
||||||
|
// 获取垂直向量(基于Z轴)
|
||||||
|
const perp = Cesium.Cartesian3.cross(dir, Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(perp, perp);
|
||||||
|
|
||||||
|
// 生成偏移向量
|
||||||
|
const offset = Cesium.Cartesian3.multiplyByScalar(perp, width, new Cesium.Cartesian3());
|
||||||
|
let point1 = Cesium.Cartesian3.add(start, offset, new Cesium.Cartesian3())
|
||||||
|
let point3 = Cesium.Cartesian3.add(end, offset, new Cesium.Cartesian3())
|
||||||
|
|
||||||
|
i == positions.length - 2 ? area.push(start, point1, end, point3) : area.push(start, point1)
|
||||||
|
}
|
||||||
|
let arr = []
|
||||||
|
for (let i = 0; i < area.length - 2; i += 2) {
|
||||||
|
arr.push([area[i], area[i + 1], area[i + 3], area[i + 2]])
|
||||||
|
}
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
createLineBufferPolygon2(positions, width) {
|
||||||
|
let area = []
|
||||||
|
let leftPositions = [];
|
||||||
|
let rightPositions = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < positions.length - 1; i++) {
|
||||||
|
const start = positions[i];
|
||||||
|
// const end = positions[i + 1] || positions[i - 1];
|
||||||
|
const end = positions[i + 1];
|
||||||
|
|
||||||
|
const dir = Cesium.Cartesian3.subtract(end, start, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(dir, dir);
|
||||||
|
|
||||||
|
// 获取垂直向量(基于Z轴)
|
||||||
|
const perp = Cesium.Cartesian3.cross(dir, Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(perp, perp);
|
||||||
|
|
||||||
|
|
||||||
|
// 生成偏移向量
|
||||||
|
const offset = Cesium.Cartesian3.multiplyByScalar(perp, width, new Cesium.Cartesian3());
|
||||||
|
const offset2 = Cesium.Cartesian3.multiplyByScalar(perp, -width, new Cesium.Cartesian3());
|
||||||
|
let point1 = Cesium.Cartesian3.add(start, offset, new Cesium.Cartesian3())
|
||||||
|
let point2 = Cesium.Cartesian3.add(start, offset2, new Cesium.Cartesian3())
|
||||||
|
let point3 = Cesium.Cartesian3.add(end, offset, new Cesium.Cartesian3())
|
||||||
|
let point4 = Cesium.Cartesian3.add(end, offset2, new Cesium.Cartesian3())
|
||||||
|
|
||||||
|
if (i == positions.length - 2) {
|
||||||
|
area.push(point1, point2, point3, point4)
|
||||||
|
rightPositions.push(point1)
|
||||||
|
leftPositions.push(point2)
|
||||||
|
leftPositions.push(point4)
|
||||||
|
rightPositions.push(point3)
|
||||||
|
} else {
|
||||||
|
area.push(point1, point2)
|
||||||
|
rightPositions.push(point1)
|
||||||
|
leftPositions.push(point2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let arr = []
|
||||||
|
for (let i = 0; i < area.length - 2; i += 2) {
|
||||||
|
arr.push([area[i], area[i + 1], area[i + 3], area[i + 2]])
|
||||||
|
}
|
||||||
|
return [arr, rightPositions, leftPositions]
|
||||||
|
}
|
||||||
|
createLineBufferPolygon(viewer, positions, width) {
|
||||||
|
// 计算每个线段的左右偏移点
|
||||||
|
const leftPositions = [];
|
||||||
|
const rightPositions = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < positions.length; i++) {
|
||||||
|
const start = positions[i];
|
||||||
|
const end = positions[i + 1] || positions[i - 1];
|
||||||
|
|
||||||
|
// 计算线段方向向量
|
||||||
|
const direction = Cesium.Cartesian3.subtract(end, start, new Cesium.Cartesian3());
|
||||||
|
// const direction = Cesium.Cartesian3.subtract(start, end, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(direction, direction);
|
||||||
|
|
||||||
|
// 计算垂直向量(使用上向量叉积)
|
||||||
|
const up = Cesium.Cartesian3.UNIT_Z;
|
||||||
|
const perpendicular = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3());
|
||||||
|
Cesium.Cartesian3.normalize(perpendicular, perpendicular);
|
||||||
|
|
||||||
|
// 计算左右偏移点
|
||||||
|
const leftOffset = Cesium.Cartesian3.multiplyByScalar(
|
||||||
|
perpendicular,
|
||||||
|
width,
|
||||||
|
new Cesium.Cartesian3()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (width > 0) {
|
||||||
|
rightPositions.unshift(Cesium.Cartesian3.add(start, leftOffset, new Cesium.Cartesian3()));
|
||||||
|
} else if (width < 0) {
|
||||||
|
rightPositions.push(Cesium.Cartesian3.add(start, leftOffset, new Cesium.Cartesian3()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return rightPositions
|
||||||
|
}
|
||||||
|
|
||||||
|
get carRoadWidth() {
|
||||||
|
return this.options.carRoadWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
set carRoadWidth(v) {
|
||||||
|
this.options.carRoadWidth = v
|
||||||
|
Road.create(this)
|
||||||
|
|
||||||
|
}
|
||||||
|
get sideWidth() {
|
||||||
|
return this.options.sideWidth
|
||||||
|
}
|
||||||
|
set sideWidth(v) {
|
||||||
|
this.options.sideWidth = v
|
||||||
|
Road.create(this)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @description 编辑框
|
||||||
|
* @param state=false {boolean} 状态: true打开, false关闭
|
||||||
|
*/
|
||||||
|
async edit(state = false) {
|
||||||
|
let _this = this
|
||||||
|
this.originalOptions = this.deepCopyObj(this.options)
|
||||||
|
|
||||||
|
if (this._DialogObject && this._DialogObject.close) {
|
||||||
|
this._DialogObject.close()
|
||||||
|
this._DialogObject = null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state) {
|
||||||
|
this._DialogObject = await new Dialog(this.sdk, this.originalOptions, {
|
||||||
|
title: '道路属性', left: '180px', top: '100px',
|
||||||
|
confirmCallBack: (options) => {
|
||||||
|
this.name = this.name.trim()
|
||||||
|
if (!this.name) {
|
||||||
|
this.name = '道路'
|
||||||
|
}
|
||||||
|
this.originalOptions = this.deepCopyObj(this.options)
|
||||||
|
this._DialogObject.close()
|
||||||
|
this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions)
|
||||||
|
syncData(this.sdk, this.options.id)
|
||||||
|
syncSplitData(this.sdk, this.options.id)
|
||||||
|
},
|
||||||
|
resetCallBack: () => {
|
||||||
|
this.reset()
|
||||||
|
this.Dialog.resetCallBack && this.Dialog.resetCallBack()
|
||||||
|
},
|
||||||
|
closeCallBack: () => {
|
||||||
|
this.reset()
|
||||||
|
this.Dialog.closeCallBack && this.Dialog.closeCallBack()
|
||||||
|
},
|
||||||
|
showCallBack: (show) => {
|
||||||
|
this.show = show
|
||||||
|
this.Dialog.showCallBack && this.Dialog.showCallBack()
|
||||||
|
}
|
||||||
|
}, true)
|
||||||
|
this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' road-surface'
|
||||||
|
let contentElm = document.createElement('div');
|
||||||
|
contentElm.innerHTML = html()
|
||||||
|
this._DialogObject.contentAppChild(contentElm)
|
||||||
|
|
||||||
|
|
||||||
|
// 下拉选项
|
||||||
|
// let heightModeData = [
|
||||||
|
// {
|
||||||
|
// name: '海拔高度',
|
||||||
|
// value: '海拔高度',
|
||||||
|
// key: '0',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '相对地表',
|
||||||
|
// value: '相对地表',
|
||||||
|
// key: '1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '依附模型',
|
||||||
|
// value: '依附模型',
|
||||||
|
// key: '2',
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
// let heightModeObject = legp(
|
||||||
|
// this._DialogObject._element.content.getElementsByClassName(
|
||||||
|
// 'road-box'
|
||||||
|
// )[0],
|
||||||
|
// '.road-type'
|
||||||
|
// )
|
||||||
|
// if (heightModeObject) {
|
||||||
|
// heightModeObject.legp_search(heightModeData)
|
||||||
|
// let heightModeDataLegpElm = this._DialogObject._element.content
|
||||||
|
// .getElementsByClassName('road-type')[0]
|
||||||
|
// .getElementsByTagName('input')[0]
|
||||||
|
// for (let i = 0; i < heightModeData.length; i++) {
|
||||||
|
// if (heightModeData[i].key == this.heightMode) {
|
||||||
|
// heightModeDataLegpElm.value = heightModeData[i].value
|
||||||
|
// heightModeObject.legp_searchActive(
|
||||||
|
// heightModeData[i].value
|
||||||
|
// )
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// heightModeDataLegpElm.addEventListener('input', () => {
|
||||||
|
// for (let i = 0; i < heightModeData.length; i++) {
|
||||||
|
// if (heightModeData[i].value === heightModeDataLegpElm.value) {
|
||||||
|
// this.heightMode = heightModeData[i].key
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
|
||||||
|
|
||||||
|
// this._elms.height = heightElm
|
||||||
|
// this._elms.heightBox = heightBoxElm
|
||||||
|
// this._elms.heightMode = heightModeDataLegpElm
|
||||||
|
// this._elms.heightConfirm = heightConfirmElm
|
||||||
|
// this._elms.heightModeObject = heightModeObject
|
||||||
|
|
||||||
|
// heightConfirmElm.addEventListener('click', () => {
|
||||||
|
// this.positionEditing = false
|
||||||
|
// for (let i = 0; i < this.options.positions.length; i++) {
|
||||||
|
// this.options.positions[i].alt = Number((this.options.positions[i].alt + Number(heightElm.value)).toFixed(2))
|
||||||
|
// this._elms.alt[i].innerHTML = this.options.positions[i].alt
|
||||||
|
// }
|
||||||
|
// let fromDegreesArray = this.renewPositions(this.options.positions)
|
||||||
|
// this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(
|
||||||
|
// fromDegreesArray
|
||||||
|
// )
|
||||||
|
|
||||||
|
// this.positionEditing = false
|
||||||
|
// PolylineObject.closeNodeEdit(this)
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let all_elm = contentElm.getElementsByTagName("*")
|
||||||
|
this._EventBinding.on(this, all_elm)
|
||||||
|
this._elms = this._EventBinding.element
|
||||||
|
} else {
|
||||||
|
// if (this._element_style) {
|
||||||
|
// document.getElementsByTagName('head')[0].removeChild(this._element_style)
|
||||||
|
// this._element_style = null
|
||||||
|
// }
|
||||||
|
// if (this._DialogObject && this._DialogObject.remove) {
|
||||||
|
// this._DialogObject.remove()
|
||||||
|
// this._DialogObject = null
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reset() {
|
||||||
|
if (!this.viewer.entities.getById(this.options.id)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.name = this.originalOptions.name
|
||||||
|
this.carRoadWidth = this.originalOptions.carRoadWidth
|
||||||
|
this.sideWidth = this.originalOptions.sideWidth
|
||||||
|
this.positions = this.originalOptions.positions
|
||||||
|
this.roadImage = this.originalOptions.roadImage
|
||||||
|
this.sideImage = this.originalOptions.sideImage
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 飞到对应实体
|
||||||
|
*/
|
||||||
|
async flyTo(options = {}) {
|
||||||
|
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 = { lng: 0, lat: 0 }
|
||||||
|
if (this.options.position) {
|
||||||
|
position = { ...this.options.position }
|
||||||
|
}
|
||||||
|
else if (this.options.positions) {
|
||||||
|
position = { ...this.options.positions[0] }
|
||||||
|
}
|
||||||
|
else if (this.options.center) {
|
||||||
|
position = { ...this.options.center }
|
||||||
|
}
|
||||||
|
else if (this.options.start) {
|
||||||
|
position = { ...this.options.start }
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.options.hasOwnProperty('lng')) {
|
||||||
|
position.lng = this.options.lng
|
||||||
|
}
|
||||||
|
if (this.options.hasOwnProperty('lat')) {
|
||||||
|
position.lat = this.options.lat
|
||||||
|
}
|
||||||
|
if (this.options.hasOwnProperty('alt')) {
|
||||||
|
position.alt = this.options.alt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 如果没有高度值,则获取紧贴高度计算
|
||||||
|
// 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 positionArray = []
|
||||||
|
for (let i = 0; i < this.positions.length; i++) {
|
||||||
|
let a = Cesium.Cartesian3.fromDegrees(
|
||||||
|
this.positions[i][0],
|
||||||
|
this.positions[i][1],
|
||||||
|
this.options.height + this.options.heightDifference / 2
|
||||||
|
)
|
||||||
|
positionArray.push(a.x, a.y, a.z)
|
||||||
|
}
|
||||||
|
let BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray)
|
||||||
|
this.viewer.camera.flyToBoundingSphere(BoundingSphere, {
|
||||||
|
offset: {
|
||||||
|
heading: Cesium.Math.toRadians(0.0),
|
||||||
|
pitch: Cesium.Math.toRadians(-20.0),
|
||||||
|
roll: Cesium.Math.toRadians(0.0)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getSphere() {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
// entity没有加载完成时 state 不会等于0 所以设置定时器直到获取到为止
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
const sphere = new Cesium.BoundingSphere()
|
||||||
|
const state = this.sdk.viewer._dataSourceDisplay.getBoundingSphere(
|
||||||
|
this.viewer.entities.getById(this.options.id),
|
||||||
|
false,
|
||||||
|
sphere
|
||||||
|
)
|
||||||
|
if (state === Cesium.BoundingSphereState.DONE) {
|
||||||
|
clearInterval(interval)
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
*/
|
||||||
|
async remove() {
|
||||||
|
this.positions = []
|
||||||
|
this.lineEntity = null
|
||||||
|
|
||||||
|
if (this.viewer.entities.getById(this.options.id)) {
|
||||||
|
this.viewer.entities.getById(this.options.id)._children.forEach((item) => {
|
||||||
|
this.viewer.entities.remove(item);
|
||||||
|
});
|
||||||
|
this.viewer.entities.remove(this.viewer.entities.getById(this.options.id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._DialogObject && !this._DialogObject.isDestroy) {
|
||||||
|
this._DialogObject.close()
|
||||||
|
this._DialogObject = null
|
||||||
|
}
|
||||||
|
await this.sdk.removeIncetance(this.options.id)
|
||||||
|
await syncData(this.sdk, this.options.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
flicker() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Road
|
1023
src/Obj/Base/RoadObject/index-面大小一致.js
Normal file
1023
src/Obj/Base/RoadObject/index-面大小一致.js
Normal file
File diff suppressed because it is too large
Load Diff
1207
src/Obj/Base/RoadObject/index.js
Normal file
1207
src/Obj/Base/RoadObject/index.js
Normal file
File diff suppressed because it is too large
Load Diff
@ -53,8 +53,7 @@ class TextBox extends Base {
|
|||||||
|
|
||||||
// 配置CSS样式和内容结构
|
// 配置CSS样式和内容结构
|
||||||
viewer.cesiumWidget.container.appendChild(dom);
|
viewer.cesiumWidget.container.appendChild(dom);
|
||||||
let posi = Cesium.Cartesian3.fromDegrees(that.options.position.lng.toFixed(4), that.options.position.lat.toFixed(4), that.options.position.alt.toFixed(4))
|
let posi = Cesium.Cartesian3.fromDegrees(that.options.position.lng, that.options.position.lat, that.options.position.alt)
|
||||||
|
|
||||||
that.handler = function () {
|
that.handler = function () {
|
||||||
const position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
|
const position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
|
||||||
viewer.scene, posi
|
viewer.scene, posi
|
||||||
@ -70,22 +69,44 @@ class TextBox extends Base {
|
|||||||
that.textDom = dom;
|
that.textDom = dom;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
async isClick(posi, id) {
|
||||||
|
let params = [
|
||||||
|
{
|
||||||
|
position: posi
|
||||||
|
},
|
||||||
|
id,
|
||||||
|
null
|
||||||
|
]
|
||||||
|
|
||||||
|
this.clickCallBack({ position: posi }, id, null)
|
||||||
|
}
|
||||||
async setHandeler(data) {
|
async setHandeler(data) {
|
||||||
let that = this
|
let that = this
|
||||||
|
|
||||||
|
let cartesian = this.sdk.viewer.scene.pickPosition(new Cesium.Cartesian2(data.x, data.y)); //屏幕坐标转为笛卡尔空间坐标
|
||||||
|
// if (!cartesian) return;
|
||||||
|
|
||||||
|
// let c = Cesium.Cartographic.fromCartesian(position);
|
||||||
|
if (!cartesian) {
|
||||||
const ray = this.sdk.viewer.camera.getPickRay(new Cesium.Cartesian2(data.x, data.y));
|
const ray = this.sdk.viewer.camera.getPickRay(new Cesium.Cartesian2(data.x, data.y));
|
||||||
var cartesian = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);
|
cartesian = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);
|
||||||
|
}
|
||||||
|
|
||||||
if (Cesium.defined(cartesian)) {
|
if (Cesium.defined(cartesian)) {
|
||||||
that.sdk.viewer.scene.postRender.removeEventListener(that.handler);
|
that.sdk.viewer.scene.postRender.removeEventListener(that.handler);
|
||||||
|
|
||||||
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
|
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
|
||||||
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
|
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
|
||||||
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
|
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
|
||||||
|
|
||||||
|
let height = await that.getClampToHeight({ lng: longitude, lat: latitude })
|
||||||
that.position = {
|
that.position = {
|
||||||
lng: longitude,
|
lng: longitude,
|
||||||
lat: latitude,
|
lat: latitude,
|
||||||
alt: cartographic.height
|
alt: cartographic.height
|
||||||
|
// alt: height
|
||||||
}
|
}
|
||||||
let posi = Cesium.Cartesian3.fromDegrees(longitude.toFixed(4), latitude.toFixed(4), cartographic.height.toFixed(4))
|
let posi = Cesium.Cartesian3.fromDegrees(longitude, latitude, cartographic.height)
|
||||||
|
|
||||||
that.handler = function () {
|
that.handler = function () {
|
||||||
const position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
|
const position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
|
||||||
@ -108,6 +129,16 @@ class TextBox extends Base {
|
|||||||
async returnFun() {
|
async returnFun() {
|
||||||
return this.handler
|
return this.handler
|
||||||
}
|
}
|
||||||
|
get onClick() {
|
||||||
|
return this.clickCallBack
|
||||||
|
}
|
||||||
|
set onClick(val) {
|
||||||
|
if (val && typeof val !== 'function') {
|
||||||
|
console.error('val:', val, '不是一个function')
|
||||||
|
} else {
|
||||||
|
this.clickCallBack = val
|
||||||
|
}
|
||||||
|
}
|
||||||
get show() {
|
get show() {
|
||||||
return this.options.show
|
return this.options.show
|
||||||
}
|
}
|
||||||
|
@ -182,6 +182,23 @@ function html() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span class="custom-divider"></span>
|
<span class="custom-divider"></span>
|
||||||
|
<div class="div-item">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<span class="label">油耗</span>
|
||||||
|
<div class="input-number input-number-unit-6" style="width: 170px;">
|
||||||
|
<input class="input" type="number" title="" min="1" max="99999999" @model="unitFuelConsumption">
|
||||||
|
<span class="unit">L/100km</span>
|
||||||
|
<span class="arrow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col" style="flex: 0 0 0;">
|
||||||
|
<span class="label">总油耗</span>
|
||||||
|
<input class="btn-switch" type="checkbox" @model="fuelShow">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="custom-divider"></span>
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ class TrajectoryMotion extends Base {
|
|||||||
this.options.line.smooth = options.line.smooth ? options.line.smooth : false
|
this.options.line.smooth = options.line.smooth ? options.line.smooth : false
|
||||||
this.options.line.noseToTail = options.line.noseToTail ? options.line.noseToTail : false
|
this.options.line.noseToTail = options.line.noseToTail ? options.line.noseToTail : false
|
||||||
this.positions_smooth = []
|
this.positions_smooth = []
|
||||||
|
this.options.unitFuelConsumption = options.unitFuelConsumption || 0
|
||||||
this.options.ground = options.ground || false
|
this.options.ground = options.ground || false
|
||||||
this.options.state = (options.state || options.state === false) ? options.state : true
|
this.options.state = (options.state || options.state === false) ? options.state : true
|
||||||
this.options.routeDirection = (options.routeDirection || options.routeDirection === false) ? options.routeDirection : true
|
this.options.routeDirection = (options.routeDirection || options.routeDirection === false) ? options.routeDirection : true
|
||||||
@ -180,7 +181,8 @@ class TrajectoryMotion extends Base {
|
|||||||
if (this.realTimeRoute) {
|
if (this.realTimeRoute) {
|
||||||
this.realTimeLine && (this.realTimeLine.show = (!this.showView || this.showView == 3 || !sdkD) ? true : false)
|
this.realTimeLine && (this.realTimeLine.show = (!this.showView || this.showView == 3 || !sdkD) ? true : false)
|
||||||
}
|
}
|
||||||
this.label && (this.label.show = (!this.showView || this.showView == 3 || !sdkD) ? this.options.label.show : false)
|
this.label && (this.label.show = (!this.showView || this.showView == 3) ? this.options.label.show : false)
|
||||||
|
this.fuelLabel && (this.fuelLabel.show = (!this.showView || this.showView == 3) ? this.options.fuelShow : false)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.model.show = (!this.showView || this.showView == 3 || !sdkD) ? this.options.show : false
|
this.model.show = (!this.showView || this.showView == 3 || !sdkD) ? this.options.show : false
|
||||||
@ -203,6 +205,7 @@ class TrajectoryMotion extends Base {
|
|||||||
this.keyPoints[i].show = (!this.showView || this.showView == 3) ? show : false
|
this.keyPoints[i].show = (!this.showView || this.showView == 3) ? show : false
|
||||||
}
|
}
|
||||||
this.label && (this.label.show = false)
|
this.label && (this.label.show = false)
|
||||||
|
this.fuelLabel && (this.fuelLabel.show = false)
|
||||||
this.viewFollow = false
|
this.viewFollow = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,14 +260,17 @@ class TrajectoryMotion extends Base {
|
|||||||
// Cesium.Matrix4.multiplyByTranslation(this.model.modelMatrix, new Cesium.Cartesian3(0, 0, -difference), this.model.modelMatrix)
|
// Cesium.Matrix4.multiplyByTranslation(this.model.modelMatrix, new Cesium.Cartesian3(0, 0, -difference), this.model.modelMatrix)
|
||||||
// Cesium.Matrix4.getTranslation(this.model.modelMatrix, this.model.position)
|
// Cesium.Matrix4.getTranslation(this.model.modelMatrix, this.model.position)
|
||||||
this.label && (this.label.show = this.label.show)
|
this.label && (this.label.show = this.label.show)
|
||||||
|
this.fuelLabel && (this.fuelLabel.show = this.fuelLabel.show)
|
||||||
if (this.options.label.position) {
|
if (this.options.label.position) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (this.options.label.position.alt) {
|
if (this.options.label.position.alt) {
|
||||||
this.label && (this.label.position = [this.options.label.position.lng, this.options.label.position.lat, this.options.label.position.alt])
|
this.label && (this.label.position = [this.options.label.position.lng, this.options.label.position.lat, this.options.label.position.alt])
|
||||||
|
this.fuelLabel && (this.fuelLabel.position = [this.options.label.position.lng, this.options.label.position.lat, this.options.label.position.alt])
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.getClampToHeight({ lng: this.options.label.position.lng, lat: this.options.label.position.lat }).then((height) => {
|
this.getClampToHeight({ lng: this.options.label.position.lng, lat: this.options.label.position.lat }).then((height) => {
|
||||||
this.label && (this.label.position = [this.options.label.position.lng, this.options.label.position.lat, height])
|
this.label && (this.label.position = [this.options.label.position.lng, this.options.label.position.lat, height])
|
||||||
|
this.fuelLabel && (this.fuelLabel.position = [this.options.label.position.lng, this.options.label.position.lat, height])
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, 0)
|
}, 0)
|
||||||
@ -1168,7 +1174,9 @@ class TrajectoryMotion extends Base {
|
|||||||
show = false
|
show = false
|
||||||
}
|
}
|
||||||
if (this.show) {
|
if (this.show) {
|
||||||
this.label && (this.label.show = show)
|
if (this.label) {
|
||||||
|
this.label.show = show
|
||||||
|
this.label.pixelOffset = this.options.label.pixelOffset + (this.fuelShow ? this.labelFontSize + 20 : 0)
|
||||||
if (this.options.label.position) {
|
if (this.options.label.position) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (this.options.label.position.alt) {
|
if (this.options.label.position.alt) {
|
||||||
@ -1182,6 +1190,7 @@ class TrajectoryMotion extends Base {
|
|||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
this.label && (this.label.show = false)
|
this.label && (this.label.show = false)
|
||||||
}
|
}
|
||||||
@ -1197,6 +1206,7 @@ class TrajectoryMotion extends Base {
|
|||||||
set labelFontFamily(v) {
|
set labelFontFamily(v) {
|
||||||
this.options.label.fontFamily = v || 0
|
this.options.label.fontFamily = v || 0
|
||||||
this.label && (this.label.fontFamily = this.options.label.fontFamily)
|
this.label && (this.label.fontFamily = this.options.label.fontFamily)
|
||||||
|
this.fuelLabel && (this.fuelLabel.fontFamily = this.options.label.fontFamily)
|
||||||
|
|
||||||
let name = getFontFamilyName(this.labelFontFamily) || ''
|
let name = getFontFamilyName(this.labelFontFamily) || ''
|
||||||
this._elms.labelFontFamily &&
|
this._elms.labelFontFamily &&
|
||||||
@ -1211,6 +1221,7 @@ class TrajectoryMotion extends Base {
|
|||||||
set labelColor(v) {
|
set labelColor(v) {
|
||||||
this.options.label.color = v
|
this.options.label.color = v
|
||||||
this.label && (this.label.color = v)
|
this.label && (this.label.color = v)
|
||||||
|
this.fuelLabel && (this.fuelLabel.color = v)
|
||||||
if (this._elms.labelColor) {
|
if (this._elms.labelColor) {
|
||||||
this._elms.labelColor.forEach((item, i) => {
|
this._elms.labelColor.forEach((item, i) => {
|
||||||
let labelColorPicker = new YJColorPicker({
|
let labelColorPicker = new YJColorPicker({
|
||||||
@ -1238,6 +1249,13 @@ class TrajectoryMotion extends Base {
|
|||||||
set labelFontSize(v) {
|
set labelFontSize(v) {
|
||||||
this.options.label.fontSize = v
|
this.options.label.fontSize = v
|
||||||
this.label && (this.label.fontSize = v)
|
this.label && (this.label.fontSize = v)
|
||||||
|
if (this.fuelLabel) {
|
||||||
|
this.fuelLabel.fontSize = v
|
||||||
|
this.label.pixelOffset = this.options.label.pixelOffset + v + 20
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.label.pixelOffset = this.options.label.pixelOffset
|
||||||
|
}
|
||||||
this._elms.labelFontSize && this._elms.labelFontSize.forEach((item) => {
|
this._elms.labelFontSize && this._elms.labelFontSize.forEach((item) => {
|
||||||
item.value = v
|
item.value = v
|
||||||
})
|
})
|
||||||
@ -1249,6 +1267,7 @@ class TrajectoryMotion extends Base {
|
|||||||
set labelScaleByDistance(v) {
|
set labelScaleByDistance(v) {
|
||||||
this.options.label.scaleByDistance = v
|
this.options.label.scaleByDistance = v
|
||||||
this.label && (this.label.scaleByDistance = v)
|
this.label && (this.label.scaleByDistance = v)
|
||||||
|
this.fuelLabel && (this.fuelLabel.scaleByDistance = v)
|
||||||
this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach((item) => {
|
this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach((item) => {
|
||||||
item.checked = v
|
item.checked = v
|
||||||
})
|
})
|
||||||
@ -1264,6 +1283,7 @@ class TrajectoryMotion extends Base {
|
|||||||
}
|
}
|
||||||
this.options.label.near = near
|
this.options.label.near = near
|
||||||
this.label && (this.label.near = near)
|
this.label && (this.label.near = near)
|
||||||
|
this.fuelLabel && (this.fuelLabel.near = near)
|
||||||
this._elms.labelNear && this._elms.labelNear.forEach((item) => {
|
this._elms.labelNear && this._elms.labelNear.forEach((item) => {
|
||||||
item.value = near
|
item.value = near
|
||||||
})
|
})
|
||||||
@ -1279,11 +1299,66 @@ class TrajectoryMotion extends Base {
|
|||||||
}
|
}
|
||||||
this.options.label.far = far
|
this.options.label.far = far
|
||||||
this.label && (this.label.far = far)
|
this.label && (this.label.far = far)
|
||||||
|
this.fuelLabel && (this.fuelLabel.far = far)
|
||||||
this._elms.labelFar && this._elms.labelFar.forEach((item) => {
|
this._elms.labelFar && this._elms.labelFar.forEach((item) => {
|
||||||
item.value = far
|
item.value = far
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get unitFuelConsumption() {
|
||||||
|
return this.options.unitFuelConsumption
|
||||||
|
}
|
||||||
|
|
||||||
|
set unitFuelConsumption(v) {
|
||||||
|
this.options.unitFuelConsumption = v
|
||||||
|
this._elms.unitFuelConsumption && this._elms.unitFuelConsumption.forEach((item) => {
|
||||||
|
item.value = v
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
get fuelShow() {
|
||||||
|
return this.options.fuelShow
|
||||||
|
}
|
||||||
|
|
||||||
|
set fuelShow(v) {
|
||||||
|
this.options.fuelShow = v
|
||||||
|
let show = v
|
||||||
|
if (this.show && (!this.showView || this.showView == 3)) {
|
||||||
|
show = v
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
show = false
|
||||||
|
}
|
||||||
|
if (this.show) {
|
||||||
|
if (this.fuelLabel) {
|
||||||
|
this.fuelLabel.show = show
|
||||||
|
this.label.pixelOffset = this.options.label.pixelOffset + (show ? this.labelFontSize + 20 : 0)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.label.pixelOffset = this.options.label.pixelOffset
|
||||||
|
}
|
||||||
|
if (this.options.label.position) {
|
||||||
|
setTimeout(() => {
|
||||||
|
if (this.options.label.position.alt) {
|
||||||
|
this.fuelLabel && (this.fuelLabel.position = [this.options.label.position.lng, this.options.label.position.lat, this.options.label.position.alt])
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.getClampToHeight({ lng: this.options.label.position.lng, lat: this.options.label.position.lat }).then((height) => {
|
||||||
|
this.fuelLabel && (this.fuelLabel.position = [this.options.label.position.lng, this.options.label.position.lat, height])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.fuelLabel && (this.fuelLabel.show = false)
|
||||||
|
this.label.pixelOffset = this.options.label.pixelOffset
|
||||||
|
}
|
||||||
|
this._elms.fuelShow && this._elms.fuelShow.forEach((item) => {
|
||||||
|
item.checked = v
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// 创建路径
|
// 创建路径
|
||||||
static addLine(that) {
|
static addLine(that) {
|
||||||
let positions_smooth = that.renewLinePositions(that.options.line.positions)
|
let positions_smooth = that.renewLinePositions(that.options.line.positions)
|
||||||
@ -1402,6 +1477,7 @@ class TrajectoryMotion extends Base {
|
|||||||
}
|
}
|
||||||
let pos = that.smooth ? that.positions_smooth : Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)
|
let pos = that.smooth ? that.positions_smooth : Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)
|
||||||
TrajectoryMotion.createLabel(that)
|
TrajectoryMotion.createLabel(that)
|
||||||
|
TrajectoryMotion.createFuelLabel(that)
|
||||||
that.modelMove(pos)
|
that.modelMove(pos)
|
||||||
|
|
||||||
|
|
||||||
@ -1411,13 +1487,13 @@ class TrajectoryMotion extends Base {
|
|||||||
static async createLabel(that) {
|
static async createLabel(that) {
|
||||||
let labelPosition = that.cartesian3Towgs84(that.model.position, that.sdk.viewer)
|
let labelPosition = that.cartesian3Towgs84(that.model.position, that.sdk.viewer)
|
||||||
that.label = new LabelObject(that.sdk, {
|
that.label = new LabelObject(that.sdk, {
|
||||||
show: that.options.show ? (that.options.model.show ? that.options.label.show : false) : false,
|
show: that.options.show ? (that.options.label.show ? true : false) : false,
|
||||||
position: [labelPosition.lng, labelPosition.lat, labelPosition.alt],
|
position: [labelPosition.lng, labelPosition.lat, labelPosition.alt],
|
||||||
text: that.options.name,
|
text: that.options.name,
|
||||||
fontSize: that.options.label.fontSize,
|
fontSize: that.options.label.fontSize,
|
||||||
fontFamily: that.options.label.fontFamily,
|
fontFamily: that.options.label.fontFamily,
|
||||||
color: that.options.label.color,
|
color: that.options.label.color,
|
||||||
pixelOffset: that.options.label.pixelOffset,
|
pixelOffset: that.options.label.pixelOffset + (that.options.fuelShow ? that.options.label.fontSize + 20 : 0),
|
||||||
backgroundColor: that.options.label.backgroundColor,
|
backgroundColor: that.options.label.backgroundColor,
|
||||||
lineColor: that.options.label.lineColor,
|
lineColor: that.options.label.lineColor,
|
||||||
lineWidth: that.options.label.lineWidth,
|
lineWidth: that.options.label.lineWidth,
|
||||||
@ -1427,6 +1503,26 @@ class TrajectoryMotion extends Base {
|
|||||||
}, that.model)
|
}, that.model)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async createFuelLabel(that) {
|
||||||
|
let labelPosition = that.cartesian3Towgs84(that.model.position, that.sdk.viewer)
|
||||||
|
that.fuelLabel = new LabelObject(that.sdk, {
|
||||||
|
show: that.options.show ? (that.options.fuelShow ? true : false) : false,
|
||||||
|
// show: true,
|
||||||
|
position: [labelPosition.lng, labelPosition.lat, labelPosition.alt],
|
||||||
|
text: '总油耗:',
|
||||||
|
fontSize: that.options.label.fontSize,
|
||||||
|
fontFamily: that.options.label.fontFamily,
|
||||||
|
color: that.options.label.color,
|
||||||
|
pixelOffset: 0,
|
||||||
|
backgroundColor: ['#6e6e6e', '#6e6e6e'],
|
||||||
|
lineColor: '#00ffff00',
|
||||||
|
lineWidth: 0,
|
||||||
|
scaleByDistance: that.options.label.scaleByDistance,
|
||||||
|
near: that.options.label.near,
|
||||||
|
far: that.options.label.far
|
||||||
|
}, that.model)
|
||||||
|
}
|
||||||
|
|
||||||
// 创建关键点
|
// 创建关键点
|
||||||
static async addKeyPoint(that) {
|
static async addKeyPoint(that) {
|
||||||
for (let i = 0; i < that.options.line.positions.length; i++) {
|
for (let i = 0; i < that.options.line.positions.length; i++) {
|
||||||
@ -1531,8 +1627,8 @@ class TrajectoryMotion extends Base {
|
|||||||
else {
|
else {
|
||||||
setPosition(startDistance)
|
setPosition(startDistance)
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
_this.model && (_this.model.isMove = false)
|
_this.model.isMove = false
|
||||||
}, 500);
|
}, 1000);
|
||||||
|
|
||||||
|
|
||||||
animateUpdate()
|
animateUpdate()
|
||||||
@ -1555,6 +1651,8 @@ class TrajectoryMotion extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function setPosition(distance) {
|
async function setPosition(distance) {
|
||||||
|
_this.totalFuelConsumption = Number((distance / 100 * _this.unitFuelConsumption).toFixed(2))
|
||||||
|
_this.fuelLabel.text = '总油耗:' + _this.totalFuelConsumption + ' L'
|
||||||
_this.model.isMove = true
|
_this.model.isMove = true
|
||||||
let sdk2D = get2DView()
|
let sdk2D = get2DView()
|
||||||
let splitSdk = getSdk()
|
let splitSdk = getSdk()
|
||||||
@ -1766,6 +1864,7 @@ class TrajectoryMotion extends Base {
|
|||||||
}
|
}
|
||||||
let labelPosition = _this.cartesian3Towgs84(position, _this.sdk.viewer)
|
let labelPosition = _this.cartesian3Towgs84(position, _this.sdk.viewer)
|
||||||
_this.label.position = [labelPosition.lng, labelPosition.lat, labelPosition.alt]
|
_this.label.position = [labelPosition.lng, labelPosition.lat, labelPosition.alt]
|
||||||
|
_this.fuelLabel.position = [labelPosition.lng, labelPosition.lat, labelPosition.alt]
|
||||||
lastDistance = distance
|
lastDistance = distance
|
||||||
// console.log(position)
|
// console.log(position)
|
||||||
_this.realTimeRouteArray.push(position)
|
_this.realTimeRouteArray.push(position)
|
||||||
@ -2162,6 +2261,7 @@ class TrajectoryMotion extends Base {
|
|||||||
this.sdk.viewer.entities.remove(this.line)
|
this.sdk.viewer.entities.remove(this.line)
|
||||||
this.sdk.viewer.entities.remove(this.realTimeLine)
|
this.sdk.viewer.entities.remove(this.realTimeLine)
|
||||||
this.label && this.label.remove()
|
this.label && this.label.remove()
|
||||||
|
this.fuelLabel && this.fuelLabel.remove()
|
||||||
for (let i = 0; i < this.keyPointShow.length; i++) {
|
for (let i = 0; i < this.keyPointShow.length; i++) {
|
||||||
this.sdk.viewer.entities.remove(this.keyPointShow[i])
|
this.sdk.viewer.entities.remove(this.keyPointShow[i])
|
||||||
}
|
}
|
||||||
@ -2169,6 +2269,7 @@ class TrajectoryMotion extends Base {
|
|||||||
this.realTimeLine = null
|
this.realTimeLine = null
|
||||||
this.model = null
|
this.model = null
|
||||||
this.label = null
|
this.label = null
|
||||||
|
this.fuelLabel = null
|
||||||
if (this._DialogObject && !this._DialogObject.isDestroy) {
|
if (this._DialogObject && !this._DialogObject.isDestroy) {
|
||||||
this._DialogObject.close()
|
this._DialogObject.close()
|
||||||
this._DialogObject = null
|
this._DialogObject = null
|
||||||
@ -2222,6 +2323,7 @@ class TrajectoryMotion extends Base {
|
|||||||
this.model && (this.model.show = false)
|
this.model && (this.model.show = false)
|
||||||
}
|
}
|
||||||
this.labelShow = this.originalOptions.label.show
|
this.labelShow = this.originalOptions.label.show
|
||||||
|
this.fuelLabelShow = this.originalOptions.fuelShow
|
||||||
this.labelColor = this.originalOptions.label.color
|
this.labelColor = this.originalOptions.label.color
|
||||||
this.labelFontSize = this.originalOptions.label.fontSize
|
this.labelFontSize = this.originalOptions.label.fontSize
|
||||||
this.labelFontFamily = this.originalOptions.label.fontFamily
|
this.labelFontFamily = this.originalOptions.label.fontFamily
|
||||||
|
Reference in New Issue
Block a user