riku
2025-04-27 f46786f11c5c08ead7501a82e5a71430ad69b782
修复线索问题定位错误问题

1.修复线索问题定位坐标系没有转为wgs84进行存储的问题
已修改1个文件
已添加1个文件
139 ■■■■ 文件已修改
pages/cluetask/question/index.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/map-utils.js 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/cluetask/question/index.js
@@ -1,6 +1,7 @@
import { cluePicUrl } from '../../../config/index';
import { questionForm } from '../clue-item.js';
import { toLabel, toValue } from '../../../common/dataTowns';
import mapUtils from '../../../utils/map-utils';
import { uploadQuestion, updateQuestion } from '../../../services/clue/fetchClue';
@@ -173,14 +174,25 @@
  // ä»Žåœ°å›¾é€‰æ‹©å®šä½
  chooseLocation() {
    const { locations } = this.data;
    let lng, lat;
    if (typeof locations.longitude === 'number' && typeof locations.latitude === 'number') {
      const coor = mapUtils.wgs84togcj02(locations.longitude, locations.latitude);
      lng = coor[0];
      lat = coor[1];
    }
    wx.chooseLocation({
      longitude: locations.longitude,
      latitude: locations.latitude,
      longitude: lng,
      latitude: lat,
      success: res => {
        const [lngGps, latGps] = mapUtils.gcj02towgs84(res.longitude, res.latitude);
        this.setData({
          locations: {
            ...res,
            coorTxt: `${res.longitude},${res.latitude}`,
            name: res.name,
            address: res.address,
            // ä½¿ç”¨ gcj02 å›½æµ‹å±€åæ ‡ç³»
            longitude: lngGps,
            latitude: latGps,
            coorTxt: `${lngGps},${latGps}`,
          },
        });
      },
@@ -189,20 +201,20 @@
  // æ·»åŠ å›¾ç‰‡
  handleAddImg(e) {
    wx.chooseAddress({
    })
    wx.getLocation({
      type:'wgs84',
      success:res=>{
        this.setData({
          locations: {
            ...res,
            coorTxt: `${res.longitude},${res.latitude}`,
          },
        });
      }
    })
    // wx.chooseAddress({
    // })
    // wx.getLocation({
    //   type:'wgs84',
    //   success:res=>{
    //     this.setData({
    //       locations: {
    //         ...res,
    //         coorTxt: `${res.longitude},${res.latitude}`,
    //       },
    //     });
    //   }
    // })
    const { fileList } = this.data;
    const { files } = e.detail;
    this.setData({
utils/map-utils.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
const PI = 3.1415926535897932384626;
const a = 6378245.0; //长半轴
const ee = 0.00669342162296594323; //扁率/*** GCJ02 è½¬æ¢ä¸º WGS84* @param lng* @param lat* @returns {*[]}*/
function transformlat(lng, lat) {
  // lat = +lat lng = +lng
  let ret =
    -100.0 +
    2.0 * lng +
    3.0 * lat +
    0.2 * lat * lat +
    0.1 * lng * lat +
    0.2 * Math.sqrt(Math.abs(lng));
  ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;
  ret += ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) / 3.0;
  ret += ((160.0 * Math.sin((lat / 12.0) * PI) + 320 * Math.sin((lat * PI) / 30.0)) * 2.0) / 3.0;
  return ret;
}
function transformlng(lng, lat) {
  // lat = +latlng = +lng
  let ret =
    300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
  ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;
  ret += ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) / 3.0;
  ret += ((150.0 * Math.sin((lng / 12.0) * PI) + 300.0 * Math.sin((lng / 30.0) * PI)) * 2.0) / 3.0;
  return ret;
}
/**
 * åˆ¤æ–­æ˜¯å¦åœ¨å›½å†…,不在国内则不做偏移
 * @param lng
 * @param lat
 * @returns {boolean}
 */
function out_of_china(lng, lat) {
  // çº¬åº¦3.86~53.55,经度73.66~135.05
  return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
}
export default {
  /**
   * é«˜å¾·åœ°å›¾åæ ‡è½¬GPS坐标算法
   */
  gcj02towgs84(_lng, _lat) {
    // lat = +latlng = +lng
    const lng = parseFloat(_lng);
    const lat = parseFloat(_lat);
    if (out_of_china(lng, lat)) {
      return [lng, lat];
    } else {
      let dlat = transformlat(lng - 105.0, lat - 35.0);
      let dlng = transformlng(lng - 105.0, lat - 35.0);
      let radlat = (lat / 180.0) * PI;
      let magic = Math.sin(radlat);
      magic = 1 - ee * magic * magic;
      let sqrtmagic = Math.sqrt(magic);
      dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI);
      dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI);
      let mglat = Math.round((lat * 2 - lat - dlat) * 1000000) / 1000000;
      let mglng = Math.round((lng * 2 - lng - dlng) * 1000000) / 1000000;
      return [mglng, mglat];
    }
  },
  /**
   * WGS84 è½¬æ¢ä¸º GCJ02
   * @param lng
   * @param lat
   * @returns {*[]}
   */
  wgs84togcj02(_lng, _lat) {
    // lat = +latlng = +lng
    const lng = parseFloat(_lng);
    const lat = parseFloat(_lat);
    if (out_of_china(lng, lat)) {
      return [lng, lat];
    } else {
      let dlat = transformlat(lng - 105.0, lat - 35.0);
      let dlng = transformlng(lng - 105.0, lat - 35.0);
      let radlat = (lat / 180.0) * PI;
      let magic = Math.sin(radlat);
      magic = 1 - ee * magic * magic;
      let sqrtmagic = Math.sqrt(magic);
      dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI);
      dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI);
      let mglat = Math.round((lat + dlat) * 1000000) / 1000000;
      let mglng = Math.round((lng + dlng) * 1000000) / 1000000;
      return [mglng, mglat];
    }
  },
};