From 87e19b5a396ac8fed6a551828b87d263f6425c31 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 16 十月 2025 10:26:12 +0800
Subject: [PATCH] 2025.10.16 修改季度报告生成逻辑
---
src/utils/map/sector.js | 501 +++++++++++++++++++++++++++++++++----------------------
1 files changed, 299 insertions(+), 202 deletions(-)
diff --git a/src/utils/map/sector.js b/src/utils/map/sector.js
index f2aa490..f409e4d 100644
--- a/src/utils/map/sector.js
+++ b/src/utils/map/sector.js
@@ -1,232 +1,329 @@
import { map, object3Dlayer } from './index_old';
import calculate from './calculate';
import imgLocation from '@/assets/mipmap/location.png';
+import { FactorDatas } from '@/model/FactorDatas';
var _defaultDeg = 30,
_sector = undefined,
- _sectorViews = {};
+ _sectorViews = new Map(),
+ // 鍔ㄧ敾杞ㄨ抗
+ _sectorViewsAna = new Map();
-export default {
- clearSector() {
- var list = [];
- for (const key in _sectorViews) {
- list.push(_sectorViews[key]);
- }
- if (list.length > 0) {
- map.remove(list);
- _sectorViews = {};
- }
- if (_sector) {
- object3Dlayer.remove(_sector);
- }
- },
- drawSector(fDatas, i) {
- const lnglat = fDatas.lnglats_GD[i];
- let windDir = fDatas.factor[17].datas[i].factorData;
- let windSpeed = fDatas.factor[16].datas[i].factorData;
- if (!windDir) windDir = 0;
- if (!windSpeed) windSpeed = 0;
+var _ptSector = undefined,
+ _ptSectorViews = new Map();
- if (windSpeed > 10) {
- return;
+const zoomStyleMapping = {
+ 14: 0,
+ 15: 0,
+ 16: 0,
+ 17: 0,
+ 18: 0,
+ 19: 0,
+ 20: 0
+};
+
+function sectorParams(fDatas, i) {
+ const lnglat = fDatas.lnglats_GD[i];
+ let windDir = fDatas.factor[17].datas[i].factorData;
+ let windSpeed = fDatas.factor[16].datas[i].factorData;
+ if (!windDir) windDir = 0;
+ if (!windSpeed) windSpeed = 0;
+
+ // if (windSpeed > 10) {
+ // return;
+ // }
+
+ var sDeg = windDir - _defaultDeg; //鎵囧舰璧峰瑙掑害锛堜互涓婃柟浣滀负0搴︼級
+ // sDeg = sDeg < 0 ? sDeg + 360 : sDeg
+ var eDeg = windDir + _defaultDeg; //鎵囧舰缁撴潫瑙掑害
+ // eDeg = eDeg < 0 ? eDeg + 360 : eDeg
+
+ var distance = windSpeed * 10 * 60; //鍗婂緞(椋庨��*鏃堕棿)
+ var lnglat2 = calculate.getLatLon(lnglat, distance, sDeg);
+ var lnglat3 = calculate.getLatLon(lnglat, distance, windDir);
+ var lnglat4 = calculate.getLatLon(lnglat, distance, eDeg);
+ var list = calculate.parse2LngLat([lnglat, lnglat2, lnglat3, lnglat4]);
+
+ var distance2 = windSpeed * 5 * 60; //鍗婂緞(椋庨��*鏃堕棿)
+ var lnglat2_2 = calculate.getLatLon(lnglat, distance2, sDeg);
+ var lnglat2_3 = calculate.getLatLon(lnglat, distance2, windDir);
+ var lnglat2_4 = calculate.getLatLon(lnglat, distance2, eDeg);
+ var list2 = calculate.parse2LngLat([lnglat2_2, lnglat2_3, lnglat2_4]);
+
+ distance = distance.toFixed(0);
+ distance2 = distance2.toFixed(0);
+
+ return { sDeg, eDeg, lnglat, distance, distance2, list, list2 };
+}
+
+/**
+ * 鍙缉鏀剧殑鏍囪
+ * 鏃犳硶淇敼position锛堝畼缃戞湭鎵惧埌鐩稿叧api锛�
+ */
+function elasticMarker(position, content) {
+ // eslint-disable-next-line no-undef
+ return new AMap.ElasticMarker({
+ zoom: [14, 20],
+ position: position,
+ styles: [
+ {
+ icon: {
+ img: imgLocation,
+ size: [16, 16], //鍙鍖哄煙鐨勫ぇ灏�
+ ancher: [8, 16], //閿氱偣
+ fitZoom: 18, //鏈�鍚堥�傜殑绾у埆
+ scaleFactor: 1, //鍦板浘鏀惧ぇ涓�绾х殑缂╂斁姣斾緥绯绘暟
+ maxScale: 2, //鏈�澶ф斁澶ф瘮渚�
+ minScale: 1 //鏈�灏忔斁澶ф瘮渚�
+ },
+ label: {
+ content: content,
+ offset: [-35, 0],
+ position: 'BM',
+ minZoom: 10
+ }
+ }
+ ],
+ zoomStyleMapping: zoomStyleMapping
+ });
+}
+
+/**
+ * 鏂囨湰鏍囪
+ * 鍙慨鏀筽osition
+ */
+function textMaker(position, text) {
+ // eslint-disable-next-line no-undef
+ return new AMap.Text({
+ text: text,
+ position: position,
+ style: {
+ 'font-size': '13px',
+ 'text-align': 'center',
+ color: 'white',
+ 'background-color': 'transparent',
+ 'text-shadow': 'black 2px 2px 2px',
+ 'border-radius': '2px',
+ border: '0px',
+ padding: '4px'
}
- if (_sector != undefined) {
- this.clearSector();
+ });
+}
+
+function drawSectorMesh(
+ sDeg,
+ eDeg,
+ lnglat,
+ distance,
+ distance2,
+ isPollutinTrace
+) {
+ if (distance == 0 || distance2 == 0) {
+ return false;
+ }
+ // eslint-disable-next-line no-undef
+ var sector = new AMap.Object3D.Mesh();
+ sector.transparent = true;
+ sector.backOrFront = 'both';
+
+ var unit = 5;
+
+ var p0 = calculate.lngLatToGeodeticCoord([lnglat])[0];
+ var geometry = sector.geometry;
+
+ var count = distance / unit;
+ var unitDeg = (eDeg - sDeg) / count;
+
+ for (let i = 0; i < count; i++) {
+ var angle1 = sDeg + unitDeg * i;
+ var angle2 = sDeg + unitDeg * (i + 1);
+
+ var p1 = calculate.getLatLon(lnglat, distance, angle1);
+ var p2 = calculate.getLatLon(lnglat, distance, angle2);
+ var p3 = calculate.getLatLon(lnglat, distance2, angle1);
+ var p4 = calculate.getLatLon(lnglat, distance2, angle2);
+
+ var coors = calculate.lngLatToGeodeticCoord([p1, p2, p3, p4]);
+ const l1 = coors[0];
+ const l2 = coors[1];
+ const l3 = coors[2];
+ const l4 = coors[3];
+
+ // 鍐呮祴鎵囧舰
+ geometry.vertices.push(p0.x, p0.y, 0);
+ geometry.vertices.push(l3.x, l3.y, 0);
+ geometry.vertices.push(l4.x, l4.y, 0);
+ if (!isPollutinTrace) {
+ // 鍐呮祴鎵囧舰棰滆壊
+ geometry.vertexColors.push(1, 0.11, 0.25, 0.6);
+ geometry.vertexColors.push(1, 0.11, 0.25, 0.6);
+ geometry.vertexColors.push(1, 0.11, 0.25, 0.6);
+ } else {
+ geometry.vertexColors.push(0.25, 0.11, 1, 0.6);
+ geometry.vertexColors.push(0.25, 0.11, 1, 0.6);
+ geometry.vertexColors.push(0.25, 0.11, 1, 0.6);
}
- // eslint-disable-next-line no-undef
- var sector = new AMap.Object3D.Mesh();
- sector.transparent = true;
- sector.backOrFront = 'both';
-
- var unit = 5;
-
- var sDeg = windDir - _defaultDeg; //鎵囧舰璧峰瑙掑害锛堜互涓婃柟浣滀负0搴︼級
- // sDeg = sDeg < 0 ? sDeg + 360 : sDeg
- var eDeg = windDir + _defaultDeg; //鎵囧舰缁撴潫瑙掑害
- // eDeg = eDeg < 0 ? eDeg + 360 : eDeg
-
- var distance = windSpeed * 10 * 60; //鍗婂緞(椋庨��*鏃堕棿)
- var lnglat2 = calculate.getLatLon(lnglat, distance, sDeg);
- var lnglat3 = calculate.getLatLon(lnglat, distance, windDir);
- var lnglat4 = calculate.getLatLon(lnglat, distance, eDeg);
- var list = calculate.parse2LngLat([lnglat, lnglat2, lnglat3, lnglat4]);
-
- var distance2 = windSpeed * 5 * 60; //鍗婂緞(椋庨��*鏃堕棿)
- var lnglat2_2 = calculate.getLatLon(lnglat, distance2, sDeg);
- var lnglat2_3 = calculate.getLatLon(lnglat, distance2, windDir);
- var lnglat2_4 = calculate.getLatLon(lnglat, distance2, eDeg);
- var list2 = calculate.parse2LngLat([lnglat2_2, lnglat2_3, lnglat2_4]);
-
- var p0 = calculate.lngLatToGeodeticCoord([lnglat])[0];
- var geometry = sector.geometry;
-
- var count = distance / unit;
- var unitDeg = (eDeg - sDeg) / count;
- for (let i = 0; i < count; i++) {
- var angle1 = sDeg + unitDeg * i;
- var angle2 = sDeg + unitDeg * (i + 1);
-
- var l1 = calculate.getLatLon(lnglat, distance, angle1);
- var l2 = calculate.getLatLon(lnglat, distance, angle2);
- var l3 = calculate.getLatLon(lnglat, distance2, angle1);
- var l4 = calculate.getLatLon(lnglat, distance2, angle2);
-
- var coors = calculate.lngLatToGeodeticCoord([l1, l2, l3, l4]);
- l1 = coors[0];
- l2 = coors[1];
- l3 = coors[2];
- l4 = coors[3];
-
- // 鍐呮祴鎵囧舰
- geometry.vertices.push(p0.x, p0.y, 0);
- geometry.vertices.push(l3.x, l3.y, 0);
- geometry.vertices.push(l4.x, l4.y, 0);
+ if (!isPollutinTrace) {
// 澶栦晶鎵囧舰
geometry.vertices.push(l3.x, l3.y, 0);
geometry.vertices.push(l4.x, l4.y, 0);
geometry.vertices.push(l1.x, l1.y, 0);
geometry.vertices.push(l2.x, l2.y, 0);
- // console.log(l3.x + ',' + l3.y + ' | ' + l1.x + ',' + l1.y);
-
- // 鍐呮祴鎵囧舰棰滆壊
- geometry.vertexColors.push(1, 0.11, 0.25, 0.6);
- geometry.vertexColors.push(1, 0.11, 0.25, 0.6);
- geometry.vertexColors.push(1, 0.11, 0.25, 0.6);
//澶栦晶鎵囧舰棰滆壊
geometry.vertexColors.push(1, 0.37, 0.07, 0.5);
geometry.vertexColors.push(1, 0.37, 0.07, 0.5);
geometry.vertexColors.push(1, 0.37, 0.07, 0.5);
geometry.vertexColors.push(1, 0.37, 0.07, 0.5);
+ }
+ // console.log(l3.x + ',' + l3.y + ' | ' + l1.x + ',' + l1.y);
- var index = i * 7;
+ if (!isPollutinTrace) {
+ const index = i * 7;
geometry.faces.push(index, index + 1, index + 2);
geometry.faces.push(index + 3, index + 4, index + 5);
geometry.faces.push(index + 4, index + 5, index + 6);
+ } else {
+ const index = i * 3;
+ geometry.faces.push(index, index + 1, index + 2);
+ // geometry.faces.push(index + 3, index + 4, index + 5);
+ // geometry.faces.push(index + 4, index + 5, index + 6);
}
- object3Dlayer.add(sector);
- _sector = sector;
+ }
+ object3Dlayer.add(sector);
+ isPollutinTrace ? (_ptSector = sector) : (_sector = sector);
+ return true;
+}
- distance = distance.toFixed(0);
- distance2 = distance2.toFixed(0);
- const zoomStyleMapping = {
- 14: 0,
- 15: 0,
- 16: 0,
- 17: 0,
- 18: 0,
- 19: 0,
- 20: 0
- };
- //10鍒嗛挓鎵囧舰
- // eslint-disable-next-line no-undef
- var text15 = new AMap.ElasticMarker({
- zoom: [14, 20],
- position: list[2],
- styles: [
- {
- icon: {
- img: imgLocation,
- size: [16, 16], //鍙鍖哄煙鐨勫ぇ灏�
- ancher: [8, 16], //閿氱偣
- fitZoom: 18, //鏈�鍚堥�傜殑绾у埆
- scaleFactor: 1, //鍦板浘鏀惧ぇ涓�绾х殑缂╂斁姣斾緥绯绘暟
- maxScale: 2, //鏈�澶ф斁澶ф瘮渚�
- minScale: 1 //鏈�灏忔斁澶ф瘮渚�
- },
- label: {
- content: '<div>10鍒嗛挓</div>',
- offset: [-35, 0],
- position: 'BM',
- minZoom: 15
- }
- }
- ],
- zoomStyleMapping: zoomStyleMapping
- });
- _sectorViews['text10'] = text15;
- // eslint-disable-next-line no-undef
- var textM = new AMap.ElasticMarker({
- zoom: [14, 20],
- position: list[1],
- styles: [
- {
- icon: {
- img: imgLocation,
- size: [16, 16], //鍙鍖哄煙鐨勫ぇ灏�
- ancher: [8, 16], //閿氱偣
- fitZoom: 18, //鏈�鍚堥�傜殑绾у埆
- scaleFactor: 1, //鍦板浘鏀惧ぇ涓�绾х殑缂╂斁姣斾緥绯绘暟
- maxScale: 2, //鏈�澶ф斁澶ф瘮渚�
- minScale: 1 //鏈�灏忔斁澶ф瘮渚�
- },
- label: {
- content: `<div>${distance}m</div>`,
- offset: [-35, 0],
- position: 'BM',
- minZoom: 15
- }
- }
- ],
- zoomStyleMapping: zoomStyleMapping
- });
- _sectorViews['textM'] = textM;
- map.add(_sectorViews['text10']);
- map.add(_sectorViews['textM']);
+function drawTextMaker(list, list2, distance, distance2, isPollutinTrace) {
+ const _sectorViewsTmp = isPollutinTrace ? _ptSectorViews : _sectorViews;
+ //10鍒嗛挓鎵囧舰
+ if (!isPollutinTrace) {
+ const a = _sectorViewsTmp.get('text10-t');
+ if (a == undefined) {
+ const text10t = textMaker(list[2], '10鍒嗛挓');
+ _sectorViewsTmp.set('text10-t', text10t);
+ const textM10t = textMaker(list[1], distance + 'm');
+ _sectorViewsTmp.set('textM10-t', textM10t);
+ map.add([text10t, textM10t]);
+ } else {
+ _sectorViewsTmp.get('text10-t').setPosition(list[2]);
+ _sectorViewsTmp.get('textM10-t').setPosition(list[1]);
+ _sectorViewsTmp.get('textM10-t').setText(distance + 'm');
+ }
+ }
+ //5鍒嗛挓鎵囧舰
+ const b = _sectorViewsTmp.get('text5-t');
+ if (b == undefined) {
+ const text5t = textMaker(list2[1], '5鍒嗛挓');
+ _sectorViewsTmp.set('text5-t', text5t);
+ const textM5t = textMaker(list2[0], distance2 + 'm');
+ _sectorViewsTmp.set('textM5-t', textM5t);
+ map.add([text5t, textM5t]);
+ } else {
+ _sectorViewsTmp.get('text5-t').setPosition(list2[1]);
+ _sectorViewsTmp.get('textM5-t').setPosition(list2[0]);
+ _sectorViewsTmp.get('textM5-t').setText(distance2 + 'm');
+ }
+}
- //5鍒嗛挓鎵囧舰
- let pList = list2;
- // eslint-disable-next-line no-undef
- var text5 = new AMap.ElasticMarker({
- position: pList[1],
- styles: [
- {
- icon: {
- img: imgLocation,
- size: [16, 16], //鍙鍖哄煙鐨勫ぇ灏�
- ancher: [8, 16], //閿氱偣
- fitZoom: 18, //鏈�鍚堥�傜殑绾у埆
- scaleFactor: 1, //鍦板浘鏀惧ぇ涓�绾х殑缂╂斁姣斾緥绯绘暟
- maxScale: 2, //鏈�澶ф斁澶ф瘮渚�
- minScale: 1 //鏈�灏忔斁澶ф瘮渚�
- },
- label: {
- content: `<div>5鍒嗛挓</div>`,
- offset: [-35, 0],
- position: 'BM',
- minZoom: 15
- }
- }
- ],
- zoomStyleMapping: zoomStyleMapping
- });
- _sectorViews['text5'] = text5;
- // eslint-disable-next-line no-undef
- var textM5 = new AMap.ElasticMarker({
- position: pList[0],
- styles: [
- {
- icon: {
- img: imgLocation,
- size: [16, 16], //鍙鍖哄煙鐨勫ぇ灏�
- ancher: [8, 16], //閿氱偣
- fitZoom: 18, //鏈�鍚堥�傜殑绾у埆
- scaleFactor: 1, //鍦板浘鏀惧ぇ涓�绾х殑缂╂斁姣斾緥绯绘暟
- maxScale: 2, //鏈�澶ф斁澶ф瘮渚�
- minScale: 1 //鏈�灏忔斁澶ф瘮渚�
- },
- label: {
- content: `<div>${distance2}m</div>`,
- offset: [-35, 0],
- position: 'BM',
- minZoom: 15
- }
- }
- ],
- zoomStyleMapping: zoomStyleMapping
- });
- _sectorViews['textM5'] = textM5;
- map.add(_sectorViews['textM5']);
- map.add(_sectorViews['text5']);
+function drawElasticMarker(list, list2, distance, distance2) {
+ //10鍒嗛挓鎵囧舰
+ const text10 = elasticMarker(list[2], '<div>10鍒嗛挓</div>');
+ _sectorViews.set('text10', text10);
+ const textM = elasticMarker(list[1], `<div>${distance}m</div>`);
+ _sectorViews.set('textM10', textM);
+ map.add([text10, textM]);
+
+ //5鍒嗛挓鎵囧舰
+ const text5 = elasticMarker(list2[1], '<div>5鍒嗛挓</div>');
+ _sectorViews.set('text5', text5);
+ const textM5 = elasticMarker(list2[0], `<div>${distance2}m</div>`);
+ _sectorViews.set('textM5', textM5);
+ map.add([text5, textM5]);
+}
+
+export default {
+ /**
+ * 娓呯┖鎵囧舰鍜屾枃鏈爣璁�
+ */
+ clearSector() {
+ var list = [];
+ for (const iterator of _sectorViews) {
+ list.push(iterator[1]);
+ }
+ for (const iterator of _sectorViewsAna) {
+ list.push(iterator[1]);
+ }
+ if (list.length > 0) {
+ map.remove(list);
+ _sectorViews.clear();
+ }
+ this.clearSectorMesh();
+ },
+ clearSectorPt() {
+ var list = [];
+ for (const iterator of _ptSectorViews) {
+ list.push(iterator[1]);
+ }
+ if (list.length > 0) {
+ map.remove(list);
+ _ptSectorViews.clear();
+ }
+ if (_ptSector) {
+ object3Dlayer.remove(_ptSector);
+ }
+ },
+ /**
+ * 鍙竻绌烘墖褰�
+ */
+ clearSectorMesh() {
+ if (_sector) {
+ object3Dlayer.remove(_sector);
+ }
+ },
+ sectorParams: sectorParams,
+ /**
+ * 缁樺埗鎵囧舰
+ * @param {FactorDatas} fDatas
+ * @param {number} i
+ * @returns 鏁版嵁鍧愭爣鐐瑰拰鎵囧舰鏈�澶у崐寰�
+ */
+ drawSector(fDatas, i) {
+ this.clearSector();
+ const { sDeg, eDeg, lnglat, distance, distance2, list, list2 } =
+ sectorParams(fDatas, i);
+ if (drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2)) {
+ // 褰撻閫熷ぇ浜�0缁樺埗浜嗘墖褰㈡椂锛屾墠缁樺埗瀵瑰簲鐨勮窛绂荤瓑鏂囨湰鏍囪
+ // drawElasticMarker(list, list2, distance, distance2);
+ drawTextMaker(list, list2, distance, distance2);
+ }
+ return { p: lnglat, r: distance };
+ },
+
+ /**
+ * 缁樺埗杞ㄨ抗鍔ㄧ敾涓殑鎵囧舰
+ * @param {FactorDatas} fDatas
+ * @param {number} i
+ */
+ drawSectorAna(fDatas, i) {
+ this.clearSectorMesh();
+ const { sDeg, eDeg, lnglat, distance, distance2, list, list2 } =
+ sectorParams(fDatas, i);
+ if (drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2)) {
+ drawTextMaker(list, list2, distance, distance2);
+ }
+ },
+
+ drawSectorPt(fDatas, i) {
+ if (_ptSector) {
+ object3Dlayer.remove(_ptSector);
+ }
+ const { sDeg, eDeg, lnglat, distance, distance2, list, list2 } =
+ sectorParams(fDatas, i);
+ if (drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2, true)) {
+ drawTextMaker(list, list2, distance, distance2, true);
+ }
+ return { p: lnglat, r: distance };
}
};
--
Gitblit v1.9.3