| | |
| | | }; |
| | | return urlMap[type]; |
| | | }; |
| | | type MapConfig = { |
| | | sourceType: GaoDeSourceType; |
| | | markerIsVisible: boolean; |
| | | }; |
| | | |
| | | type OLEventType = 'blackClick'; |
| | | type OLMapOptions = { |
| | | container: HTMLDivElement; |
| | | |
| | | view?: ViewOptions; |
| | | }; |
| | | } & MapConfig; |
| | | export class OLMap { |
| | | map: OpenLayerMap; |
| | | source: XYZ; |
| | | private eventMap: Map<OLEventType, Function[]>; |
| | | activeSourceType: Ref<GaoDeSourceType> = ref(GaoDeSourceType.Vector); |
| | | overlayIsVisible: Ref<boolean> = ref(true); |
| | | markerIsVisible: Ref<boolean> = ref(true); |
| | | private emit(eventName: OLEventType, ...args: any[]) { |
| | | const handlers = this.eventMap?.get(eventName); |
| | | if (handlers) { |
| | |
| | | } |
| | | |
| | | constructor(options: OLMapOptions) { |
| | | const { container, view } = defaultsDeep(options, { |
| | | const { container, view, sourceType, markerIsVisible } = defaultsDeep(options, { |
| | | view: { |
| | | center: [13247019.404399557, 4721671.572580107], |
| | | zoom: 8, |
| | | }, |
| | | sourceType: GaoDeSourceType.Vector, |
| | | markerIsVisible: true, |
| | | } as OLMapOptions) as OLMapOptions; |
| | | this.source = new XYZ({ |
| | | crossOrigin: 'anonymous', |
| | |
| | | layers: [layer], // 添加图层 |
| | | view: new View(view), |
| | | }); |
| | | this.activeSourceType.value = sourceType; |
| | | this.markerIsVisible.value = markerIsVisible; |
| | | this.setSourceUrl(this.activeSourceType.value); |
| | | this.listenMapClick(); |
| | | this.addBasicControl(); |
| | |
| | | stopEvent: false, |
| | | className: 'z-[999]', |
| | | }); |
| | | eleOverlay.setVisible(this.overlayIsVisible.value); |
| | | eleOverlay.setVisible(this.markerIsVisible.value); |
| | | |
| | | return eleOverlay; |
| | | } |
| | |
| | | } |
| | | } |
| | | }); |
| | | this.overlayIsVisible.value = visible; |
| | | this.markerIsVisible.value = visible; |
| | | } |
| | | |
| | | getConfig(): MapConfig { |
| | | return { |
| | | sourceType: this.activeSourceType.value, |
| | | markerIsVisible: this.markerIsVisible.value, |
| | | }; |
| | | } |
| | | |
| | | setConfig(config: MapConfig) { |
| | | this.activeSourceType.value = config.sourceType; |
| | | this.markerIsVisible.value = config.markerIsVisible; |
| | | this.setSourceUrl(this.activeSourceType.value); |
| | | this.toggleMarkerOverlayVisible(this.markerIsVisible.value); |
| | | } |
| | | |
| | | private addBasicControl() { |
| | | this.map.addControl(new ZoomSlider()); |
| | | // this.map.addControl(new ZoomSlider()); |
| | | // this.map.addControl(new FullScreen()); |
| | | const container = this.map.getViewport(); |
| | | if (!container) return; |
| | | const olZoom = container.querySelector('.ol-zoom') as HTMLElement; |
| | | if (!olZoom) return; |
| | | olZoom.style.display = 'none'; |
| | | } |
| | | |
| | | /** |
| | | * 放大地图 |
| | | */ |
| | | zoomIn() { |
| | | const view = this.map.getView(); |
| | | const zoom = view.getZoom(); |
| | | view.setZoom(zoom + 1); |
| | | } |
| | | |
| | | /** |
| | | * 缩小地图 |
| | | */ |
| | | zoomOut() { |
| | | const view = this.map.getView(); |
| | | const zoom = view.getZoom(); |
| | | view.setZoom(zoom - 1); |
| | | } |
| | | |
| | | getWMTS = () => { |