From cb85033879c74f34925a303402c1ad3e4a8646f2 Mon Sep 17 00:00:00 2001
From: 徐旺旺 <11530253@qq.com>
Date: 星期一, 10 五月 2021 17:03:54 +0800
Subject: [PATCH] 搜索更换为geoserver wfs,图层顺序,弹窗定位等

---
 src/components/LayerController/service/WmsLayerService.js |  187 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 184 insertions(+), 3 deletions(-)

diff --git a/src/components/LayerController/service/WmsLayerService.js b/src/components/LayerController/service/WmsLayerService.js
index 859334d..36aba46 100644
--- a/src/components/LayerController/service/WmsLayerService.js
+++ b/src/components/LayerController/service/WmsLayerService.js
@@ -1,10 +1,191 @@
+import AjaxUtils from '../../../utils/AjaxUtils'
+import { PIPELINE_WMS } from '../../../conf/Constants'
+import Popup from '@views/popup/Popup'
+import List from '../../../utils/List'
+
+/**
+ * todo 寰楄�冭檻涓�涓浘灞傞厤缃簡澶氫釜 wmsLayers鐨勬儏鍐�
+ */
 class WmsLayerService {
-  constructor (config) {
-    this.config = config
+  constructor (layersConfig) {
+    this.L = window.L
+    this.map = window.map
+    this.popupComp = window.popupComp
+    // wms getfeatureinfo 榛樿鍙傛暟
+    this.params = {
+      VERSION: '1.1.1',
+      SERVICE: 'WMS',
+      REQUEST: 'GetFeatureInfo',
+      // bbox: bbox,
+      FORMAT: 'image/png',
+      INFO_FORMAT: 'application/json',
+      TRANSPARENT: true,
+      FEATURE_COUNT: 50,
+      SRS: 'EPSG:4326',
+      EXCEPTIONS: 'application/vnd.ogc.se_inimage'
+    }
+    this.layersConfig = layersConfig
+    // 瀛樻斁getfeatureinfo鐨勫浘灞傜粍
+    this.featureGroup = this.L.featureGroup({}).addTo(this.map)
+
+    this.layers = new List()
+    for (var i = 0; i < layersConfig.length; i++) {
+      const config = layersConfig[i]
+      const typeName = config.typeName
+      if (typeName) {
+        this.layers.add(config.index, typeName)
+      }
+    }
   }
 
-  init (layer) {
+  init () {
+    if (this.layers) {
+      this.load(this.layers)
+      this.clickListener()
+    }
+  }
 
+  add (config) {
+    const typeName = config.typeName
+    if (typeName) {
+      if (!this.layers.contains(typeName)) {
+        this.layers.add(config.index, typeName)
+        this.wmsLayer.setParams({ layers: this.layers.join(',') })
+      }
+    }
+  }
+
+  remove (config) {
+    const typeName = config.typeName
+    this.layers.remove(typeName)
+    this.wmsLayer.setParams({ layers: this.layers.join(',') })
+  }
+
+  load (layers) {
+    this.wmsLayer = this.L.tileLayer.wms(PIPELINE_WMS, {
+      format: 'image/png', // 杩斿洖鐨勬暟鎹牸寮�
+      transparent: true,
+      layers: this.layers.join(',')
+    }).addTo(this.map)
+  }
+
+  clickListener () {
+    window.map.on('click', (e) => {
+      console.log(e)
+      this.featureGroup.clearLayers()
+      var point = this.map.latLngToContainerPoint(e.latlng, this.map.getZoom())
+      var size = this.map.getSize()
+      // const bbox = this.L.latLngBounds(this.L.latLng(e.latlng.lng, e.latlng.lat)).toBBoxString()
+
+      if (this.layers.length() > 0) {
+        const params = Object.assign({
+          LAYERS: this.layers.join(','),
+          QUERY_LAYERS: this.layers.join(','),
+          WIDTH: size.x,
+          HEIGHT: size.y,
+          X: Math.round(point.x),
+          Y: Math.round(point.y),
+          BBOX: this.map.getBounds().toBBoxString()
+        }, this.params)
+        AjaxUtils.get4JsonDataByUrl(PIPELINE_WMS, params, (res) => {
+          const features = res.data.features
+          /**
+           * {
+           *     title: 'New Tab',
+           *     name: newTabName,
+           *     content: 'New Tab content'
+           * }
+           * @type {*[]}
+           */
+          const popupDatas = []
+          if (features) {
+            for (var i = 0; i < features.length; i++) {
+              const feature = features[i]
+              const properties = feature.properties
+              this.highlight(feature)
+              // const coordinates = feature.geometry.coordinates
+              popupDatas.push({
+                title: properties.wellname || properties.devicename || properties.name || properties.pipename,
+                name: feature.id,
+                content: properties
+              })
+            }
+          }
+          if (popupDatas.length > 0) {
+            var myIcon = this.L.divIcon({ className: 'my-div-icon' })
+            this.L.marker(e.latlng, {
+              icon: myIcon
+            }).addTo(this.featureGroup)/*
+              .bindPopup((layer) => {
+                this.popupComp.setDatas(popupDatas)
+                this.popupComp.setShow()
+                return this.popupComp.$el
+              }, {
+                className: 's-map-popup',
+                minWidth: 300,
+                closeButton: false,
+                autoClose: false
+              })
+              .openPopup() */
+
+            if (window.layerFactory.clickSwitch) {
+              window.$layer.open({
+                content: {
+                  content: Popup, // 缁勪欢
+                  data: { // 浼犻�掔殑鍙傛暟
+                    datas: popupDatas
+                  }
+                },
+                title: '', // 鏍囬
+                left: e.originalEvent.clientX,
+                top: e.originalEvent.clientY
+              })
+            }
+            // this.popupComp.setDatas(popupDatas)
+            // this.popupComp.setShow()
+          }
+        })
+      }
+    })
+  }
+
+  reverseMultiLine (feature) {
+    const coordinates = feature.geometry.coordinates
+    var latlng = []
+    for (var j = 0; j < coordinates.length; j++) {
+      const coordinate = coordinates[j]
+      var xy = []
+      for (var k = 0; k < coordinate.length; k++) {
+        const coor = coordinate[k]
+        xy.push(coor.reverse())
+      }
+      latlng.push(xy)
+    }
+    return latlng
+  }
+
+  reversePolyLine (feature) {
+    const coordinates = feature.geometry.coordinates
+    var latlng = []
+    for (var j = 0; j < coordinates.length; j++) {
+      const coordinate = coordinates[j]
+      latlng.push(coordinate.reverse())
+    }
+    return latlng
+  }
+
+  highlight (feature) {
+    const type = feature.geometry.type
+    if (type === 'MultiLineString') {
+      this.L.polyline(this.reverseMultiLine(feature), { color: 'red' }).addTo(this.featureGroup)
+    } else if (type === 'Point') {
+      var myIcon = this.L.divIcon({ className: 'my-div-icon' })
+      this.L.marker(feature.geometry.coordinates.reverse(), {
+        icon: myIcon
+      }).addTo(this.featureGroup)
+    } else if (type === 'LineString') {
+      this.L.polyline(this.reversePolyLine(feature), { color: 'red' }).addTo(this.featureGroup)
+    }
   }
 }
 

--
Gitblit v1.8.0