From da0d06cb06ef3fc55d88cb4a9a52505ac35c03e6 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期三, 26 三月 2025 15:12:31 +0800 Subject: [PATCH] 走航融合(待完成) --- src/model/SatelliteGrid.js | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 271 insertions(+), 17 deletions(-) diff --git a/src/model/SatelliteGrid.js b/src/model/SatelliteGrid.js index dad244c..ad01ca9 100644 --- a/src/model/SatelliteGrid.js +++ b/src/model/SatelliteGrid.js @@ -196,11 +196,7 @@ // 鏍规嵁缁樺埗棰滆壊鏂瑰紡缁樺埗缃戞牸 let resGridViews; if (customColor) { - resGridViews = gridMapUtil.drawGridColorCustom( - res, - gridDataDetail, - style.opacity - ); + resGridViews = gridMapUtil.drawGridColorCustom(res, gridDataDetail); } else { resGridViews = gridMapUtil.drawGridColor( res, @@ -383,8 +379,7 @@ if (useCustomColor) { gridMapUtil.drawGridColorCustom( v.lastGridViews, - lastGridDataDetail, - { opacity, zIndex } + lastGridDataDetail ); } else { gridMapUtil.drawGridColor( @@ -399,20 +394,35 @@ } } - setGridEvent(name, event) { + setGridEvent(tags, name, event) { + const { _mapViewsList, _gridDataDetailList } = this._getMapViews(...tags); + if (!this.events.has(name)) { this.events.set(name, []); } const list = this.events.get(name); if (list.length > 0) { const lastEvent = list[list.length - 1]; - this.mapViews.gridViews.forEach((polygon) => { - polygon.off(name, lastEvent); + _mapViewsList.forEach((v) => { + v.gridViews.forEach((polygon) => { + polygon.off(name, lastEvent); + }); }); } + this.events.get(name).push(event); - this.mapViews.gridViews.forEach((polygon) => { - polygon.on(name, event); + _mapViewsList.forEach((v, i) => { + const gridDataDetailList = _gridDataDetailList[i]; + v.gridViews.forEach((polygon) => { + const { gridCell } = polygon.getExtData(); + const cellIndex = gridCell.cellIndex; + const gridDataDetail = gridDataDetailList.find( + (v) => v.cellId == cellIndex + ); + polygon.on(name, (e) => { + event(gridCell, gridDataDetail); + }); + }); }); } @@ -435,18 +445,19 @@ /** * 灏嗗缁勭綉鏍艰繘琛岃瀺鍚� * 閲嶅彔鐨勭綉鏍艰繘琛岀洃娴嬫暟鎹潎鍊艰绠楀苟閲嶆柊璁$畻瀵瑰簲棰滆壊锛屽舰鎴愭柊鐨勪竴缁勮瀺鍚堢綉鏍� - * @param {...String} tags 闇�瑕佽瀺鍚堢殑缃戞牸鏍囩锛屽綋涓虹┖鏃讹紝榛樿铻嶅悎鎵�鏈夌綉鏍� + * @param {Array} tags 闇�瑕佽瀺鍚堢殑缃戞牸鏍囩锛屽綋涓虹┖鏃讹紝榛樿铻嶅悎鎵�鏈夌綉鏍� */ - mixGrid(tags) { + mixGrid(tags, isMixGridHighlight) { tags.sort((a, b) => { return a < b ? -1 : 1; }); const mixTag = tags.join('-'); if (this.mapViewsMap.has(mixTag)) { this.changeVisibility({ - tag: mixTag, + tags: [mixTag], showGridViews: true }); + this.changeGridColor({ tag: mixTag, isMixGridHighlight }); } else { // const mixMapViews = this._createNewMapViews(); // 鏍规嵁鏍囩tag锛岃幏鍙栧搴斿缁勭綉鏍兼暟鎹� @@ -501,11 +512,13 @@ data: resGridDataDetail, grid: { style: { - isMixGridHighlight: true + isMixGridHighlight: + isMixGridHighlight == undefined ? true : isMixGridHighlight } }, extData: { - name: `璧拌埅铻嶅悎 - ${mixTag}` + name: `璧拌埅铻嶅悎 - ${mixTag}`, + type: 1 } }); } @@ -513,6 +526,247 @@ return mixTag; } + /** + * 缁樺埗鐑姏鍥剧綉鏍� + * @param {string} tag + */ + drawHeatGrid(tag) { + if (!this.mapViewsMap.has(tag) || !this.gridDataDetailMap.has(tag)) { + return; + } + + const heatTag = `heat-${tag}`; + if (this.mapViewsMap.has(heatTag)) { + this.changeVisibility({ + tags: [heatTag], + showGridViews: true + }); + } else { + const _mapViews = this.mapViewsMap.get(tag); + const _gridDataDetail = this.gridDataDetailMap.get(tag); + // const groupId = _gridDataDetail[0].groupId; + // const cellId = _gridDataDetail.cellId; + + const originCellIdList = _gridDataDetail.map((v) => v.cellId); + let headGridDataDetailList = []; + + const width = 120; + const height = 90; + const eachwidth = 10; + const eachheight = 10; + + const searchLength = 3; + + const _dataMap = new Map(); + + _gridDataDetail.forEach((gdd) => { + const searchRes = this.search( + gdd, + width, + height, + eachwidth, + eachheight, + searchLength + ); + if (searchRes.find(v=> v.cellId == 1670)) { + console.log(); + + } + searchRes.forEach((e) => { + if (originCellIdList.indexOf(e.cellId) == -1) { + if (!_dataMap.has(e.cellId)) { + _dataMap.set(e.cellId, { + source: [], + res: {} + }); + } + _dataMap.get(e.cellId).source.push(e); + } + }); + }); + + _dataMap.forEach((v, k) => { + let total = 0, + count = v.source.length; + v.source.forEach((s) => { + total += s.pm25; + }); + v.res = { + isHeatData: true, + groupId: v.source[0].groupId, + cellId: v.source[0].cellId, + pm25: count == 0 ? null : Math.round((total / count) * 10) / 10, + originData: v.source + }; + headGridDataDetailList.push(v.res); + }); + headGridDataDetailList = headGridDataDetailList.concat(_gridDataDetail); + + // 閲嶆柊鎸夌収鐩戞祴鏁版嵁鎺掑簭骞舵爣璁版帓鍚� + headGridDataDetailList.sort((a, b) => { + return b.pm25 - a.pm25; + }); + headGridDataDetailList.forEach((gdd, i) => { + gdd.rank = i + 1; + }); + + this.drawTagGrid({ + tag: heatTag, + data: headGridDataDetailList, + // grid: { + // style: { + // isMixGridHighlight: + // isMixGridHighlight == undefined ? true : isMixGridHighlight + // } + // }, + extData: { + name: `璧拌埅鐑姏鍥� - ${heatTag}`, + type: 2 + } + }); + } + + return heatTag; + } + + drawHeatGrid2(tag, headGridDataDetailList) { + const heatTag = `heat-${tag}`; + if (this.mapViewsMap.has(heatTag)) { + this.changeVisibility({ + tags: [heatTag], + showGridViews: true + }); + } else { + this.drawTagGrid({ + tag: heatTag, + data: headGridDataDetailList, + extData: { + name: `璧拌埅鐑姏鍥� - ${heatTag}`, + type: 2 + } + }); + } + return heatTag; + } + + search(gdd, width, height, eachwidth, eachheight, searchLength) { + function getCellWidthRange(cellId, width, height) { + const total = width * height; + const x = Math.ceil(cellId / total) - 1; + let first = 1 + x * total, + last = width + x * total; + + let scale = 0; + while (scale < height) { + const min = first + scale * width; + const max = last + scale * width; + if (cellId >= min && cellId <= max) { + return [min, max]; + } + scale++; + } + } + + const cellId = gdd.cellId; + // const minData = gdd.pm25 / 2 + const dataOffset = (gdd.pm25 - gdd.pm25 / 2) / 3; + + const hOffset = eachwidth; + const wOffset = 1; + + const cellIdMin = 1; + const cellIdMax = width * height; + + let searchWidth = 0 - searchLength, + searchHeight = 0 - searchLength; + + const result = []; + + const eachRange = getCellWidthRange(cellId, eachwidth, eachheight); + const groupRange = getCellWidthRange( + Math.ceil(cellId / (eachwidth * eachheight)), + width / eachwidth, + height / eachheight + ); + + for (let w = searchWidth; w <= searchLength; w++) { + // 鍏堣繘琛屾í鍚戠殑鍧愭爣鍙樻崲 + let _cellId = cellId + w * wOffset; + if (_cellId < eachRange[0] || _cellId > eachRange[1]) { + const cellOffset = + _cellId < eachRange[0] + ? _cellId - eachRange[0] + : _cellId - eachRange[1]; + + const groupOffset = Math[cellOffset / eachwidth > 0 ? 'ceil' : 'floor']( + cellOffset / eachwidth + ); + + const newEachRange = eachRange.map( + (r) => r + groupOffset * eachwidth * eachheight + ); + + _cellId = + groupOffset > 0 + ? newEachRange[0] + cellOffset - wOffset + : newEachRange[1] + cellOffset + wOffset; + + const _groupId = Math.ceil(_cellId / (eachwidth * eachheight)); + + if (_groupId < groupRange[0] || _groupId > groupRange[1]) { + continue; + } + } + + for (let h = searchHeight; h <= searchLength; h++) { + if (w == 0 && h == 0) continue; + + const _eachRange = getCellWidthRange(_cellId, eachwidth, eachheight); + // if (_eachRange == undefined) { + // console.log(); + + // } + const wOffset = _cellId - _eachRange[0]; + let _resCellId = _cellId + h * hOffset; + if (_resCellId < cellIdMin || _resCellId > cellIdMax) continue; + + const total = eachwidth * eachheight; + const x = Math.ceil(_cellId / total) - 1; + const eachCellIdMin = 1 + x * total; + const eachCellIdMax = total + x * total; + const topCell = eachCellIdMin + wOffset; + const bottomCell = eachCellIdMax - eachwidth + 1 + wOffset; + if (_resCellId < eachCellIdMin || _resCellId > eachCellIdMax) { + const cellOffset = + _resCellId < eachCellIdMin + ? _resCellId - topCell + : _resCellId - bottomCell; + + const newTopCell = + cellOffset > 0 + ? topCell + width * eachheight + : topCell - width * eachheight; + const newBottomCell = + cellOffset > 0 + ? bottomCell + width * eachheight + : bottomCell - width * eachheight; + + _resCellId = + cellOffset > 0 + ? newTopCell + cellOffset - hOffset + : newBottomCell + cellOffset + hOffset; + } + result.push({ + groupId: gdd.groupId, + cellId: _resCellId, + pm25: gdd.pm25 - Math.max(Math.abs(w), Math.abs(h)) * dataOffset + }); + } + } + + return result; + } + _getMapViews(...tags) { let _mapViewsList = [], _gridDataDetailList = []; -- Gitblit v1.9.3