From 43aeea6debfa21df65d75fa544008c5e235c88ca Mon Sep 17 00:00:00 2001 From: ZhaoTongYao <531131322@qq.com> Date: Thu, 2 Jun 2022 15:35:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5screen-map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../duoyuanfuwu/duoyuanfuwufenxi.vue | 7 +- .../visual/components/screen-map/index.vue | 228 +++++++++++++----- 2 files changed, 174 insertions(+), 61 deletions(-) diff --git a/src/views/modules/visual/communityGovern/duoyuanfuwu/duoyuanfuwufenxi.vue b/src/views/modules/visual/communityGovern/duoyuanfuwu/duoyuanfuwufenxi.vue index 6ed17014..4b64c27f 100644 --- a/src/views/modules/visual/communityGovern/duoyuanfuwu/duoyuanfuwufenxi.vue +++ b/src/views/modules/visual/communityGovern/duoyuanfuwu/duoyuanfuwufenxi.vue @@ -447,11 +447,11 @@ export default { //加载地图数据 loadMap () { if (this.isfirstInit) { - this.agencyInfo.level = 'agency' + // this.agencyInfo.level = 'agency' //mapInfo, polygonArray, polIconUrlArray, iconArrays, iconUrlArray this.$refs.map.loadMap(this.agencyInfo, this.polygonList, null, this.distributionsList, this.iconUrlArray, null) } else { - this.$refs.map.refreshMap(this.polygonList, this.distributionsList) + this.$refs.map.refreshMap(this.agencyInfo, this.polygonList, this.distributionsList) } }, @@ -613,6 +613,9 @@ export default { if (!this.agencyInfo.level) { this.agencyInfo.level = 'street' } + if (!this.agencyInfo.agencyLevel) { + this.agencyInfo.agencyLevel = 'street' + } } else { this.$message.error(msg); } diff --git a/src/views/modules/visual/components/screen-map/index.vue b/src/views/modules/visual/components/screen-map/index.vue index 6dc18d83..a8d87ca4 100644 --- a/src/views/modules/visual/components/screen-map/index.vue +++ b/src/views/modules/visual/components/screen-map/index.vue @@ -21,8 +21,8 @@ -->
+ :id="mapId" + :ref="mapId">
@@ -79,6 +82,24 @@ let iconSource; // icon let select;//选中标注 +let iconTextsStyle = { + textAlign: undefined, + font: "18px Arial", + //fontFamily: "Courier New, monospace", + // fontWeight: "bold", + text: '', + backgroundFill: new Fill({ + color: 'rgba(0, 146, 238, 0.75)' + // color: textColorArray[feature.values_.colorIndex] + }), + padding: [4, 10, 4, 10], + //text: "变电站名称", + fill: new Fill({ color: "#ffffff" }), + // stroke: new Stroke({ color: "#ffffff", width: 3 }), + offsetY: -30, + offsetX: -50, + overflow: true, +} let polygonColorArray = [ 'rgba(210, 2, 2, 0.24)', @@ -86,7 +107,19 @@ let polygonColorArray = [ 'rgba(183, 185, 0, 0.16)' ]; + //icon文字样式 +let createTextStyle = function (feature) { + + if (iconTextsStyle) { + let iconTextsStyles = { ...iconTextsStyle } + iconTextsStyles.text = feature.values_ && feature.values_.name || feature.name + return new Text({ ...iconTextsStyles }) + } else { + return null + } + +} //多边形标注样式 var polygonStyleFunction = (function () { return function (feature) { @@ -105,6 +138,8 @@ var polygonStyleFunction = (function () { }; })() + + const vueGis = { name: 'HomeMap', data () { @@ -151,7 +186,7 @@ const vueGis = { iconArrays: [ ], - iconTextStyle: {}, + // iconTextStyle: {}, //policon图标样式 polIconUrlArray: [ @@ -181,32 +216,32 @@ const vueGis = { loadMap (mapInfo, polygonArray, polIconUrlArray, iconArrays, iconUrlArray, iconTextStyle, distanceMax) { this.mapInfo = mapInfo this.polygonArray = polygonArray - this.polIconUrlArray = polIconUrlArray + this.polIconUrlArray = polIconUrlArray || [] this.iconArrays = iconArrays this.iconUrlArray = iconUrlArray - this.iconTextStyle = iconTextStyle + iconTextsStyle = iconTextStyle || iconTextsStyle this.distanceMax = distanceMax // iconArrays.forEach(item => { // console.log(item.type, item.urlIndex, item.latitude, item.longitude) // }); - + //初始化地图 this.initMap() - - if (this.showPolygonLayer) { + + if (this.showPolIconLayer) { + console.log('showPolIconLayer++++++++++++++++++++++', this.showPolIconLayer) //初始化多边形标注图层 - this.initPolygonLayer() + this.initPolIconLayer() //加载当前园区的标注 - this.loadPolygon() + // this.loadPolIcon() } - if (this.showPolIconLayer) { - + if (this.showPolygonLayer) { //初始化多边形标注图层 this.initPolygonLayer() //加载当前园区的标注 - this.loadPolIcon() + this.loadPolygon() } if (this.showIconLayer) { @@ -220,41 +255,51 @@ const vueGis = { this.addOverlay() } - this.addMapClick() }, //刷新地图 - async refreshMap (polygonArray, iconArrays) { - + async refreshMap (mapInfo, polygonArray, iconArrays) { + this.mapInfo = mapInfo + this.polygonArray = [] this.polygonArray = polygonArray this.iconArrays = iconArrays - + if (iconSource) { + iconSource.clear() + } + if (polygonSource) { + polygonSource.clear() + } + if (polIconSource) { + polIconSource.clear() + } + this.initPolIconLayer() + if (this.showPolygonLayer) { - + this.initPolygonLayer() //加载当前园区的标注 this.loadPolygon() } if (this.showPolIconLayer) { - + this.initIconLayer() //加载当前园区的标注 - this.loadPolIcon() + // this.loadPolIcon() } if (this.showIconLayer) { this.loadIcon() } - - + this.setMapLocation() + // gaodeMapLayer.getSource().changed() + }, - //加载多边形 + //加载区域多边形 loadPolygon () { - polygonSource.clear()//清空多边形标注 - + // iconSource.clear() let featureData = []//多边形数据数据 if (this.polygonArray && this.polygonArray.length > 0) {//判断是否存在下级标注 @@ -311,9 +356,11 @@ const vueGis = { }, - //加载多边形的icon + //加载区域多边形的icon loadPolIcon (feature) { + polIconSource.clear() let polyIconFeatures = []; + console.log('feature-----', feature) feature.forEach(oneIcon => { var extent = boundingExtent(oneIcon.getGeometry().getCoordinates()[0]); //获取一个坐标数组的边界,格式为[minx,miny,maxx,maxy] @@ -330,28 +377,27 @@ const vueGis = { id: oneIcon.id_ } }); - + // console.log('oneIcon----', oneIcon) let polyIconStyle = new Style({ image: new Icon({ // anchor: [0.5, 0.5], // imgSize: [32, 32], - scale: 0.5, - src: polIconUrlArray[oneIcon.values_.index - 1] - }) + scale: this.areaScale, + src: this.polIconUrlArray[0] + }), + text: createTextStyle(oneIcon) }); polyIcon.setStyle(polyIconStyle); polyIconFeatures.push(polyIcon); }); - polIconSource.addFeatures(polyIconFeatures); }, //加载icon图标 loadIcon () { iconSource.clear()//清空多边形标注 - if (this.iconArrays && this.iconArrays.length > 0) { let iconFeatures = []; @@ -367,15 +413,14 @@ const vueGis = { info: { ...oneIcon } } }); - let iconStyle = new Style({ image: new Icon({ // anchor: [0.5, 0.5], // imgSize: [32, 32], // scale: 0.5, - src: this.iconUrlArray[oneIcon.urlIndex] + src: oneIcon.urlIndex && this.iconUrlArray[oneIcon.urlIndex] || this.iconUrlArray[0] }), - text: this.createTextStyle(oneIcon) + // text: createTextStyle(oneIcon) }); iconItem.setStyle(iconStyle); @@ -397,18 +442,6 @@ const vueGis = { } }, - //icon文字样式 - createTextStyle (feature) { - if (this.iconTextStyle) { - let iconTextStyle = { ...this.iconTextStyle } - iconTextStyle.text = feature.values_.name - return new Text({ ...iconTextStyle }) - } else { - return null - } - - - }, //计算和中心点距离 computedDistance (lon, lat, max) { @@ -425,7 +458,7 @@ const vueGis = { //初始化地图 initMap () { - this.setMapLocation() + this.firstCentermap() gaodeMapLayer = new TileLayer({ title: "地图", source: new XYZ({ @@ -452,7 +485,7 @@ const vueGis = { layers: [gaodeMapLayer], //加载瓦片图层数据 view: mapView, - target: 'map' + target: this.mapId //目标加载到map中 }) @@ -478,8 +511,53 @@ const vueGis = { }, //设置地图定位的中心点和缩放级别 setMapLocation () { + if (!this.zoom) { + this.setZoom(this.mapInfo.agencyLevel) + } + this.centerPoint = [] + //如果存在中心点(返回时赋值) + if (this.center && this.center.length > 0) { + this.centerPoint = this.center + this.centerFlag = 'point' + this.center = [] + + } else if (polygonLayer.getSource().getFeatures()[0]) {//如果是初次进入,存在下级组织 + this.centerFlag = 'flag_polygon' + this.centerPoint.push(this.mapInfo.longitude) + this.centerPoint.push(this.mapInfo.latitude) + + } else if (this.mapInfo.longitude && this.mapInfo.latitude) { + this.centerPoint.push(this.mapInfo.longitude) + this.centerPoint.push(this.mapInfo.latitude) + this.centerFlag = 'point' + + } else { + this.centerPoint = centerPointGlobal + this.centerFlag = 'point' + } + + // debugger + if (this.centerFlag === 'flag_parent') { + let parentFeatures = parentLayer.getSource().getFeatures()[0] + let polygon = parentFeatures.getGeometry(); + map.getView().fit(polygon, map.getSize()); + this.zoom = map.getView().getZoom() - 1 + + } else if (this.centerFlag === 'flag_polygon') { + let polygonFeatures = polygonLayer.getSource().getFeatures()[0] + let polygon = polygonFeatures.getGeometry(); + map.getView().fit(polygon, map.getSize()); + this.zoom = map.getView().getZoom() - 1 + + } else { + mapView.setCenter(this.centerPoint); + } + mapView.setZoom(this.zoom); + + }, + firstCentermap() { if (this.mapInfo.longitude && this.mapInfo.latitude) { this.centerPoint = [] this.centerPoint.push(this.mapInfo.longitude) @@ -489,7 +567,7 @@ const vueGis = { this.centerPoint = centerPointGlobal } - this.setZoom(this.mapInfo.level) + this.setZoom(this.mapInfo.agencyLevel) }, //根据组织层级设置缩放级别 @@ -507,7 +585,8 @@ const vueGis = { //初始化多边形标注图层 initPolygonLayer () { polygonSource = new VectorSource({ - //features: (new GeoJSON()).readFeatures(geojsonObject) + // features: (new GeoJSON()).readFeatures(geojsonObject) + wrapX: false }); polygonLayer = new VectorLayer({ @@ -515,7 +594,7 @@ const vueGis = { style: polygonStyleFunction, zIndex: 50 }); - + let that = this //选中多边形后的样式 var overlayStyle = (function () { @@ -535,7 +614,7 @@ const vueGis = { }) }), new Style({ - // text: createTextStyle(feature) // 报错 暂时注掉 zty 2022.05.19 + // text: createTextStyle(feature) // 报错 暂时注掉 zhaotongyao 2022.05.19 }) ]; styles['MultiPolygon'] = styles['Polygon']; @@ -558,6 +637,7 @@ const vueGis = { initPolIconLayer () { polIconSource = new VectorSource({ //features: (new GeoJSON()).readFeatures(geojsonObject) + wrapX: false }); polIconLayer = new VectorLayer({ @@ -571,9 +651,9 @@ const vueGis = { //初始化icon图层 initIconLayer () { - iconSource = new VectorSource({ //features: (new GeoJSON()).readFeatures(geojsonObject) + wrapX: false }); iconLayer = new VectorLayer({ @@ -597,6 +677,7 @@ const vueGis = { var container = document.getElementById("popup"); var closer = document.getElementById("popup-closer"); var content = document.getElementById("popup-content"); + var goMore = document.getElementById("popup-goMore") ? document.getElementById("popup-goMore") : null // 创建一个弹窗 Overlay 对象 this.overlay = new Overlay({ @@ -619,6 +700,11 @@ const vueGis = { closer.blur(); return false; }; + if (goMore) { + goMore.onclick = function () { + _that.$emit('lookMore') + }; + } }, //注册地图点击事件 @@ -650,15 +736,27 @@ const vueGis = { }); }, - handleShowPopup (showData, coordinate) { + handleShowPopup (showData, coordinate, isShowMore) { + if (isShowMore) { + document.getElementById("popup-goMore").style.display = 'block' + } else { + document.getElementById("popup-goMore").style.display = 'none' + } console.log(this.overlay.getElement()) + let content = document.getElementById("popup-content"); this.overlay.getElement().style.display = 'block' this.overlay.getElement().parentNode.style.display = 'block' this.overlay.getElement().parentNode.parentNode.style.display = 'block' - var content = document.getElementById("popup-content"); - content.innerHTML = showData; - this.overlay.setPosition(coordinate); //把 overlay 显示到指定的 x,y坐标 + this.overlay.setPosition(coordinate); + //把 overlay 显示到指定的 x,y坐标 + + }, + // 关闭弹窗 + handleClosePopup() { + this.overlay.setPosition(undefined); + document.getElementById("popup-closer").blur(); + return false; }, //取随机数 @@ -685,6 +783,10 @@ const vueGis = { }, }, props: { + mapId: { + type: String, + default: 'map' + }, //是否显示多边形图层 showPolygonLayer: { type: Boolean, @@ -711,6 +813,10 @@ const vueGis = { clickType: { type: String, default: 'back' + }, + areaScale: { + type: Number, + default: 0.5 } }, @@ -795,8 +901,12 @@ export default vueGis; .popup-content { width: 300px; } +.popup-goMore{ + margin: 20px 0; +} .ol-popup-closer:after { content: "✖"; - color: rgba(1, 17, 104, 1); + // color: rgba(1, 17, 104, 1); + color: #fff; } \ No newline at end of file