diff --git a/public/data/points.json b/public/data/points.json index 94e5f44..9bc4135 100644 --- a/public/data/points.json +++ b/public/data/points.json @@ -1,16 +1,16 @@ { - "startPoint": "114.26344,27.800982", - "endPoint": "114.284668,27.794961", + "startPoint": "114.312888,27.796612", + "endPoint": "114.336525,27.767989", "viaPoints": [ { "time": "1694352000000", - "points": "114.272329,27.797299" + "points": "114.334239,27.779261" } ], "avoidPoints": [ { "time": "1694352003000", - "points": "114.27882,27.792857" + "points": "" } ], "avoidAreas": [ diff --git a/src/assets/scss/index.scss b/src/assets/scss/index.scss index efbf4cc..9434f0c 100644 --- a/src/assets/scss/index.scss +++ b/src/assets/scss/index.scss @@ -80,3 +80,20 @@ html { .flex-warp { flex-wrap: wrap; } +.el-form-item { + display: flex!important; + justify-content: space-between; + margin-bottom: 12px!important; +} +.el-form-item__label { + letter-spacing: -1px; + min-width: 130px!important; + padding: 0!important; + white-space: nowrap; /* 强制不换行 */ + flex-shrink: 0; + font-size: 16px!important; +} +.el-input__inner { + height: 24px; + line-height: 24px; +} \ No newline at end of file diff --git a/src/views/home/home.vue b/src/views/home/home.vue index 9e79994..b7aff2a 100644 --- a/src/views/home/home.vue +++ b/src/views/home/home.vue @@ -2,11 +2,21 @@
- - - - - + + + + + + + + + + + + + + +
清除
确定
路线隐蔽规划
@@ -38,12 +48,12 @@
参数
- + - + - +
- +
- +
隐蔽添加
- - + + - + @@ -115,14 +125,14 @@ 参与路线规划
- - + + - + - + @@ -426,6 +436,9 @@ export default { } }, async mounted() { + [...document.querySelectorAll('*')].forEach(n => + console.log(window.getComputedStyle(n).fontFamily) +) this.viewer = null await this.getMapOption() this.$nextTick(async () => { @@ -466,6 +479,9 @@ export default { pitch: -35, }, }, + defaultLabelStyle: { + font: '16px "DengXian",sans-serif', + } // basemaps: [ // { // id: "image-tdss", @@ -1264,8 +1280,16 @@ export default { graphic?.remove() this.viaPoints = this.viaPoints.filter((viaPoint) => viaPoint.style.time !== row.time) } else { - const graphic = this.viaPoints.find((viaPoint) => viaPoint.style.time === row.time) - this.updatePointPosition(graphic, row.points) + if (this.viaPoints.length > 0) { + const graphic = this.viaPoints.find( + (viaPoint) => viaPoint.style.time === row.time + ) + this.updatePointPosition(graphic, row.points) + } else { + const time = new Date().getTime() + row.time = time + this.addPointToMap('viaPoints', row, time) + } } } else if (type === 'avoidPoints') { if (!row.points) { @@ -1279,8 +1303,16 @@ export default { graphic?.remove() this.avoidPoints = this.avoidPoints.filter((avoidPoint) => avoidPoint.style.time !== row.time) } else { - const graphic = this.avoidPoints.find((avoidPoint) => avoidPoint.style.time === row.time) - this.updatePointPosition(graphic, row.points) + if (this.avoidPoints.length > 0) { + const graphic = this.avoidPoints.find( + (avoidPoint) => avoidPoint.style.time === row.time + ) + this.updatePointPosition(graphic, row.points) + } else { + const time = new Date().getTime() + row.time = time + this.addPointToMap('avoidPoints', row, time) + } } } else if (type === 'avoidAreas') { if (!row.points) { @@ -1294,8 +1326,16 @@ export default { graphic?.remove() this.avoidAreas = this.avoidAreas.filter((avoidArea) => avoidArea.style.time !== row.time) } else { - const graphic = this.avoidAreas.find((avoidArea) => avoidArea.style.time === row.time) - this.updatePolygonPosition(graphic, row.points) + if (this.avoidAreas.length > 0) { + const graphic = this.avoidAreas.find( + (avoidArea) => avoidArea.style.time === row.time + ) + this.updatePolygonPosition(graphic, row.points) + } else { + const time = new Date().getTime() + row.time = time + this.addPolygonToMap('avoidAreas', row, time) + } } } }, @@ -1870,15 +1910,93 @@ export default { const coordsToUse = isForward ? segCoords : [...segCoords].reverse() // === 使用第一个版本的精细连接逻辑,但加入第二个版本的途经点切片 === + const lastPt = segmentPath[segmentPath.length - 1]; + const firstOfSeg = coordsToUse[0]; const lastPt = segmentPath[segmentPath.length - 1] const firstOfSeg = coordsToUse[0] + const distLastToFirst = this.calculateDistance(lastPt, firstOfSeg); + + // 如果是途经点,需要找到终点垂足在当前位置 + const endPerpNearest = this.findNearestPointWithIndex(coordsToUse, endConnection.perpendicularPoint); + const endNi = endPerpNearest.index; const distLastToFirst = this.calculateDistance(lastPt, firstOfSeg) // 如果是途经点,需要找到终点垂足在当前位置 const endPerpNearest = this.findNearestPointWithIndex(coordsToUse, endConnection.perpendicularPoint) const endNi = endPerpNearest.index + if (distLastToFirst < 1e-6) { + // 精度上相同,直接接上(跳过第一个) + // 如果是途经点,需要切片到垂足 + if (endConnection.type === 'via') { + segmentPath.push(...coordsToUse.slice(1, endNi + 1)); + // 保存垂直点之后的路网后半截 + viaPerpRemainingCoords = coordsToUse.slice(endNi); + } else { + segmentPath.push(...coordsToUse.slice(1)); + } + } else { + // 找到 coordsToUse 上与 lastPt 最近的索引 + const nearestInfo = this.findNearestPointWithIndex(coordsToUse, lastPt); + const ni = nearestInfo.index; + + // === 整合第二个版本的途经点切片逻辑 === + if (endConnection.type === 'via') { + // 途经点处理:统一以终点垂足为切片终点 + if (ni <= endNi) { + segmentPath.push(...coordsToUse.slice(ni, endNi + 1)); + // 关键:保存垂直点之后的路网后半截(供后续路径延续) + viaPerpRemainingCoords = coordsToUse.slice(endNi); + } else { + const reversedSlice = coordsToUse.slice(endNi, ni + 1).reverse(); + segmentPath.push(...reversedSlice); + // 关键:保存垂直点之后的路网后半截(反向场景需要反转回去) + const originalRemaining = coordsToUse.slice(endNi); + viaPerpRemainingCoords = originalRemaining.reverse(); + } + } else { + // 非途经点:使用第一个版本的完整连接逻辑 + if (ni === 0) { + // 从头开始接(直接接) + segmentPath.push(...coordsToUse); + } else if (ni === coordsToUse.length - 1) { + // 最近点是段尾 —— 说明我们需要反向接(取反转) + const rev = [...coordsToUse].reverse(); + // 以 rev 的第一个点连接 + if (this.calculateDistance(lastPt, rev[0]) < 1e-6) { + segmentPath.push(...rev.slice(1)); + } else { + // 否则直接把最近点加入并向最近端延伸(避免断链) + segmentPath.push(coordsToUse[ni]); + // 选择靠近终点的方向延伸(更短的一侧) + const distToStart = this.calculateDistance(coordsToUse[ni], coordsToUse[0]); + const distToEnd = this.calculateDistance(coordsToUse[ni], coordsToUse[coordsToUse.length - 1]); + if (distToStart <= distToEnd) { + const toStart = coordsToUse.slice(0, ni).reverse(); + segmentPath.push(...toStart); + } else { + const toEnd = coordsToUse.slice(ni + 1); + segmentPath.push(...toEnd); + } + } + } else { + // 最近点在中间:选择向起点或终点延伸,取较短的一侧 + segmentPath.push(coordsToUse[ni]); + const distToStart = this.calculateDistance(coordsToUse[ni], coordsToUse[0]); + const distToEnd = this.calculateDistance(coordsToUse[ni], coordsToUse[coordsToUse.length - 1]); + if (distToStart <= distToEnd) { + const toStart = coordsToUse.slice(0, ni).reverse(); + segmentPath.push(...toStart); + } else { + const toEnd = coordsToUse.slice(ni + 1); + segmentPath.push(...toEnd); + } + } + } + } + } + } if (distLastToFirst < 1e-6) { // 精度上相同,直接接上(跳过第一个) // 如果是途经点,需要切片到垂足