From 3dc278f10a4c3e3db7ce3a445bed710bdc88916e Mon Sep 17 00:00:00 2001
From: xiebin <123456>
Date: Wed, 16 Nov 2022 17:10:51 +0800
Subject: [PATCH] 基地信息坐标有误差的问题

---
 src/components/map/index.vue |  524 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 507 insertions(+), 17 deletions(-)

diff --git a/src/components/map/index.vue b/src/components/map/index.vue
index 333837a..4571db5 100644
--- a/src/components/map/index.vue
+++ b/src/components/map/index.vue
@@ -2,17 +2,43 @@
 <template>
     <div id="viewer-container" style="height: 100%; width: 100%"></div>
 </template>
+
 <script>
+// import axios from 'axios'
+import NCregion from '@/assets/region'
+import {getSensings} from '@/api/remote/remote'
+
+// 图层变量做声明
+var farmRegionLayer = null
+var plotRegionLayer = null
+var farmLogoLayer = null
+var regionPolyLineLayer = null
+
+var addLayers = []
+var addPlotLayers = []
+
+var siteEntitylayers = null
+var siteEntitylayers1 = null
+var siteEntitylayers2 = null
+var siteEntitylayers3 = null
+var siteEntitylayers4 = null
+var sitePositionsArray = []
 
 export default {
     name: 'mapBox',
 
     data () {
         return {
-
+            polyline: null
         }
     },
-
+    watch: {
+        'polyline' (newObj, oldObj) {
+            if (newObj && oldObj) {
+                plotRegionLayer.removeOverlay(oldObj)
+            }
+        }
+    },
     computed: {
 
     },
@@ -21,7 +47,9 @@
             global.viewer = null
         }
 
+        // 初始化地图
         function initViewer () {
+            // new Viewer(new 地图)
             global.viewer = new global.DC.Viewer('viewer-container', {
                 contextOptions: {
                     webgl: {
@@ -32,22 +60,67 @@
                 }
             })
 
-            if (global.DC.Namespace.Cesium.FeatureDetection.supportsImageRenderingPixelated()) { // 判断是否支持图像渲染像素化处理
+            // 去除logo
+            let primitiveArr = global.viewer.scene.primitives._primitives
+            global.viewer.scene.primitives.remove(primitiveArr[0])
+
+            // global.viewer.scene.globe.depthTestAgainstTerrain = true
+
+            // 已声明的图层添加到地图上
+            farmRegionLayer = new global.DC.VectorLayer('farmRegionLayer')
+            global.viewer.addLayer(farmRegionLayer)
+
+            plotRegionLayer = new global.DC.VectorLayer('plotRegionLayer')
+            global.viewer.addLayer(plotRegionLayer)
+
+            farmLogoLayer = new global.DC.HtmlLayer('farmLogoLayer')
+            global.viewer.addLayer(farmLogoLayer)
+
+            siteEntitylayers = new global.DC.VectorLayer('siteEntitylayers')
+            global.viewer.addLayer(siteEntitylayers)
+            siteEntitylayers1 = new global.DC.VectorLayer('siteEntitylayers1')
+            global.viewer.addLayer(siteEntitylayers1)
+            siteEntitylayers2 = new global.DC.VectorLayer('siteEntitylayers2')
+            global.viewer.addLayer(siteEntitylayers2)
+            siteEntitylayers3 = new global.DC.VectorLayer('siteEntitylayers3')
+            global.viewer.addLayer(siteEntitylayers3)
+            siteEntitylayers4 = new global.DC.VectorLayer('siteEntitylayers4')
+            global.viewer.addLayer(siteEntitylayers4)
+
+            // 南城县边界数据
+            regionPolyLineLayer = new global.DC.VectorLayer('regionPolyLineLayer')
+            global.viewer.addLayer(regionPolyLineLayer)
+
+            // 判断是否支持图像渲染像素化处理
+            if (global.DC.Namespace.Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
                 global.viewer.setOptions({
                     resolutionScale: window.devicePixelRatio
                 })
             }
 
-            // 影像
+            // 天地图 影像
             global.viewer.imageryLayers.addImageryProvider(
                 new global.DC.Namespace.Cesium.UrlTemplateImageryProvider({
-                    url: 'http://t{s}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=e9533f5acb2ac470b07f406a4d24b4f0',
+                    url: 'http://t{s}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=e45274b0235bb913eceb393aabbf9c9c',
                     subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
                     format: 'image/jpeg',
                     show: true,
                     maximumLevel: 18
                 })
             )
+
+
+            //获取默认展示影像
+            getSensings("SHOW").then(res=>{
+                res.data.data.forEach(e=>{
+                    global.viewer.imageryLayers.addImageryProvider(
+                        new global.DC.Namespace.Cesium.UrlTemplateImageryProvider({
+                          url: e.reUrl,
+                          maximumLevel: 18
+                        })
+                    )
+                })
+            })
 
             // 矢量电子
             // global.viewer.imageryLayers.addImageryProvider(
@@ -59,22 +132,23 @@
             //         maximumLevel: 18
             //     })
             // )
+            //
+            // global.viewer.imageryLayers.addImageryProvider(
+            //     new global.DC.Namespace.Cesium.UrlTemplateImageryProvider({
+            //         url: 'http://t{s}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=e9533f5acb2ac470b07f406a4d24b4f0',
+            //         subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
+            //         format: 'image/jpeg',
+            //         show: true,
+            //         maximumLevel: 18
+            //     })
+            // )
 
-            global.viewer.imageryLayers.addImageryProvider(
-                new global.DC.Namespace.Cesium.UrlTemplateImageryProvider({
-                    url: 'http://t{s}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=e9533f5acb2ac470b07f406a4d24b4f0',
-                    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
-                    format: 'image/jpeg',
-                    show: true,
-                    maximumLevel: 18
-                })
-            )
-
+            // 设置地图初始位置,角度等
             global.viewer.camera.setView({
                 // Cesium的坐标是以地心为原点,一向指向南美洲,一向指向亚洲,一向指向北极州
                 // fromDegrees()方法,将经纬度和高程转换为世界坐标
                 destination: global.DC.Namespace.Cesium.Cartesian3.fromDegrees(
-                    116.35381525, 27.95839468, 1950.0
+                    116.56705776, 27.42386903, 1800.0
                 ),
                 orientation: {
                     // 指向
@@ -84,11 +158,427 @@
                     roll: 0.0
                 }
             })
-        }
 
+            // global.viewer.locationBar.enable = true
+        }
         global.DC.ready(initViewer)
+        // this.addRegionPolyLine('http://arcgis.jxpskj.com:6080/arcgis/rest/services/nanchengfwx/MapServer/0/query?where=1%3D1&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=*&returnGeometry=true&maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&returnTrueCurves=false&resultOffset=&resultRecordCount=&f=pjson')
+        this.addRegionPolyLine(NCregion)
     },
     methods: {
+        /**
+         * 添加南城县边界的数据
+         * @param {string} url arcgis服务地址
+         */
+        addRegionPolyLine (regionJSON) {
+            // axios.get(regionJSON).then(res => {
+            let position = ''
+
+            regionJSON.features[0].geometry.rings[0].forEach(item => {
+                position += `${item[0]}, ${item[1]};`
+            })
+
+            console.log(position, 565656)
+
+            const polyline = new global.DC.Polyline(position)
+            polyline.setStyle({
+                width: 4,
+                material: global.DC.Namespace.Cesium.Color.fromBytes(
+                    244, 157, 21,
+                    200
+                ),
+                clampToGround: true
+            })
+            regionPolyLineLayer.addOverlay(polyline)
+            // })
+        },
+        /**
+         * 添加基地点及范围的方法
+         * @param {*} positions 位置信息(范围信息)
+         * @param {*} item 基地对应的所有信息(接口返回的数据)
+         */
+        addPolygon (item) {
+            const that = this
+
+            // const center = this.getCenter(positions)
+
+            const center = global.DC.CoordTransform.GCJ02ToWGS84(item.longitude, item.latitude)
+
+            const divIcon = new global.DC.DivIcon(new global.DC.Position(center[0], center[1]),
+                `
+                        <div class="farm-map-icon">
+                            <img src="../../../zhny-dp/img/icon/3858.png" alt="">
+                            <div>${item.farmName}</div>
+                        </div>
+                        `
+            )
+
+            divIcon.attrParams = item
+            farmLogoLayer.addOverlay(divIcon)
+
+            divIcon.on(global.DC.MouseEventType.CLICK, (e) => {
+                that.$parent.showDetailPopup(e.overlay.attrParams)
+            })
+
+            // const polygon = new global.DC.Polygon(positions)
+            // polygon.setStyle({
+            //     material: global.DC.Namespace.Cesium.Color.fromBytes(
+            //         244, 157, 21,
+            //         200
+            //     )
+            // })
+            // farmRegionLayer.addOverlay(polygon)
+
+            if (item.position != '') {
+                addLayers.push({ center, name: item.farmName })
+            } else {
+                addLayers.push({ center: '', name: item.farmName })
+            }
+        },
+
+        /**
+         * 添加地块范围的方法
+         * @param {*} positions 位置信息(范围信息)
+         * @param {*} item 地块对应的所有信息(接口返回的数据)
+         */
+        addPlotPolygon (positions, item) {
+            const that = this
+
+            const center = this.getCenter(positions)
+
+            if (item.strainUrl != '') {
+                const urls = item.strainUrl.split(',')
+                let imageStr = '<div class="land-map-icon">'
+                urls.forEach(url => {
+                    imageStr += `<img src="${url}" alt=""width="100px" height="100px" text-align="center" class="strainImg">`
+                })
+                imageStr += '</div>'
+                const divIcon = new global.DC.DivIcon(
+                    new global.DC.Position(center[0], center[1], 0), imageStr
+                )
+
+                divIcon.attrParams = item
+                farmLogoLayer.addOverlay(divIcon)
+
+                divIcon.on(global.DC.MouseEventType.CLICK, (e) => {
+                    that.$parent.plotDetailsPopupShow(e.overlay.attrParams)
+                })
+            }
+            const polygon = new global.DC.Polygon(positions)
+            polygon.attrParams = item
+            polygon.setStyle({
+                material: global.DC.Namespace.Cesium.Color.fromBytes(
+                    129, 255, 84,
+                    400
+                )
+            })
+
+            polygon.on(global.DC.MouseEventType.CLICK, (e) => {
+                that.drawLandPolyLine(positions)
+                that.$parent.plotDetailsPopupShow(e.overlay.attrParams)
+            })
+
+            plotRegionLayer.addOverlay(polygon)
+            addPlotLayers.push({ center, name: item.landName })
+        },
+        /**
+         * 地块画线
+         * @param positions
+         */
+        drawLandPolyLine (positions) {
+            // 画线
+            this.polyline = new global.DC.Polyline(positions)
+            this.polyline.setStyle({
+                width: 4,
+                material: global.DC.Namespace.Cesium.Color.fromBytes(
+                        200, 255, 255,
+                        200
+                ),
+                clampToGround: true
+            })
+            plotRegionLayer.addOverlay(this.polyline)
+        },
+
+        /**
+         * 在图层中添加实体(点)
+         * @param {*} item 站点(某个设备)对应的所有参数(接口返回对应站点的数据)
+         * @param {*} url 图标地址
+         */
+        addSiteEntity (item, url) {
+            const that = this
+
+            const center = [Number(item.lon), Number(item.lat)]
+
+            const label = new global.DC.Label(new global.DC.Position(Number(item.lon), Number(item.lat)), item.name)
+
+            label.attrParams = item
+
+            label.setStyle({
+                fillColor: global.DC.Namespace.Cesium.Color.fromBytes(
+                    1, 190, 254, 255
+                ),
+                showBackground: true,
+                backgroundColor: global.DC.Namespace.Cesium.Color.fromBytes(
+                    0, 0, 0, 145
+                ), // 背景颜色
+                distanceDisplayCondition: {
+                    near: 0, // 最近距离
+                    far: 3000 // 最远距离
+                }, // 根据距离设置可见
+                font: '12px',
+                pixelOffset: { x: 0, y: -32 } // 偏移像素
+            })
+
+            label.on(global.DC.MouseEventType.CLICK, (e) => {
+                if (!item.dictTypeNum) {
+                    that.$parent.goToJkDetail(e.overlay.attrParams)
+                } else {
+                    that.$parent.goToDetail(e.overlay.attrParams)
+                }
+            })
+
+            const billboard = new global.DC.Billboard(new global.DC.Position(Number(item.lon), Number(item.lat)), url)
+            billboard.size = [20, 28]
+            billboard.attrParams = item
+
+            billboard.on(global.DC.MouseEventType.CLICK, (e) => {
+                if (!item.dictTypeNum) {
+                    that.$parent.goToJkDetail(e.overlay.attrParams)
+                } else {
+                    that.$parent.goToDetail(e.overlay.attrParams)
+                }
+            })
+            if (!item.dictTypeNum) {
+                siteEntitylayers.addOverlay(label)
+                siteEntitylayers.addOverlay(billboard)
+            } else if (item.dictTypeNum == 1) {
+                siteEntitylayers1.addOverlay(label)
+                siteEntitylayers1.addOverlay(billboard)
+            } else if (item.dictTypeNum == 2) {
+                siteEntitylayers2.addOverlay(label)
+                siteEntitylayers2.addOverlay(billboard)
+            } else if (item.dictTypeNum == 3) {
+                siteEntitylayers3.addOverlay(label)
+                siteEntitylayers3.addOverlay(billboard)
+            } else if (item.dictTypeNum == 4) {
+                siteEntitylayers4.addOverlay(label)
+                siteEntitylayers4.addOverlay(billboard)
+            }
+
+            sitePositionsArray.push({ center, name: item.name, id: item.id })
+        },
+
+        /**
+         * 将数据库保存值转换成Map使用坐标
+         * @param landRange 数据库的值
+         * @returns {*[]} Map使用坐标
+         */
+        setPositionByLandRange (landRange) {
+            if (landRange) {
+                landRange = landRange.replace(/POLYGON\(\(/g, '')
+                landRange = landRange.replace(/\)\)/g, '')
+
+                const arr = landRange.split(',')
+                var brr = []
+                arr.forEach(it => {
+                    brr.push(it.split(' '))
+                })
+
+                return brr
+            }
+            return null
+        },
+
+        /**
+         * 设置中心点
+         * @param {*} name 对应站点(基地范围)的中心点 --- 对应的名字
+         */
+        setCenter (farmObj) {
+            // let center
+            // addLayers.forEach(item => {
+            //     if (name == item.name) {
+            //         center = item.center
+            //     }
+            // })
+
+            // if (center == '') {
+            //     this.$message({
+            //         message: '当前基地暂未绘制',
+            //         type: 'warning'
+            //     })
+            //     return
+            // }
+            const center = global.DC.CoordTransform.GCJ02ToWGS84(farmObj.longitude, farmObj.latitude)
+            global.viewer.camera.flyTo({
+                // Cesium的坐标是以地心为原点,一向指向南美洲,一向指向亚洲,一向指向北极州
+                // fromDegrees()方法,将经纬度和高程转换为世界坐标
+
+                destination: global.DC.Namespace.Cesium.Cartesian3.fromDegrees(
+                        center[0], center[1], 3000.0
+                ),
+                orientation: {
+                    // 指向
+                    heading: global.DC.Namespace.Cesium.Math.toRadians(0, 0),
+                    // 视角
+                    pitch: global.DC.Namespace.Cesium.Math.toRadians(-90),
+                    roll: 0.0
+                }
+            })
+        },
+
+        /**
+         * 设置地块中心点
+         * @param {*} name 对应站点(地块范围)的中心点 --- 对应的名字
+         */
+
+        setPlotCenter (landObj) {
+            if (!landObj.landRange) {
+                this.$message({
+                    message: '当前地块暂未绘制',
+                    type: 'warning'
+                })
+                return
+            }
+            let center
+            addPlotLayers.forEach(item => {
+                if (landObj.landName == item.name) {
+                    center = item.center
+                }
+            })
+            // 根据坐标画线
+            const positions = this.setPositionByLandRange(landObj.landRange)
+            if (positions) {
+                this.drawLandPolyLine(positions)
+            }
+
+            global.viewer.camera.flyTo({
+                // Cesium的坐标是以地心为原点,一向指向南美洲,一向指向亚洲,一向指向北极州
+                // fromDegrees()方法,将经纬度和高程转换为世界坐标
+                destination: global.DC.Namespace.Cesium.Cartesian3.fromDegrees(
+                    center[0], center[1], 3000.0
+                ),
+                orientation: {
+                    // 指向
+                    heading: global.DC.Namespace.Cesium.Math.toRadians(0, 0),
+                    // 视角
+                    pitch: global.DC.Namespace.Cesium.Math.toRadians(-90),
+                    roll: 0.0
+                }
+            })
+        },
+
+        /**
+         * 设置中心点
+         * @param {*} name 对应站点(设备点)的中心点 --- 对应的名字
+         */
+        setSiteCenter (name) {
+            let center
+            sitePositionsArray.forEach(item => {
+                if (name == item.name) {
+                    center = item.center
+                }
+            })
+
+            console.log(name, center)
+
+            global.viewer.camera.flyTo({
+                // Cesium的坐标是以地心为原点,一向指向南美洲,一向指向亚洲,一向指向北极州
+                // fromDegrees()方法,将经纬度和高程转换为世界坐标
+                destination: global.DC.Namespace.Cesium.Cartesian3.fromDegrees(
+                    center[0], center[1], 500.0
+                ),
+                orientation: {
+                    // 指向
+                    heading: global.DC.Namespace.Cesium.Math.toRadians(0, 0),
+                    // 视角
+                    pitch: global.DC.Namespace.Cesium.Math.toRadians(-90),
+                    roll: 0.0
+                }
+            })
+        },
+
+        /**
+         * 根据经纬度范围计算中心点位置
+         * @param {*} arr 记录经纬度信息的数组
+         */
+        getCenter (arr) {
+            let centerLonLat = []
+            if (arr.length) {
+                const lon = []
+                const lat = []
+                const poly = []
+                for (let i = 0, len = arr.length; i < len; i++) {
+                    lon.push(arr[i][0])
+                    lat.push(arr[i][1])
+                }
+                for (let i = 0, len = lon.length; i < len; i++) {
+                    poly.push({
+                        x: parseFloat(lon[i]),
+                        y: parseFloat(lat[i]),
+                        z: 0
+                    })
+                }
+                const sortedLongitudeArray = poly.map(item => item.x).sort()
+                const sortedLatitudeArray = poly.map(item => item.y).sort()
+                const centerLongitude = ((parseFloat(sortedLongitudeArray[0]) + parseFloat(sortedLongitudeArray[sortedLongitudeArray.length - 1])) / 2).toFixed(14)
+                const centerLatitude = ((parseFloat(sortedLatitudeArray[0]) + parseFloat(sortedLatitudeArray[sortedLatitudeArray.length - 1])) / 2).toFixed(14)
+                console.log(centerLongitude, centerLatitude)
+                centerLonLat = [Number(centerLongitude), Number(centerLatitude)]
+            }
+            return centerLonLat
+        },
+        // 隐藏基地标记图层
+        hiddenFarmLayer () {
+            farmLogoLayer.show = false
+            farmRegionLayer.show = false
+        },
+        // 显示基地标记图层
+        showFarmLayer () {
+            farmLogoLayer.show = true
+            farmRegionLayer.show = true
+        },
+        // 隐藏地块图层
+        hiddenPlotLayer () {
+            plotRegionLayer.show = false
+        },
+        // 显示地块图层
+        showPlotLayer () {
+            plotRegionLayer.show = true
+        },
+        // 隐藏监控图层
+        hiddenJKLayer () {
+            siteEntitylayers.show = false
+        },
+        // 显示监控图层
+        showJKLayer () {
+            siteEntitylayers.show = true
+        },
+        // 隐藏气象图层
+        hiddenQXLayer () {
+            siteEntitylayers1.show = false
+            siteEntitylayers2.show = false
+        },
+        // 显示气象图层
+        showQXLayer () {
+            siteEntitylayers1.show = true
+            siteEntitylayers2.show = true
+        },
+        // 隐藏水质图层
+        hiddenSZLayer () {
+            siteEntitylayers3.show = false
+        },
+        // 显示水质图层
+        showSZLayer () {
+            siteEntitylayers3.show = true
+        },
+        // 隐藏土壤图层
+        hiddenTRLayer () {
+            siteEntitylayers4.show = false
+        },
+        // 显示土壤图层
+        showTRLayer () {
+            siteEntitylayers4.show = true
+        }
 
     }
 }

--
Gitblit v1.9.3