小程序首页的设备列表按经纬度拉取,golang mysql 实现

更新日期: 2021-11-15 阅读次数: 82 字数: 345 分类: 微信小程序

经纬度的存储类型

latitude: 37.538155,    
longitude: 121.390169,

可见,最多有 6 位小数,所以存储类型为:

decimal(10,6)

decimal 的第二个参数 6 代表,最多 6 位小数; 第一个参数 10 - 6 = 4,代表小数点前最多 4 位数,即 -9999 ~ 9999.

alter table sql

ALTER TABLE `oxygen_backend`.`device` 
CHANGE COLUMN `lat` `lat` DECIMAL(10,6) NULL DEFAULT NULL ,
CHANGE COLUMN `lng` `lng` DECIMAL(10,6) NULL DEFAULT NULL ;

TODO

  • done. antd pro 编辑字段应为 float,但是被转换成了 int 类型
  • done. 线上改表
  • done. 线上录入测试数据点
  • done. 小程序端获取经纬度
  • done. 调用后台接口拉取附近的设备列表
  • done. 如果返回的列表为空,提示,附近未发现设备
  • 线上经纬度搞反了,数据修正

markers 报错

[渲染层错误] updateMultiMarker faild Error: 参数错误:LatLng 传入参数 (NaN, NaN) 非合法数字

markers: [{}],    // 错误的默认值
markers: [],      // 这样写才正确

MySQL

SELECT name, latitude, longitude, SQRT(
    POW(69.1 * (latitude - [target_lat]), 2) +
    POW(69.1 * ([target_lng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName 
HAVING distance < [distance]
ORDER BY distance;

单位为 miles, 英里。

1 英里=1.6093 千米

测试数据

      {
        iconPath: "/images/target.png",
        id: 0,
        latitude: 37.53627,    // 37.415063,121.19606
        longitude: 121.38954,
        width: 40,
        height: 47.7,
        title: "高达一号",
      },
      {
        iconPath: "/images/target.png",
        id: 1,
        latitude: 37.538155,    // 37.428374,121.185761
        longitude: 121.390169,
        width: 40,
        height: 47.7,
        title: "高达二号",
      },
      {
        iconPath: "/images/target.png",
        id: 2,
        latitude: 37.539417,    // 37.410572,121.213023
        longitude: 121.388578,
        width: 40,
        height: 47.7,
        title: "高达三号",
      },

爱评论不评论