Newer
Older
smart_construction / miniprogram / pages / defineMap / defineMap.js
dutingting 18 days ago 20 KB 修改bug、新需求开发
var app = getApp();
const wellTypes = [
    {label: '雨水井', value: '1'},
    {label: '污水井', value: '2'},
    {label: '燃气井', value: '3'},
    {label: '热力井', value: '4'},
    {label: '电力井', value: '5'},
    {label: '通信井', value: '6'},
    {label: '给水井', value: '7'},
    {label: '公安井', value: '8'},
    {label: '环卫井', value: '9'},
    {label: '交通井', value: '10'},
    {label: '路灯井', value: '11'},
    {label: '市政井', value: '12'},
    {label: '有线电视井', value: '13'},
    {label: '园林绿化井', value: '14'},
    {label: '其他', value: '15'},
    {label: '消防井', value: '16'},
    {label: '监控井', value: '17'},
]
let wellList = []
Page({
    data: {
      wellTypeList: [
        '雨水井',
        '污水井',
        '燃气井',
        '热力井',
        '电力井',
        '通信井',
        '给水井',
        '公安井',
        '环卫井',
        '交通井',
        '路灯井',
        '市政井',
        '有线电视井',
        '园林绿化井',
        '其他',
        '消防井',
        '监控井'
        ],
      longitude: "116.627340",
      latitude: "39.874390",
      scale: 12,
      minScale: 2,
      maxScale: 22,
      markers: [],
      activeMarkerId: null,
      activeMarker: null,
      showActionSheet: false,
      filterOptions: [
        { name: '查看全部井', type: 'all' },
        { name: '查看全部打不开井', type: 'cannotOpen' },
        { name: '按位置', type: 'location' },
        { name: '按井编号', type: 'wellCode' },
        { name: '按井类型', type: 'wellType' },
        { name: '按井状态', type: 'status' }
      ],
      originalMarkers: [], // 存储原始数据用于筛选
      listQuery: { // 查询井列表的参数
        wellCode: '', // 井编号
        position: '', // 按位置
        wellType: '', // 井类型
        isInStall: '', // 井状态
      },
      position7: {
        left: '46%',
        top: '46%',
    },
      //   -----------------------弹出框--------------------
      showPopup: false,
      popupType: '',
      inputValue: '',
      defaultText: '请输入内容',
      defaultTitieText: '请输入内容',
      showPopupSelect: false, // 井类型选择器
    },

    preventDefault(e) {
        // 不执行任何操作,阻止事件冒泡
      },
  
    onLoad() {
      if(!app.globalData.addsuccessWellCode) {
          this.setData({
            listQuery: { // 查询井列表的参数
                wellCode: '', // 井编号
                position: '', // 按位置
                wellType: '', // 井类型
                isInStall: '', // 井状态
              },
          })
        this.fetchManhole(this.data.listQuery);
    }
},
    onShow() {
        if(app.globalData.addsuccessWellCode && wellList.length) {
            const index = wellList.findIndex(item => item.wellCode === app.globalData.addsuccessWellCode)
            if(index !== -1) {
                wellList[index].isInStall = '1'
                this.initManholeData(wellList)
                app.globalData.addsuccessWellCode = ''
                this.setData({
                    activeMarker: null
                })
            }
        }
    },

    // 点击刷新
    refresh() {
        this.fetchManhole(this.data.listQuery, 'refresh');
    },

    // 获取井
    fetchManhole(params, type = '') {
        const that = this
        console.log('请求井列表', params);
        wx.showLoading({
          title: '获取闸井信息中',
          mask: true, // 是否显示透明蒙层,防止触摸穿透
        })
        wx.request({
            method: "POST",
            url: app.globalData.httpsUrl + "appDeviceAdd/getAppWellList",
            data: params,
            header: {
            'content-type': 'application/x-www-form-urlencoded;charset=utf-8'
            },
            success(res) {
                if (res.data.code == 200) {
                    const listResultData = res.data.data;
                    wellList = listResultData
                    if(type === 'all' || type === 'cannotOpen' || type === 'refresh') { // 查看所有井
                      that.initManholeData(listResultData)
                      if(listResultData.length && type !== 'refresh') {
                        const mapCtx = wx.createMapContext('map');
                        mapCtx.moveToLocation({
                            latitude: listResultData[0].latGaode,
                            longitude: listResultData[0].lngGaode
                        });
                      }
                    } else { // 显示周围100米井
                        that.locateCurrentPosition()
                    }
                    // const tempList = that.filterNearbyPoints(listResultData, 39.907900661893, 116.39424858941)
                    // console.log('获取当前人的定位周围100米的数据',tempList.length,  tempList);
                    // that.initManholeData(tempList)
                }
                wx.hideLoading()
            },
            fail(err) {
                wx.hideLoading()

                wx.showToast({
                    title: "无法获取闸井相关信息!",
                    icon: 'none',
                    duration: 2000
                })
            }
        })
    },
  
    initManholeData(list) {
        console.log('获取到的闸井信息', list);
        const that = this
        const markers = list.map((manhole, index) => {
            return {
                id: index,
                longitude: manhole.lngGaode,
                latitude: manhole.latGaode,
                iconPath: that.getMarkerIcon(manhole.isInStall),
                width: 30,
                height: 30,
                zIndex: 0,
                callout: {
                    content: that.getCalloutContent(manhole),
                    color: '#fff',
                    fontSize: 13,
                    bgColor: '#616161',
                    padding: 10,
                    borderRadius: 6,
                    display: 'BYCLICK',
                    anchorY: -12,
                    borderWidth: 1,
                    borderColor: '#616161',
                    textAlign: 'left',
                },
                manholeInfo: manhole
            };
      });
      that.setData({
        originalMarkers: markers,
        markers: markers
      });
      wx.hideLoading()
    },
  
    getMarkerIcon(status) {
        // 地图上  橙红色:井打不开2,黄色 :已安装,蓝色1:未安装0
      console.log('获取到的icon类型', status); 
      switch(status) {
        case '0': return '/images/blue-marker.png';
        case '1': return '/images/yellow-marker.png';
        case '2': return '/images/orange-marker.png';
        default: return '/images/default-marker.png';
      }
    },
  
    getCalloutContent(manhole) {
    //   return `闸井编号: ${manhole.wellCode}\n闸井类型: ${manhole.wellType}\n闸井状态: ${this.getStatusText(manhole.isInStall)}\n位置: ${manhole.coordinateX},${manhole.coordinateY}\n详细地址: ${manhole.position}`;
    //   return `闸井编号: ${manhole.wellCode}\n闸井类型: ${manhole.wellType}\n闸井状态: ${this.getStatusText(manhole.isInStall)}\n详细地址: ${manhole.position}`;
      return `${this.getStatusText(manhole.isInStall)}  ${manhole.wellCode}   ${manhole.wellType}`;
    },
  
    getStatusText(status) {
    //   switch(status) {
    //     case '0': return '未安装';
    //     case '1': return '已安装';
    //     case '2': return '井打不开';
    //     default: return '未知';
    //   }
      switch(status) {
        case '0': return '未 ';
        case '1': return '已 ';
        case '2': return '井打不开 ';
        default: return '未知 ';
      }
    },
    // 按钮点击事件处理方法
    createDevice() {
       console.log('气泡里面的按钮被点击');
       // 在这里可以添加按钮点击后的具体逻辑
    },
    // 点击标记点
    onMarkerTap(e) {
    // =========================================================
      const markerId = e.markerId;
      console.log('Marker tapped:', markerId);
      //   先隐藏所有气泡
      const markers = this.data.markers.map(marker => {
        marker.callout.display = 'BYCLICK';
        // marker.zIndex = 0
        return marker;
      });
      
    //   找到被点击的marker并显示其气泡
      const index = markers.findIndex(marker => marker.id === markerId);
      if (index !== -1) {
        this.setData({
            activeMarker: markers[index],
        });
      console.log('点击marker', markers[index]);
        
        markers[index].callout.display = 'ALWAYS';
        markers[index].zIndex = 100;
        this.setData({
          markers: markers,
          activeMarkerId: markerId
        });
      }
    // =========================================================
    },
  
    zoomIn() {
      if (this.data.scale < this.data.maxScale) {
        this.setData({
          scale: this.data.scale + 1
        });
      }
    },
  
    zoomOut() {
      if (this.data.scale > this.data.minScale) {
        this.setData({
          scale: this.data.scale - 1
        });
      }
    },

    // ----------------------------------------------筛选---------------------------------------------
    showFilterPicker() {
        this.setData({
          showActionSheet: true
        });
      },

    //   关闭选择器
      hideActionSheet() {
        this.setData({
          showActionSheet: false
        });
      },
    
      onFilterSelect(e) {
        console.log('点击选择器', e);
        const { type } = e.currentTarget.dataset;
        this.setData({popupType: type });
        this.handleFilter(type);
        this.hideActionSheet();
      },
    
      handleFilter(type) {
        const that = this
        console.log('筛选类型:popupType', that.data.popupType);
        switch(type) {
          case 'all': // 查看所有井
            // that.setData({ markers: that.data.originalMarkers });
            that.setData({
                listQuery: { // 查询井列表的参数
                    wellCode: '', // 井编号
                    position: '', // 按位置
                    wellType: '', // 井类型
                    isInStall: '', // 井状态
                  },
              })
            that.fetchManhole(this.data.listQuery, type);
            break;
        case 'cannotOpen': // 查看全部打不开井
            // that.setData({ markers: that.data.originalMarkers });
            that.setData({
                listQuery: { // 查询井列表的参数
                    wellCode: '', // 井编号
                    position: '', // 按位置
                    wellType: '', // 井类型
                    isInStall: '2', // 井状态
                  },
              }, type)
            that.fetchManhole(this.data.listQuery, type);
            break;
          case 'location': // 按位置筛选
            that.setData({defaultTitieText: '请输入位置',  defaultText: '请输入位置', showPopup: true });
            break;
          case 'wellCode': // 按照井编号筛选
            that.setData({defaultTitieText: '请输入井编号',  defaultText: '请输入井编号', showPopup: true });
            break;
          case 'wellType': // 按井类型
            that.showPopupSelect()
            break;
          case 'status':
            wx.showActionSheet({
                itemList: ['井打不开', '已安装', '未安装'],
                success: (res) => {
                if (!res.cancel) {
                    const types = [{label: '井打不开', value: '2'}, {label: '已安装', value: '1'}, {label: '未安装', value: '0'}];
                    // 前端做筛选
                    //   const filtered = that.data.originalMarkers.filter(
                //     marker => marker.manholeInfo.isInStall === types[res.tapIndex].value
                //   );
                //   console.log('======filtered======', filtered);
                //   that.setData({ markers: filtered });
                    // 由于井的状态在实时变化,因此请求接口
                    that.setData({
                        listQuery: { // 查询井列表的参数
                            wellCode: '', // 井编号
                            position: '', // 按位置
                            wellType: '', // 井类型
                            isInStall: types[res.tapIndex].value, // 井状态
                          },
                      }, type)
                    that.fetchManhole(this.data.listQuery);
                }
                }
            });
            break;
        }
      },
    //   --------------------------------popup相关方法--------------------------------------------
    // 打开popup
    showPopup() {
        this.setData({ showPopup: true });
    },
    // 关闭popup
    onClose() {
        this.setData({ showPopup: false });
    },
    // 输入内容
    onInput(e) {
        this.setData({ inputValue: e.detail });
    },
    // 点击确认按钮
    onConfirm() {
        let params
        console.log('确认按钮点击', this.data.inputValue);
        console.log('当前筛选的类型', this.data.popupType);
        if(this.data.popupType === 'location') {
            params = {
                wellCode: '', // 井编号
                position: this.data.inputValue, // 按位置
                wellType: '', // 井类型
                isInStall: '', // 井状态
            }
        } else if(this.data.popupType === 'wellCode') {
            params = {
                wellCode: this.data.inputValue, // 井编号
                position: '', // 按位置
                wellType: '', // 井类型
                isInStall: '', // 井状态
            }
        }
        this.onClose()
        this.setData({
            listQuery: params
        })
        this.fetchManhole(params)
    },
    // 点击取消按钮
    onCancel() {
        console.log('取消按钮点击');
        this.setData({ showPopup: false });
    },

    // --------------------------------------------筛选井类型相关方法----------------------------------
    // 打开popup
    showPopupSelect() {
        this.setData({ showPopupSelect: true });
    },
    // 关闭popup
    onCloseSelect() {
        this.setData({ showPopupSelect: false });
    },
    // 输入内容
    onInput(e) {
        this.setData({ inputValue: e.detail });
    },
    // 点击确认按钮
    confirmSelectWellType: function (e) {
        console.log('确认选择井类型', e);
        const params = {
            wellCode: '', // 井编号
            position: '', // 按位置
            wellType: e.detail.index + 1 + '', // 井类型
            isInStall: '', // 井状态
        }
        this.onCloseSelect()
        this.setData({
            listQuery: params
        })
        this.fetchManhole(params)
    },
    // 点击确认按钮
    // onConfirmSelect() {
    //     console.log('确认按钮点击', this.data.inputValue);
    //     this.setData({ showPopupSelect: false });
    //     if(this.data.popupType === 'location') {
    //         const params = {
    //             wellCode: this.data.inputValue, // 井编号
    //             position: this.data.inputValue, // 按位置
    //             wellType: this.data.inputValue, // 井类型
    //             isInStall: this.data.inputValue, // 井状态
    //         }
    //         this.setData({
    //             listQuery: params
    //         })
    //         this.fetchManhole(params)
    //     }
    // },
    // 点击取消按钮
    onCancelSelect() {
        console.log('取消按钮点击');
        this.setData({ showPopupSelect: false });
    },

    // --------------------------------------------新建设备----------------------------------
    createDevice() {
        console.log('当前选中的设备', this.data.activeMarker);
        wx.navigateTo({
            url: `../addDevice/addDevice?fromPage=defineMap&latitude=${this.data.activeMarker.latitude}&longitude=${this.data.activeMarker.longitude}&position=${this.data.activeMarker.manholeInfo.position}&wellCode=${this.data.activeMarker.manholeInfo.wellCode}&wellType=${this.data.activeMarker.manholeInfo.wellType}`
        })
    },
    // ----------------------------------------------------------------------------------

    /**
     * 筛选用户当前位置周围指定距离内的点位数据
     * @param {Array} points - 点位数组(每条数据需包含 latGaode 和 lngGaode 字段)
     * @param {number} userLat - 用户当前纬度
     * @param {number} userLng - 用户当前经度
     * @param {number} radius - 筛选半径(单位:米,默认 100 米)
     * @returns {Array} 符合条件的点位数组
     */
    filterNearbyPoints(points, userLat, userLng, radius = 100) {
        if (!points || !points.length || !userLat || !userLng) {
        return []; // 校验参数合法性
        }
  
        return points.filter(point => {
        // 调用距离计算函数
        const distance = this.calculateDistance(userLat, userLng, point.latGaode, point.lngGaode);
        return distance <= radius; // 保留距离≤半径的点位
        });
    },
  
    /**
     * 计算两点间球面距离(Haversine 公式)
     * @param {number} lat1 - 点1纬度
     * @param {number} lng1 - 点1经度
     * @param {number} lat2 - 点2纬度
     * @param {number} lng2 - 点2经度
     * @returns {number} 两点间距离(单位:米)
     */
    calculateDistance(lat1, lng1, lat2, lng2) {
        const R = 6371e3; // 地球半径(米)
        const dLat = (lat2 - lat1) * Math.PI / 180; // 纬度差(弧度)
        const dLng = (lng2 - lng1) * Math.PI / 180; // 经度差(弧度)
        
        // Haversine 公式计算中间变量
        const a = 
        Math.sin(dLat / 2) * Math.sin(dLat / 2) +
        Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
        Math.sin(dLng / 2) * Math.sin(dLng / 2);
        
        const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // 计算圆心角(弧度)
        return R * c; // 返回距离(米)
    },

    // 点击定位
    locateCurrentPosition() {
        var that = this;
        that.setData({
            markers: []
        })
        //获取当前坐标(gcj02)
        wx.showLoading({
            title: '正在定位',
            mask: true, // 是否显示透明蒙层,防止触摸穿透
        })
        wx.getLocation({
          type: "gcj02",
          altitude: true,
          success: function (res) {
            that.setData({
              latitude: parseFloat(res.latitude).toFixed(6),
              longitude: parseFloat(res.longitude).toFixed(6),
            //    latitude: '39.908599446615',
            //   longitude: '116.391914605035',
            })
            console.log('获取到当前定位', parseFloat(res.latitude).toFixed(6), parseFloat(res.longitude).toFixed(6));
            // 将地图中心移动到当前定位点
            const mapCtx = wx.createMapContext('map');
            mapCtx.moveToLocation();
            wx.hideLoading()
            if(wellList.length) {
                // const tempList = that.filterNearbyPoints(wellList, '39.908599446615', '116.391914605035')
                const tempList = that.filterNearbyPoints(wellList, parseFloat(res.latitude).toFixed(6), parseFloat(res.longitude).toFixed(6))
                console.log('获取当前人的定位周围100米的数据',tempList.length,  tempList);
                if(tempList.length) {
                    that.initManholeData(tempList)
                    mapCtx.moveToLocation({
                        latitude: tempList[0].latGaode,
                        longitude: tempList[0].lngGaode
                    });
                } else {
                    wx.showToast({
                        title: "当前位置周围100米无闸井",
                        icon: 'none',
                        duration: 3000
                    })
                }
            } else {
                that.fetchManhole()
            }
          },
          fail(err) {
            wx.hideLoading()
            wx.showToast({
                title: "未获取到当前定位!",
                icon: 'none',
                duration: 2000
            })
        }
        })
    }
})