使用Mysql计算地址的经纬度距离和实时位置信息


Posted in MySQL onApril 29, 2022

前言

最近在做项目时候,遇到一个这样子的需求,

使用Mysql计算地址的经纬度距离和实时位置信息

点到卡包里面卡券使用使用,需要展示卡券使用附近门店,

思路

数据库地址表设计

  • 通用的区域街道地址表tz_sys_area
字段名称 类型 备注
area_id bigint 区域ID
area_name varchar(32) 区域名称
parent_id bigint 所属父区域ID
level int 层级
type char 区域类型0国家1省份直辖市2地市3区县
area_name varchar(32) 区域名称
parent_id bigint 所属父区域ID
level int 层级

使用Mysql计算地址的经纬度距离和实时位置信息

后台也可以做修改

使用Mysql计算地址的经纬度距离和实时位置信息

四级区域地址数据来源我在网上找的json文件然后按照格式倒入到的数据库

  • 门店地址表tz_address

使用Mysql计算地址的经纬度距离和实时位置信息

需求实现

  • 这里计算距离就需要用到经纬度

需要使用高德地图api接口地理/逆地理编码获取地址经纬度并保存

/**
     * 地理/逆地理编码
     * https://lbs.amap.com/api/webservice/guide/api/georegeo
     *
     * @return
     */
    public String addressToLongitude(String address) {
        String longitude = "";
        String urlString = "?key={key}&address={address}&output=JSON";
        String response = restTemplate.getForObject(ApiAction.API_GEOREGO_TEST + urlString, String.class, apiKey, address);
        if (StrUtil.isEmpty(response)) {
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(response);
        String code = jsonObject.getString("infocode");
        if (code.equals("10000")) {
            JSONArray jsonArray = jsonObject.getJSONArray("geocodes");
            JSONObject jsonObject1 = (JSONObject) jsonArray.get(0);
            longitude = jsonObject1.get("location").toString();
        } else {
            return null;
        }
        return longitude;
    }

使用

private Address setlngAndLat(Address address) {
        String addr = address.getProvince() + address.getCity() + address.getArea() + address.getAddr();
        String longitude = gaoDeService.addressToLongitude(addr);
        if (StrUtil.isBlank(longitude)) {
            throw new BusinessException("地址经纬度识别识别");
        }
        String lat = longitude.split(",")[1];
        String lng = longitude.split(",")[0];

        address.setLat(lat);
        address.setLng(lng);
        return address;
    }
  • MySQL根据经纬度计算地址距离当前位置
SELECT
               (
                       6371 * acos(
                                   cos(radians(#{lat}))
                                   * cos(radians(lat))
                                   * cos(radians(lng) - radians(#{lng}))
                               + sin(radians(#{lat}))
                                       * sin(radians(lat))
                       )
                   ) AS distance
        FROM tz_user_addr where addr_id=#{storeAddrId}

总结

到此这篇关于如何利用Mysql计算地址经纬度距离实时位置的文章就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 #MySQL
详解Mysq MVCC多版本的并发控制
详解Mysql事务并发(脏读、不可重复读、幻读)
MySQL 条件查询的常用操作
Apr 28 #MySQL
mysql 子查询的使用
Apr 28 #MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 #MySQL
优化Mysql查询的示例
Apr 26 #MySQL
You might like
PHP的FTP学习(四)
2006/10/09 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
php检查页面是否被百度收录
2015/10/28 PHP
js 分页全选或反选标识实现代码
2011/08/09 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
AngularJS快速入门
2015/04/02 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Python缓存技术实现过程详解
2019/09/25 Python
python中操作文件的模块的方法总结
2021/02/04 Python
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
介绍一下sql server的安全性
2014/08/10 面试题
简历里的自我评价
2014/01/31 职场文书
项目经理任命书内容
2014/06/06 职场文书
大国崛起日本观后感
2015/06/02 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS