| | |
| | | import { map, isDragging } from '@/utils/map/index_old'; |
| | | import marks from '@/utils/map/marks'; |
| | | import Layer from '@/utils/map/3dLayer'; |
| | | |
| | | /** |
| | | * 坐标集合的最西南角和最东北角 |
| | | * @param {*} list |
| | | * list 是接口获取的点 的数组 |
| | | */ |
| | | const getBound = (list) => { |
| | | const offset = 0.005; |
| | | let south = null; |
| | | let west = null; |
| | | let north = null; |
| | | let east = null; |
| | | for (let item of list) { |
| | | // 排除无效经纬度 |
| | | if (item[0] == 0 && item[1] == 0) { |
| | | continue; |
| | | } |
| | | if ((west && item[0] < west) || !west) { |
| | | west = item[0] - offset; |
| | | } |
| | | if ((south && item[1] < south) || !south) { |
| | | south = item[1] - offset; |
| | | } |
| | | if ((east && item[0] > east) || !east) { |
| | | east = item[0] + offset; |
| | | } |
| | | if ((north && item[1] > north) || !north) { |
| | | north = item[1] + offset; |
| | | } |
| | | } |
| | | if (!south || !west || !north || !east) { |
| | | return { sw: null, ne: null }; |
| | | } else { |
| | | return { sw: [west, south], ne: [east, north] }; |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * 根据中心点出发的半径,得到合适的地图缩放系数 |
| | | * 高德地图缩放系数每减少1,则地图展示的实际距离放大1倍 |
| | | * 高德地图缩放系数范围[3, 18] |
| | | * @param {*} d |
| | | */ |
| | | const distanceToZoom = (d) => { |
| | | let baseDis = 250, |
| | | z = 0; |
| | | while (baseDis < d) { |
| | | baseDis *= 2; |
| | | z++; |
| | | } |
| | | |
| | | // 多余的地图缩放系数 |
| | | const x = (baseDis - d) / (baseDis / 2); |
| | | z -= x; |
| | | z = z < 0 ? 0 : z; |
| | | |
| | | z = 18 - z; |
| | | z = z < 3 ? 3 : z; |
| | | return z; |
| | | }; |
| | | |
| | | export default { |
| | | setCenter(lnglat) { |
| | | if (isDragging) { |
| | | setCenter(lnglat, ignore = false) { |
| | | if (!ignore && isDragging) { |
| | | return; |
| | | } |
| | | var now = new Date(); |
| | | if ( |
| | | this.lasttime == undefined || |
| | | now.getTime() - this.lasttime.getTime() >= 1000 |
| | | now.getTime() - this.lasttime.getTime() >= 200 |
| | | ) { |
| | | map.setCenter(lnglat); |
| | | this.lasttime = now; |
| | | } |
| | | }, |
| | | addViews(view) { |
| | | map.add(view); |
| | | }, |
| | | removeViews(view) { |
| | | map.remove(view); |
| | | }, |
| | | clearMap() { |
| | | marks.clearMassMarks(); |
| | | map.clearMap(); |
| | | Layer.clear(); |
| | | }, |
| | | setFitView(views) { |
| | | if (views) { |
| | | map.setFitView(views); |
| | | } else { |
| | | map.setFitView(); |
| | | } |
| | | }, |
| | | setFitSector({ p, r }) { |
| | | this.setCenter(p); |
| | | const z = distanceToZoom(r); |
| | | map.setZoom(z); |
| | | }, |
| | | setBound(lnglats_GD) { |
| | | const { sw, ne } = getBound(lnglats_GD); |
| | | if (!sw || !ne) { |
| | | return; |
| | | } |
| | | // eslint-disable-next-line no-undef |
| | | var mybounds = new AMap.Bounds(sw, ne); // sw, ne > [xxx,xxx], [xxx,xxx] |
| | | map.setBounds(mybounds); |
| | | } |
| | | }; |