| | |
| | | import { defaultsDeep } from 'lodash-es'; |
| | | import type { Overlay } from 'ol'; |
| | | import { Feature, Map as OpenLayerMap, View } from 'ol'; |
| | | import type { Extent } from 'ol/extent'; |
| | | import { extend, getTopLeft, getWidth } from 'ol/extent'; |
| | | import type { FeatureLike } from 'ol/Feature'; |
| | | import MVT from 'ol/format/MVT.js'; |
| | |
| | | return position; |
| | | } |
| | | |
| | | async gaodeAddressSearch(address,city) { |
| | | async gaodeAddressSearch(address, city) { |
| | | this.gaodeApiKey = 'eea6302da02576fe3f3dd3ba1fbe0a04'; |
| | | // const url = `https://restapi.amap.com/v3/assistant/inputtips?output=json&city=010&keywords=${address}=${this.gaodeApiKey}`; |
| | | // 搜索 POI |
| | |
| | | } |
| | | drawLayer: VectorLayer<VectorSource<Feature<Geometry>>, Feature<Geometry>> = null; |
| | | private isDrawStatus = false; |
| | | |
| | | |
| | | removeDrawLayer() { |
| | | if (!this.drawLayer) return; |
| | |
| | | }); |
| | | // 添加新的feature |
| | | // this.drawLayer.getSource().addFeature(feature); |
| | | |
| | | |
| | | // 添加矩形图层到地图 |
| | | this.map.addLayer(this.drawLayer); |
| | |
| | | // 调整视图以适应最小外接矩形 |
| | | this.map.getView().fit(extent, { |
| | | maxZoom: 15, |
| | | padding: [50, 50, 50, 50] // 添加内边距使视图更美观 |
| | | padding: [50, 50, 50, 50], // 添加内边距使视图更美观 |
| | | }); |
| | | } |
| | | |
| | |
| | | return overlay; |
| | | } |
| | | |
| | | adjustViewToMarkers() { |
| | | getAllMarkerOverlays() { |
| | | const overlays = this.map.getOverlays().getArray(); |
| | | |
| | | const filteredOverlays = overlays.filter((overlay) => { |
| | | const type = overlay.get('type'); |
| | | return type === OverlayType.Marker; |
| | | }); |
| | | this.adjustViewToOverlays(filteredOverlays); |
| | | return overlays.filter((overlay) => overlay.get('type') === OverlayType.Marker); |
| | | } |
| | | |
| | | adjustViewToOverlays(overlays: Overlay[]) { |
| | | if (overlays.length === 0) return; |
| | | adjustViewToMarkers() { |
| | | const overlays = this.getAllMarkerOverlays(); |
| | | this.adjustViewToOverlays(overlays); |
| | | } |
| | | |
| | | getAllMarkerOverlaysExtent() { |
| | | const overlays = this.getAllMarkerOverlays(); |
| | | const extent = this.getOverlaysExtent(overlays); |
| | | return extent; |
| | | } |
| | | |
| | | getOverlaysExtent(overlays: Overlay[]) { |
| | | const extent = overlays.reduce<number[] | null>((ext, item) => { |
| | | const coord = item.getPosition(); |
| | | |
| | |
| | | } |
| | | return [Math.min(ext[0], coord[0]), Math.min(ext[1], coord[1]), Math.max(ext[2], coord[0]), Math.max(ext[3], coord[1])]; |
| | | }, null); |
| | | return extent; |
| | | } |
| | | |
| | | adjustViewToOverlays(overlays: Overlay[]) { |
| | | if (overlays.length === 0) return; |
| | | const extent = this.getOverlaysExtent(overlays); |
| | | if (extent) { |
| | | this.fitExtend(extent); |
| | | } |
| | |
| | | } |
| | | |
| | | zoomToLayers() { |
| | | let extent = this.getAllMarkerOverlaysExtent(); |
| | | const layers = this.getAllLayerModels(); |
| | | if (!layers || layers.length === 0) return; |
| | | if (layers.length > 0) { |
| | | // 获取所有图层的范围 |
| | | extent = layers.reduce((extent, layer) => { |
| | | const layerExtent = layer.getExtent(); |
| | | |
| | | // 获取所有图层的范围 |
| | | const extent = layers.reduce((extent, layer) => { |
| | | const layerExtent = layer.getExtent(); |
| | | if (!extent) { |
| | | return layerExtent; |
| | | } |
| | | |
| | | if (!extent) { |
| | | return layerExtent; |
| | | } |
| | | // 合并范围 |
| | | return extend(extent, layerExtent); |
| | | }, extent); |
| | | |
| | | // 合并范围 |
| | | return extend(extent, layerExtent); |
| | | }, null); |
| | | |
| | | if (!extent) return; |
| | | } |
| | | |
| | | // 聚焦到合并后的范围 |
| | | this.map.getView().fit(extent, { |