<template> <div id="mapContainer" ref="mapContainer" style="width: 100%;height: 100%;"></div> </template> <script> import 'ol/ol.css'; import Map from 'ol/Map'; import OSM from 'ol/source/OSM'; import XYZ from 'ol/source/XYZ'; import VectorSource from 'ol/source/Vector'; import Tile from 'ol/layer/Tile'; import VectorLayer from 'ol/layer/Vector'; import Style from 'ol/style/Style'; import Stroke from 'ol/style/Stroke'; import Icon from 'ol/style/Icon'; import View from 'ol/View'; import Feature from 'ol/Feature'; import Overlay from 'ol/Overlay'; import {Point, LineString} from 'ol/geom'; import {get as getProj, fromLonLat} from 'ol/proj'; import {ZoomSlider, Zoom} from 'ol/control'; import {containsCoordinate} from 'ol/extent'; import {v4} from 'uuid' let olMap = null; export default { name: 'MapComponent', data() { return { }; }, created(){ this.$nextTick(() => { setTimeout(()=>{ this.init() }, 100) }) }, props: [], mounted () { }, methods: { init(){ let center = fromLonLat([116.41020, 39.915119]); if (mapParam.center) { center = fromLonLat(mapParam.center); } const view = new View({ center: center, zoom: mapParam.zoom || 10, projection: this.projection, maxZoom: mapParam.maxZoom || 19, minZoom: mapParam.minZoom || 1, }); let tileLayers = []; if (mapParam.tilesUrl) { const tilesUrls = Array.isArray(mapParam.tilesUrl) ? mapParam.tilesUrl : [mapParam.tilesUrl] tilesUrls.forEach(tilesUrl => { tileLayers.push(new Tile({ source: new XYZ({ projection: getProj("EPSG:3857"), wrapX: false, tileSize: 256 || mapParam.tileSize, url: tilesUrl }) })) }) }else { tileLayers.push(new Tile({ preload: 4, source: new OSM(), })) } olMap = new Map({ target: this.$refs.mapContainer, // 容器ID layers: tileLayers, // 默认图层 view: view, // 视图 controls:[ // 控件 // new ZoomSlider(), new Zoom(), ] , }) console.log(3222) }, setCenter(point){ }, zoomIn(zoom){ }, zoomOut(zoom){ }, centerAndZoom(point,zoom,callback){ var zoom_ = olMap.getView().getZoom(); zoom = zoom|| zoom_; var duration = 600; olMap.getView().setCenter(fromLonLat(point)) olMap.getView().animate({ zoom: zoom , duration: duration }); }, panTo(point, zoom){ let duration = 800; olMap.getView().cancelAnimations() olMap.getView().animate({ center: fromLonLat(point), duration: duration }); if (!containsCoordinate(olMap.getView().calculateExtent(), fromLonLat(point))) { olMap.getView().animate({ zoom: olMap.getView().getZoom() - 1, duration: duration / 2 }, { zoom: zoom || olMap.getView().getZoom(), duration: duration / 2 }); } }, fit(layer){ let extent = layer.getSource().getExtent(); if (extent) { olMap.getView().fit(extent,{ duration : 600, padding: [100, 100, 100, 100] }); } }, openInfoBox(position, content, offset){ let id = v4() // let infoBox = document.createElement("div"); // infoBox.innerHTML = content ; // infoBox.setAttribute("infoBoxId", id) let overlay = new Overlay({ id:id, autoPan:true, autoPanAnimation:{ duration: 250 }, element: content, positioning:"bottom-center", offset:offset, // className:overlayStyle.className }); olMap.addOverlay(overlay); overlay.setPosition(fromLonLat(position)); return id; }, closeInfoBox(id){ olMap.getOverlayById(id).setPosition(undefined) // olMap.removeOverlay(olMap.getOverlayById(id)) }, /** * 添加图层 * @param data * [ * { * * position: [119.1212,45,122], * image: { * src:"/images/123.png", * anchor: [0.5, 0.5] * * } * } * * ] */ addLayer(data, clickEvent){ let style = new Style(); if (data.length > 0) { let features = []; for (let i = 0; i < data.length; i++) { let feature = new Feature(new Point(fromLonLat(data[i].position))); feature.customData = data[i].data; let cloneStyle = style.clone() cloneStyle.setImage(new Icon({ anchor: data[i].image.anchor, crossOrigin: 'Anonymous', src: data[i].image.src, })) feature.setStyle(cloneStyle) features.push(feature); } let source = new VectorSource(); source.addFeatures(features); let vectorLayer = new VectorLayer({ source:source, style:style, renderMode:"image", declutter: false }) olMap.addLayer(vectorLayer) if (typeof clickEvent == "function") { olMap.on("click", (event)=>{ vectorLayer.getFeatures(event.pixel).then((features)=>{ if (features.length > 0) { let items = [] for (let i = 0; i < features.length; i++) { items.push(features[i].customData) } clickEvent(items) } }) }) } return vectorLayer; } }, removeLayer(layer){ olMap.removeLayer(layer) }, addLineLayer(positions) { if (positions.length > 0) { let points = []; for (let i = 0; i < positions.length; i++) { points.push(fromLonLat(positions[i])); } let line = new LineString(points) let lineFeature = new Feature(line); lineFeature.setStyle(new Style({ stroke: new Stroke({ width: 4 , color: "#0c6d6a", }) })) let source = new VectorSource(); source.addFeature(lineFeature); let vectorLayer = new VectorLayer({ source: source, }) olMap.addLayer(vectorLayer) return vectorLayer; } } }, destroyed() { // if (this.jessibuca) { // this.jessibuca.destroy(); // } // this.playing = false; // this.loaded = false; // this.performance = ""; }, } </script> <style> </style>