This commit is contained in:
zh
2025-07-11 15:59:51 +08:00
12 changed files with 529 additions and 204 deletions

View File

@ -9,22 +9,15 @@ function html(that) {
<span class="label">名称</span>
<input class="input" maxlength="40" type="text" @model="name">
</div>
<div class="col" style="flex: 0 0 54%;">
<div class="col" style="flex: 0 0 56%;">
<div>
<div class="row">
<div class="col input-select-unit-box">
<span class="label">原始长度:</span>
<div class="input-select-unit"></div>
<input class="input input-text" readonly="readonly" type="text" style="flex: 0 0 130px;" @model="length">
<div class="input-select-unit"></div>
</div>
</div>
<div class="row">
<div class="col input-select-fit-unit-box">
<span class="label">拟合长度:</span>
<input class="input input-text" readonly="readonly" type="text" style="flex: 0 0 130px;" @model="fitLength">
<div class="input-select-fit-unit"></div>
</div>
</div>
</div>
</div>
</div>
@ -48,7 +41,7 @@ function html(that) {
<span class="unit">m</span>
<span class="arrow"></span>
</div>
<button class="confirm height-confirm" style="margin-left: 5px;">确认</button>
<button class="confirm height-confirm" style="margin-left: 5px;">应用</button>
</div>
</div>
<div class="row">
@ -72,7 +65,7 @@ function html(that) {
<span class="label">线条颜色</span>
<div class="color"></div>
</div>
<div class="col">
<div class="col" style="flex: 0 0 33%;">
<span class="label">线条宽度</span>
<div class="input-number input-number-unit-1" style="width: 80px;">
<input class="input" type="number" title="" min="1" max="999" @model="lineWidth">
@ -80,7 +73,7 @@ function html(that) {
<span class="arrow"></span>
</div>
</div>
<div class="col input-select-line-type-box">
<div class="col input-select-line-type-box" style="flex: 0 0 37%;">
<span class="label">线条形式</span>
<div class="input-select-line-type"></div>
</div>
@ -90,11 +83,11 @@ function html(that) {
<span class="label">首尾相连</span>
<input class="btn-switch" type="checkbox" @model="noseToTail">
</div>
<div class="col">
<div class="col" style="flex: 0 0 33%;">
<span class="label">线段圆滑</span>
<input class="btn-switch" type="checkbox" @model="smooth">
</div>
<div class="col">
<div class="col" style="flex: 0 0 37%;">
</div>
</div>
<div class="row" id="dashTextureDom">
@ -102,7 +95,7 @@ function html(that) {
<span class="label">动画顺向</span>
<input class="btn-switch" type="checkbox" @model="rotate">
</div>
<div class="col">
<div class="col" style="flex: 0 0 33%;">
<span class="label">动画时长</span>
<div class="input-number input-number-unit-1" style="width: 80px;">
<input class="input" type="number" title="" min="0" max="999999" step="0.1" @model="speed">
@ -110,10 +103,11 @@ function html(that) {
<span class="arrow"></span>
</div>
</div>
<div class="col" >
<div class="col" style="flex: 0 0 37%;">
<span class="label lineSpace">间距</span>
<div class="input-number input-number-unit-1 lineSpace" style="width: 80px;">
<input class="input" type="number" title="" min="0" max="4.5" step="0.1" @model="space">
<span class="unit">倍</span>
<span class="arrow"></span>
</div>
</div>
@ -123,7 +117,7 @@ function html(that) {
<span class="label">线段缓冲</span>
<input class="btn-switch" type="checkbox" @model="extend">
</div>
<div class="col">
<div class="col" style="flex: 0 0 33%;">
<span class="label">缓冲宽度</span>
<div class="input-number input-number-unit-1" style="width: 80px;">
<input class="input" type="number" title="" min="0" data-min="0.01" max="999999" @model="extendWidth">
@ -131,7 +125,7 @@ function html(that) {
<span class="arrow"></span>
</div>
</div>
<div class="col">
<div class="col" style="flex: 0 0 37%;">
<span class="label">缓冲颜色</span>
<div class="extendColor"></div>
</div>

View File

@ -23,7 +23,7 @@ class PolylineObject extends Base {
* @description 折线
* @param options {object} 线属性
* @param options.name{string} 名称
* @param options.width=3{number} 线宽
* @param options.width * @param options.width=3{number} 线宽
* @param options.color=#ff0000 {string} 颜色
* @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光
* @param options.heightMode=2{number} 高度模式0海拔高度1相对高度2依附模式
@ -63,6 +63,7 @@ class PolylineObject extends Base {
this.options.dashSize = options.dashSize || 0.03
this.options['length-unit'] = options['length-unit'] || '米'
this.options['fit-length-unit'] = options['fit-length-unit'] || '米'
this.options['words-name'] = options['words-name'] || '空间长度'
this.options['extend-width'] =
options['extend-width'] || options['extend-width'] === 0
? options['extend-width']
@ -120,6 +121,7 @@ class PolylineObject extends Base {
this.options.attributeType = options.attributeType || 'richText'
this.operate = {}
this.nodePoints = []
this.unitNum = 0
this.Dialog = _Dialog
if (!this.options.positions || this.options.positions.length < 2) {
this._error = '线段最少需要两个坐标!'
@ -218,6 +220,8 @@ class PolylineObject extends Base {
set length(v) {
this.options.length = v
//判断数值是否大于1000m
this._elms.length &&
this._elms.length.forEach(item => {
item.value = v
@ -240,24 +244,61 @@ class PolylineObject extends Base {
return this.options['length-unit']
}
set lengthUnit(v) {
this.unitNum++
this.options['length-unit'] = v
this._elms.lengthUnit &&
this._elms.lengthUnit.forEach(item => {
item.value = v
})
if (this.options.lengthByMeter) {
switch (v) {
case '米':
this.length = this.options.lengthByMeter
break
case '千米':
this.length = (this.options.lengthByMeter / 1000).toFixed(5)
break
default:
this.length = this.options.lengthByMeter
if (this.unitNum > 2) {
switch (v) {
case '米':
this.length = this.noseToTail ? this.options.fitLengthByMeter : this.options.lengthByMeter
break
case '千米':
this.length = this.noseToTail ? (this.options.fitLengthByMeter / 1000).toFixed(5) : (this.options.lengthByMeter / 1000).toFixed(5)
break
default:
this.length = this.noseToTail ? this.options.fitLengthByMeter : this.options.lengthByMeter
break
}
} else {
let length = this.noseToTail ? this.options.fitLengthByMeter : this.options.lengthByMeter
this.lengthUnit = length > 1000 || length == 1000 ? '千米' : '米'
}
}
}
get wordsName() {
return this.options['words-name']
}
set wordsName(v) {
this.options['words-name'] = v
this._elms.wordsName &&
this._elms.wordsName.forEach(item => {
item.value = v
})
let _this = this
if (!this.noseToTail) {
this.computeDistance(
this.options.positions,
2,
v
).then(res => {
_this.options.lengthByMeter = res
if (res > 1000 || res == 1000) {
_this.length = (res / 1000).toFixed(5)
_this.lengthUnit = '千米'
} else {
_this.length = res
_this.lengthUnit = '米'
}
})
} else {
let fromDegreesArray = this.renewPositions(this.options.positions)
}
}
get fitLengthUnit() {
return this.options['fit-length-unit']
@ -306,69 +347,82 @@ class PolylineObject extends Base {
set lineType(v) {
let lineTypeData = [
{
name: '实线',
name: '<i class="icon line"></i>实线',
value: '实线',
key: 0
key: 0,
icon: 'line'
},
{
name: '虚线',
name: '<i class="icon dash-line"></i>虚线',
value: '虚线',
key: 1
key: 1,
icon: 'dash-line'
},
{
name: '泛光',
name: '<i class="icon light-line"></i>泛光',
value: '泛光',
key: 2
key: 2,
icon: 'light-line'
},
{
name: '尾迹光线',
name: '<i class="icon tail-line"></i>尾迹光线',
value: '尾迹光线',
key: 3
key: 3,
icon: 'tail-line'
},
{
name: '多尾迹光线',
name: '<i class="icon mult-tail-line"></i>多尾迹光线',
value: '多尾迹光线',
key: 4
key: 4,
icon: 'mult-tail-line'
},
{
name: '流动虚线1',
name: '<i class="icon flow-dash-line1"></i>流动虚线1',
value: '流动虚线1',
key: 5
key: 5,
icon: 'flow-dash-line1'
},
{
name: '流动虚线2',
name: '<i class="icon flow-dash-line2"></i>流动虚线2',
value: '流动虚线2',
key: 6
key: 6,
icon: 'flow-dash-line2'
},
{
name: '流动箭头1',
name: '<i class="icon pic-line1"></i>流动箭头1',
value: '流动箭头1',
key: 7
key: 7,
icon: 'pic-line1'
},
{
name: '流动箭头2',
name: '<i class="icon pic-line2"></i>流动箭头2',
value: '流动箭头2',
key: 8
key: 8,
icon: 'pic-line2'
},
{
name: '流动箭头3',
name: '<i class="icon pic-line3"></i>流动箭头3',
value: '流动箭头3',
key: 9
key: 9,
icon: 'pic-line3'
},
{
name: '流动箭头4',
name: '<i class="icon pic-line4"></i>流动箭头4',
value: '流动箭头4',
key: 10
key: 10,
icon: 'pic-line4'
},
{
name: '流动箭头5',
name: '<i class="icon pic-line5"></i>流动箭头5',
value: '流动箭头5',
key: 11
key: 11,
icon: 'pic-line5'
},
{
name: '流动箭头6',
name: '<i class="icon pic-line6"></i>流动箭头6',
value: '流动箭头6',
key: 12
key: 12,
icon: 'pic-line6'
}
]
this.options.type = Number(v)
@ -420,6 +474,24 @@ class PolylineObject extends Base {
)
this.renewPolygon(fromDegreesArray)
}
if (v) {
if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {
let dom = document.getElementsByClassName('input-select-unit')[1]
dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()
} else {
let dom = document.getElementsByClassName('input-select-unit')[1]
dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()
}
} else {
if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {
let dom = document.getElementsByClassName('input-select-unit')[1]
dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()
} else {
let dom = document.getElementsByClassName('input-select-unit')[1]
dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()
}
}
}
get smooth() {
@ -479,12 +551,12 @@ class PolylineObject extends Base {
break
}
this.options.lengthByMeter = this.computeDistance(
this.options.positions,
2,
ground
)
this.lengthUnit = this.lengthUnit
// this.options.lengthByMeter = this.computeDistance(
// this.options.positions,
// 2,
// ground
// )
// this.lengthUnit = this.lengthUnit
this._elms.heightMode && (this._elms.heightMode.value = heightModeName)
this._elms.heightModeObject && (this._elms.heightModeObject.legp_searchActive(
heightModeName
@ -740,29 +812,6 @@ class PolylineObject extends Base {
}, //点击确认按钮事件回调
clear: () => {
this.labelLineColor = 'rgba(0,255,255,0.5)'
} //点击清空按钮事件回调
})
this._elms.labelLineColor[i] = lineColorPicker
})
}
}
get labelBackgroundColorStart() {
return this.options.label.backgroundColor[0]
}
set labelBackgroundColorStart(v) {
this.options.label.backgroundColor[0] = v
this.label.backgroundColor = [v, this.label.backgroundColor[1]]
if (this._elms.labelBackgroundColorStart) {
this._elms.labelBackgroundColorStart.forEach((item, i) => {
let labelBackgroundColorStartPicker = new ewPlugins('colorpicker', {
el: item.el,
size: 'mini', //颜色box类型
alpha: true, //是否开启透明度
defaultColor: this.labelBackgroundColorStart,
disabled: false, //是否禁止打开颜色选择器
openPickerAni: 'opacity', //打开颜色选择器动画
sure: color => {
this.labelBackgroundColorStart = color
}, //点击确认按钮事件回调
clear: () => {
@ -1271,12 +1320,18 @@ class PolylineObject extends Base {
PolylineObject.createLabel(that)
// that.entity.polyline.positionsLngLat = positions
that.renewPolygon(fromDegreesArray)
that.options.lengthByMeter = that.computeDistance(positions, 2, ground)
that.lengthUnit = that.options['length-unit']
syncData(that.sdk, that.options.id)
if (that.options.show) {
setSplitDirection(0, that.options.id)
}
that.computeDistance(
positions,
2
).then(res => {
that.options.lengthByMeter = res
that.lengthUnit = that.options['length-unit']
syncData(that.sdk, that.options.id)
if (that.options.show) {
setSplitDirection(0, that.options.id)
}
})
// if (this.options['nose-to-tail']) {
// let array = []
@ -1504,6 +1559,50 @@ class PolylineObject extends Base {
})
}
let nameData = [
{
name: '空间长度',
value: '空间长度'
},
{
name: '投影长度',
value: '投影长度'
},
{
name: '地表长度',
value: '地表长度'
}
]
let nameDataLegpObject = legp(
this._DialogObject._element.content.getElementsByClassName(
'input-select-unit-box'
)[0],
'.input-select-unit'
)
if (nameDataLegpObject) {
nameDataLegpObject.legp_search(nameData)
let nameDataLegpElm = this._DialogObject._element.content
.getElementsByClassName('input-select-unit')[0]
.getElementsByTagName('input')[0]
this._elms.wordsName = [nameDataLegpElm]
nameDataLegpElm.value = this.options['words-name']
for (let i = 0; i < nameData.length; i++) {
if (nameData[i].value === nameDataLegpElm.value) {
nameDataLegpObject.legp_searchActive(nameData[i].value)
break
}
}
nameDataLegpElm.addEventListener('input', () => {
for (let i = 0; i < nameData.length; i++) {
if (nameData[i].value === nameDataLegpElm.value) {
this.wordsName = nameData[i].value
break
}
}
})
}
// 原始长度单位
let unitData = [
{
@ -1520,12 +1619,13 @@ class PolylineObject extends Base {
this._DialogObject._element.content.getElementsByClassName(
'input-select-unit-box'
)[0],
'.input-select-unit'
'.input-select-unit',
1
)
if (unitDataLegpObject) {
unitDataLegpObject.legp_search(unitData)
let unitDataLegpElm = this._DialogObject._element.content
.getElementsByClassName('input-select-unit')[0]
.getElementsByClassName('input-select-unit')[1]
.getElementsByTagName('input')[0]
this._elms.lengthUnit = [unitDataLegpElm]
unitDataLegpElm.value = this.options['length-unit']
@ -1544,113 +1644,128 @@ class PolylineObject extends Base {
}
})
}
//
// 拟合长度单位
let fitUnitData = [
{
name: '米',
value: '米'
},
{
name: '千米',
value: '千米'
}
]
// let fitUnitData = [
// {
// name: '米',
// value: '米'
// },
// {
// name: '千米',
// value: '千米'
// }
// ]
let fitUnitDataLegpObject = legp(
this._DialogObject._element.content.getElementsByClassName(
'input-select-fit-unit-box'
)[0],
'.input-select-fit-unit'
)
if (fitUnitDataLegpObject) {
fitUnitDataLegpObject.legp_search(fitUnitData)
let fitUnitDataLegpElm = this._DialogObject._element.content
.getElementsByClassName('input-select-fit-unit')[0]
.getElementsByTagName('input')[0]
this._elms.fitLengthUnit = [fitUnitDataLegpElm]
fitUnitDataLegpElm.value = this.options['fit-length-unit']
for (let i = 0; i < fitUnitData.length; i++) {
if (fitUnitData[i].value === fitUnitDataLegpElm.value) {
fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)
break
}
}
fitUnitDataLegpElm.addEventListener('input', () => {
for (let i = 0; i < fitUnitData.length; i++) {
if (fitUnitData[i].value === fitUnitDataLegpElm.value) {
this.fitLengthUnit = fitUnitData[i].value
break
}
}
})
}
// let fitUnitDataLegpObject = legp(
// this._DialogObject._element.content.getElementsByClassName(
// 'input-select-fit-unit-box'
// )[0],
// '.input-select-fit-unit'
// )
// if (fitUnitDataLegpObject) {
// fitUnitDataLegpObject.legp_search(fitUnitData)
// let fitUnitDataLegpElm = this._DialogObject._element.content
// .getElementsByClassName('input-select-fit-unit')[0]
// .getElementsByTagName('input')[0]
// this._elms.fitLengthUnit = [fitUnitDataLegpElm]
// fitUnitDataLegpElm.value = this.options['fit-length-unit']
// for (let i = 0; i < fitUnitData.length; i++) {
// if (fitUnitData[i].value === fitUnitDataLegpElm.value) {
// fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)
// break
// }
// }
// fitUnitDataLegpElm.addEventListener('input', () => {
// for (let i = 0; i < fitUnitData.length; i++) {
// if (fitUnitData[i].value === fitUnitDataLegpElm.value) {
// this.fitLengthUnit = fitUnitData[i].value
// break
// }
// }
// })
// }
let lineTypeData = [
{
name: '实线',
name: '<i class="icon line"></i>实线',
value: '实线',
key: 0
key: 0,
icon: 'line'
},
{
name: '虚线',
name: '<i class="icon dash-line"></i>虚线',
value: '虚线',
key: 1
key: 1,
icon: 'dash-line'
},
{
name: '泛光',
name: '<i class="icon light-line"></i>泛光',
value: '泛光',
key: 2
key: 2,
icon: 'light-line'
},
{
name: '尾迹光线',
name: '<i class="icon tail-line"></i>尾迹光线',
value: '尾迹光线',
key: 3
key: 3,
icon: 'tail-line'
},
{
name: '多尾迹光线',
name: '<i class="icon mult-tail-line"></i>多尾迹光线',
value: '多尾迹光线',
key: 4
key: 4,
icon: 'mult-tail-line'
},
{
name: '流动虚线1',
name: '<i class="icon flow-dash-line1"></i>流动虚线1',
value: '流动虚线1',
key: 5
key: 5,
icon: 'flow-dash-line1'
},
{
name: '流动虚线2',
name: '<i class="icon flow-dash-line2"></i>流动虚线2',
value: '流动虚线2',
key: 6
key: 6,
icon: 'flow-dash-line2'
},
{
name: '流动箭头1',
name: '<i class="icon pic-line1"></i>流动箭头1',
value: '流动箭头1',
key: 7
key: 7,
icon: 'pic-line1'
},
{
name: '流动箭头2',
name: '<i class="icon pic-line2"></i>流动箭头2',
value: '流动箭头2',
key: 8
key: 8,
icon: 'pic-line2'
},
{
name: '流动箭头3',
name: '<i class="icon pic-line3"></i>流动箭头3',
value: '流动箭头3',
key: 9
key: 9,
icon: 'pic-line3'
},
{
name: '流动箭头4',
name: '<i class="icon pic-line4"></i>流动箭头4',
value: '流动箭头4',
key: 10
key: 10,
icon: 'pic-line4'
},
{
name: '流动箭头5',
name: '<i class="icon pic-line5"></i>流动箭头5',
value: '流动箭头5',
key: 11
key: 11,
icon: 'pic-line5'
},
{
name: '流动箭头6',
name: '<i class="icon pic-line6"></i>流动箭头6',
value: '流动箭头6',
key: 12
key: 12,
icon: 'pic-line6'
}
]
let lineTypeDataLegpObject = legp(
@ -1661,6 +1776,11 @@ class PolylineObject extends Base {
)
if (lineTypeDataLegpObject) {
lineTypeDataLegpObject.legp_search(lineTypeData)
let iActiveElm2 = document.createElement('i')
iActiveElm2.className = 'icon icon-active'
this._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2)
let lineTypeDataLegpElm = this._DialogObject._element.content
.getElementsByClassName('input-select-line-type')[0]
.getElementsByTagName('input')[0]
@ -1669,6 +1789,7 @@ class PolylineObject extends Base {
if (lineTypeData[i].key === this.options.type) {
lineTypeDataLegpObject.legp_searchActive(lineTypeData[i].value)
lineTypeDataLegpElm.value = lineTypeData[i].value
iActiveElm2.className = `icon icon-active ${lineTypeData[i].icon}`
break
}
}
@ -1676,6 +1797,7 @@ class PolylineObject extends Base {
for (let i = 0; i < lineTypeData.length; i++) {
if (lineTypeData[i].value === lineTypeDataLegpElm.value) {
this.lineType = lineTypeData[i].key
iActiveElm2.className = `icon icon-active ${lineTypeData[i].icon}`
//控制参数显隐
if (2 < this.lineType && this.lineType < 13) {//贴图参数
@ -1696,6 +1818,11 @@ class PolylineObject extends Base {
})
}
let heightBoxElm = this._DialogObject._element.content.getElementsByClassName('height-box')[0]
let heightElm = heightBoxElm.getElementsByClassName('height')[0]
let heightConfirmElm = this._DialogObject._element.content.getElementsByClassName('height-confirm')[0]
@ -2019,21 +2146,41 @@ class PolylineObject extends Base {
alt: fromDegreesArray[i + 2]
})
}
this.options.fitLengthByMeter = this.computeDistance(
// this.options.fitLengthByMeter = this.computeDistance(
// array,
// 2,
// ground
// )
let _this = this
this.computeDistance(
array,
2,
ground
)
this.options['words-name']
).then(res => {
_this.options.fitLengthByMeter = res
_this.lengthUnit = _this.options['length-unit']
})
} else {
this.options.fitLengthByMeter = this.computeDistance(
let _this = this
this.computeDistance(
positions,
2,
ground
)
this.options['words-name']
).then(res => {
_this.options.fitLengthByMeter = res
_this.lengthUnit = _this.options['length-unit']
})
}
this.fitLengthUnit = this.options['fit-length-unit']
this.options.lengthByMeter = this.computeDistance(positions, 2, ground)
this.lengthUnit = this.options['length-unit']
let _this = this
this.computeDistance(
positions,
2,
this.options['words-name']
).then(res => {
_this.options.lengthByMeter = res
_this.lengthUnit = this.options['length-unit']
})
return fromDegreesArray
}