| | |
| | | * 文本标记 |
| | | * 可修改position |
| | | */ |
| | | function textMaker(position, text) { |
| | | function textMaker(position, text, anchor, type) { |
| | | let style = {}; |
| | | if (type == 'data') { |
| | | style = { |
| | | 'font-size': '12px', |
| | | 'text-align': 'center', |
| | | color: 'white', |
| | | background: '#122b54a9', |
| | | 'text-shadow': 'black 2px 2px 2px', |
| | | border: '0px', |
| | | 'margin-top': '4px' |
| | | }; |
| | | } else if (type == 'rank') { |
| | | style = { |
| | | 'font-size': '14px', |
| | | 'text-align': 'center', |
| | | color: 'white', |
| | | background: 'transparent', |
| | | 'text-shadow': 'black 2px 2px 2px', |
| | | 'border-radius': '2px', |
| | | border: '1px solid #122b54a9', |
| | | 'margin-bottom': '4px' |
| | | }; |
| | | } |
| | | // eslint-disable-next-line no-undef |
| | | return new AMap.Text({ |
| | | text: text, |
| | | anchor, |
| | | 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' |
| | | } |
| | | style: style |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 海量文本标注 |
| | | */ |
| | | function textLabelMarker(position, text, direction) { |
| | | function textLabelMarker(position, text, direction, style) { |
| | | // eslint-disable-next-line no-undef |
| | | return new AMap.LabelMarker({ |
| | | position: position, |
| | |
| | | content: text ? text + '' : '', |
| | | direction: direction ? direction : 'center', |
| | | style: { |
| | | 'border-radius': '.25rem', |
| | | fontSize: 12, |
| | | fillColor: '#fff', |
| | | // strokeColor: 'rgba(0, 0, 0, 0.5)', |
| | | // strokeWidth: 3, |
| | | backgroundColor: '#122b54a9' |
| | | // padding: [3, 10], |
| | | strokeColor: 'rgba(0, 0, 0, 1)', |
| | | strokeWidth: 4, |
| | | // backgroundColor: '#122b54a9', |
| | | padding: [3, 10], |
| | | // backgroundColor: 'yellow', |
| | | // borderColor: '#ccc', |
| | | // borderWidth: 3 |
| | | borderColor: '#ccc', |
| | | borderWidth: 30 |
| | | } |
| | | } |
| | | }); |
| | |
| | | |
| | | /** |
| | | * 绘制一组多边形 |
| | | * @param {*} points |
| | | * @param {Array} points 网格坐标点数组 |
| | | * @param {Boolean} draw 是否创建完成后同时绘制 |
| | | */ |
| | | drawPolylines(points) { |
| | | drawPolylines({ points, draw, event }) { |
| | | const gridViews = []; |
| | | points.forEach((p) => { |
| | | let path = p.map((v) => { |
| | | // eslint-disable-next-line no-undef |
| | | return new AMap.LngLat(v[0], v[1]); |
| | | }); |
| | | //创建多边形 Polygon 实例 |
| | | // eslint-disable-next-line no-undef |
| | | var polygon = new AMap.Polygon({ |
| | | path: path, //路径 |
| | | path: p.path, //路径 |
| | | fillColor: '#fff', //多边形填充颜色 |
| | | strokeWeight: 1, //线条宽度,默认为 2 |
| | | strokeColor: 'white', //线条颜色 |
| | | fillOpacity: 0 |
| | | fillOpacity: 0, |
| | | extData: p.extData |
| | | }); |
| | | |
| | | if (typeof event === 'function') { |
| | | event(polygon); |
| | | } |
| | | gridViews.push(polygon); |
| | | }); |
| | | map.add(gridViews); |
| | | map.setFitView(gridViews); |
| | | if (draw) { |
| | | map.add(gridViews); |
| | | map.setFitView(gridViews); |
| | | } |
| | | return gridViews; |
| | | }, |
| | | |
| | | drawGridText(points, textViews) { |
| | | drawGridText(points, textViews, anchor, type) { |
| | | // if (textViews) { |
| | | // points.forEach((p, i) => { |
| | | // textViews[i].setPosition(p.lnglat_GD); |
| | | // textViews[i].setText(p.data); |
| | | // }); |
| | | // return textViews; |
| | | // } else { |
| | | // const _textViews = []; |
| | | // points.forEach((p) => { |
| | | // const m = textMaker(p.lnglat_GD, p.data, anchor, type); |
| | | // _textViews.push(m); |
| | | // }); |
| | | // map.add(_textViews); |
| | | // return { textViews: _textViews }; |
| | | // } |
| | | if (textViews) { |
| | | points.forEach((p, i) => { |
| | | textViews[i].setPosition(p.lnglat_GD); |
| | | textViews[i].setText(p.data); |
| | | }); |
| | | return textViews; |
| | | } else { |
| | | const _textViews = []; |
| | | points.forEach((p) => { |
| | | const m = textMaker(p.lnglat_GD, p.data); |
| | | _textViews.push(m); |
| | | }); |
| | | map.add(_textViews); |
| | | return _textViews; |
| | | map.remove(textViews); |
| | | } |
| | | const _textViews = []; |
| | | points.forEach((p) => { |
| | | const m = textMaker(p.lnglat_GD, p.data, anchor, type); |
| | | _textViews.push(m); |
| | | }); |
| | | // map.add(_textViews); |
| | | return { textViews: _textViews }; |
| | | }, |
| | | |
| | | drawGridTextLabel(points, textViews, labelsLayer, direction) { |
| | |
| | | animation: false |
| | | }); |
| | | const _textViews = []; |
| | | // const m = textLabelMarker([121.329723, 31.240625], 25); |
| | | // _textViews.push(m); |
| | | // labelsLayer.add(m); |
| | | points.forEach((p) => { |
| | | const m = textLabelMarker(p.lnglat_GD, p.data, direction); |
| | | _textViews.push(m); |
| | |
| | | labelsLayer.add(m); |
| | | }); |
| | | map.add(labelsLayer); |
| | | map.on('zoomend', () => { |
| | | console.log(map.getZoom()); |
| | | }); |
| | | // map.on('zoomend', () => { |
| | | // console.log(map.getZoom()); |
| | | // }); |
| | | return { textViews: _textViews, labelsLayer }; |
| | | } |
| | | }, |
| | | |
| | | drawGridColor(gridViews, texts, factorName) { |
| | | gridViews.forEach((g, i) => { |
| | | const data = parseFloat(texts[i]); |
| | | const { color, nextColor, range, nextRange } = |
| | | Legend.getStandardColorAndNext(factorName, data); |
| | | const ratio = (data - range) / (nextRange - range); |
| | | const _color = getColorBetweenTwoColors( |
| | | color.map((v) => v * 255), |
| | | nextColor.map((v) => v * 255), |
| | | ratio |
| | | ); |
| | | g.setOptions({ |
| | | fillColor: _color, |
| | | fillOpacity: color[3] == 0 ? 0 : 0.7 |
| | | }); |
| | | /** |
| | | * 根据遥测数据,设置对应网格的标准色,返回有数据的网格 |
| | | * @param {Array} gridViews 网格多边形对象数组 |
| | | * @param {Array} gridDataDetail 卫星遥测数据数组 |
| | | * @param {string} factorName 监测因子名称 |
| | | * @param {number} opacity 透明度 |
| | | */ |
| | | drawGridColor(gridViews, gridDataDetail, factorName, opacity, zIndex) { |
| | | const res = []; |
| | | // 遍历卫星遥测数据数组 |
| | | gridDataDetail.forEach((d, i) => { |
| | | if (d.pm25) { |
| | | const grid = gridViews[i]; |
| | | |
| | | // 根据遥测数据计算网格颜色 |
| | | const data = d.pm25; |
| | | const { color, nextColor, range, nextRange } = |
| | | Legend.getStandardColorAndNext(factorName, data); |
| | | const ratio = (data - range) / (nextRange - range); |
| | | const _color = getColorBetweenTwoColors( |
| | | color.map((v) => v * 255), |
| | | nextColor.map((v) => v * 255), |
| | | ratio |
| | | ); |
| | | grid.setOptions({ |
| | | zIndex: zIndex ? zIndex : 10, |
| | | fillColor: _color, |
| | | fillOpacity: opacity ? opacity : color[3] == 0 ? 0 : 0.7 |
| | | }); |
| | | |
| | | res.push(grid); |
| | | } |
| | | }); |
| | | |
| | | return res; |
| | | // gridViews.forEach((g, i) => { |
| | | // const data = parseFloat(gridDataDetail[i]); |
| | | // const { color, nextColor, range, nextRange } = |
| | | // Legend.getStandardColorAndNext(factorName, data); |
| | | // const ratio = (data - range) / (nextRange - range); |
| | | // const _color = getColorBetweenTwoColors( |
| | | // color.map((v) => v * 255), |
| | | // nextColor.map((v) => v * 255), |
| | | // ratio |
| | | // ); |
| | | // g.setOptions({ |
| | | // fillColor: _color, |
| | | // fillOpacity: color[3] == 0 ? 0 : 0.7 |
| | | // }); |
| | | // }); |
| | | }, |
| | | |
| | | drawGridColorCustom(gridViews, texts) { |
| | | var max,min |
| | | texts.forEach(t => { |
| | | if (!max || t > max) { |
| | | max = t |
| | | drawGridColorCustom(gridViews, gridDataDetail, opacity) { |
| | | var max, min; |
| | | gridDataDetail.forEach((t) => { |
| | | if (!t.pm25) return; |
| | | if (!max || t.pm25 > max) { |
| | | max = t.pm25; |
| | | } |
| | | if (!min || t < min) { |
| | | min = t |
| | | if (!min || t.pm25 < min) { |
| | | min = t.pm25; |
| | | } |
| | | }); |
| | | gridViews.forEach((g, i) => { |
| | | const data = parseFloat(texts[i]); |
| | | const { color, nextColor, range, nextRange } = |
| | | Legend.getCustomColorAndNext(data, min, max); |
| | | const ratio = (data - range) / (nextRange - range); |
| | | |
| | | const _color = getColorBetweenTwoColors( |
| | | color.map((v) => v * 255), |
| | | nextColor.map((v) => v * 255), |
| | | ratio |
| | | ); |
| | | g.setOptions({ |
| | | fillColor: _color, |
| | | // fillOpacity: color[3] |
| | | fillOpacity: color[3] == 0 ? 0 : 0.7 |
| | | }); |
| | | const res = []; |
| | | // 遍历卫星遥测数据数组 |
| | | gridDataDetail.forEach((d, i) => { |
| | | if (d.pm25) { |
| | | const grid = gridViews[i]; |
| | | |
| | | // 根据遥测数据计算网格颜色 |
| | | const data = d.pm25; |
| | | const { color, nextColor, range, nextRange } = |
| | | Legend.getCustomColorAndNext(data, min, max); |
| | | const ratio = (data - range) / (nextRange - range); |
| | | |
| | | const _color = getColorBetweenTwoColors( |
| | | color.map((v) => v * 255), |
| | | nextColor.map((v) => v * 255), |
| | | ratio |
| | | ); |
| | | grid.setOptions({ |
| | | fillColor: _color, |
| | | fillOpacity: opacity ? opacity : color[3] == 0 ? 0 : 0.7 |
| | | }); |
| | | |
| | | res.push(grid); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | return res; |
| | | // gridViews.forEach((g, i) => { |
| | | // const data = parseFloat(gridDataDetail[i]); |
| | | // const { color, nextColor, range, nextRange } = |
| | | // Legend.getCustomColorAndNext(data, min, max); |
| | | // const ratio = (data - range) / (nextRange - range); |
| | | |
| | | // const _color = getColorBetweenTwoColors( |
| | | // color.map((v) => v * 255), |
| | | // nextColor.map((v) => v * 255), |
| | | // ratio |
| | | // ); |
| | | // g.setOptions({ |
| | | // fillColor: _color, |
| | | // fillOpacity: color[3] == 0 ? 0 : 0.7 |
| | | // }); |
| | | // }); |
| | | } |
| | | }; |