根据经纬度查询最近距离,mysql查询经纬度附近范围

public class Test{

    private static List<LocalAddress> ilist = new ArrayList<LocalAddress>();    public static void main(String[] args) {        Test test3 = new Test();        Double localDouble  = 0.0;

        //定义一个二维数组存放经纬度        Double[][] doubles = {                { 22.6036906766, 113.8793209706 }, //雍华源                { 22.5205569549, 113.9394272419 }, //西海湾花园                { 22.6494305358, 114.0411629507 }, //世纪春城4期                { 22.5255080247,114.0384880750 },  //金海湾花园                { 22.5246432654,114.0720634923 },   //金港豪庭                { 22.5963291708,113.9689558477 },   //得意名居                { 22.5509638661,113.9358124450 },   //麒麟花园A区西门                { 22.5509638661,113.9358124450 },   //麒麟花园A区北门                { 22.5254496086,114.0555439122 },   //裕康时尚名居                { 22.7789489191,114.3063672776 },   //桑泰丹华园                { 22.5240537775,114.0641924822 },   //皇庭彩园                { 22.5141408858,114.0624887496 } }; //城市3米6

        //门店的经纬度        Double[] initlocal = {22.539899298946577,113.95296375395431 };

        for (int i = 0; i < doubles.length; i++) {            System.out.println("doubles.length==============="+doubles.length);            System.out.println("(" + doubles[i][0] + "," + doubles[i][1] + ")");            Double z = test3.getDistance(doubles[i][0], doubles[i][1],initlocal[0], initlocal[1]);            System.out.println(z);            //获取最短距离后把经纬度和距离存放到对象中            LocalAddress localaddress = new LocalAddress(doubles[i][0], doubles[i][1], z);            //将对象用list保存            ilist.add(localaddress);        }

        List<LocalAddress> shotlocal =  getLocalList();        Double lat=shotlocal.get(0).getLat();        Double lon= shotlocal.get(0).getLon();        localDouble = shotlocal.get(0).getDistance();        System.err.println("最近的距离:" + localDouble + "。对应的经纬是:" +"(" + lat + "," + lon + ")");    }

    /*第一种求最近距离 ===================================================*/    /**     * 获取最短的距离     * @param lat     * @param lon     * @param initlat     * @param initlon     * @return     */    public Double GetShotLocal(Double lat, Double lon, Double initlat,Double initlon) {        Double x = (initlat - lat) * (initlat - lat);        Double y = (initlon - lon) * (initlon - lon);        Double z = Math.sqrt(x + y);        return z;    }

    /**     * 对List<LocalAddress> 进行排序     * @return     */    public static List<LocalAddress> getLocalList()  {        Collections.sort(ilist, new Comparator<LocalAddress>() {            @Override            public int compare(LocalAddress arg0, LocalAddress  arg1) {                Double double1 = arg0.getDistance();                Double double2 = arg1.getDistance();                if(double1>double2){                    return 1;                }else if (double1 == double2) {                    return 0;                }else {                    return -1;                }            }        });        return ilist;    }

/*    第二种求最近距离                         ==================================================================*/    private static final double EARTH_RADIUS = 6378.137;//地球半径,单位千米    private static double rad(double d)    {        return d * Math.PI / 180.0;    }

    /**     *     * @param lat1 第一个纬度     * @param lng1 第一个经度     * @param lat2 第二个纬度     * @param lng2 第二个经度     * @return 两个经纬度的距离     */    public static double getDistance(double lat1,double lng1,double lat2,double lng2)    {        double radLat1 = rad(lat1);        double radLat2 = rad(lat2);        double a = radLat1 - radLat2;        double b = rad(lng1) - rad(lng2);

        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +                Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));        s = s * EARTH_RADIUS;        s = Math.round(s * 10000) / 10000;        return s;

    }

}

entity
public class LocalAddress {

    private Double lat;     //纬度    private Double lon;     //经度    private Double distance;    //最近距离

    public LocalAddress() {        // TODO Auto-generated constructor stub    }

    public LocalAddress(Double lat, Double lon, Double distance) {        super();        this.lat = lat;        this.lon = lon;        this.distance = distance;    }

}
<!--根据经纬度查询最近距离范围--><select id="SelectDistanceByLat" parameterType="map" resultType="map">   SELECT   *,(   6371 * acos (   cos ( radians(#{lat}) )   * cos( radians( lat ) )   * cos( radians( lng ) - radians(#{lng}) )   + sin ( radians(#{lat}) )   * sin( radians( lat ) )   )   ) AS distance   FROM machine   HAVING   3 > distance   ORDER BY distance   LIMIT 0 , 20;</select>

原文地址:https://www.cnblogs.com/tomingto/p/11102240.html

时间: 2024-08-02 06:09:06

根据经纬度查询最近距离,mysql查询经纬度附近范围的相关文章

mysql 查询当天、昨天、本周、上周、本月、上月、今年、去年数据

mysql 查询当天数据 mysql查询今天.昨天.7天.近30天.本月.上一月 数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) = 1 近7天 SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名) 查询当

MySql存储引擎+表解压缩机制+索引+查询缓存机制+慢查询日志

一.大型网站优化之MySql优化 1.优化和不优化的对比的 在业界当中我们有一个叫大数据(big data)的概念,所谓的大数据指代千万级别以上的数据作为起步的数据.所以我们现在需要对两张都具有50331650条记录的表进行查询对比,其中表名为tbl_no的表是没有做过任何优化手段的表,表名为tbl_yes的表是做过优化手段的表.这个实验的目的是观察具有优化手段和不具有优化手段的查询中速度的差别. 实验条件: 1)两张表的数据记录总数是相同的 2)两张表的数据字段结构也是一样的 3)查询的记录的

mysql查询、子查询、连接查询

mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默

Mysql 查询缓存利弊

Mysql 查询缓存总结 MySQL查询缓存解释 缓存完整的SELECT查询结果,也就是查询缓存.保存查询返回的完整结果.当查询命中该缓存,mysql会立刻返回结果,跳过了解析.优化和执行阶段, 查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有数据都将失效 命中条件 Mysql判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括如下因素,即查询本身.当前要查询的数据库.客户端协议的版本等一些都有可能影响返回结果信息. 当判断查询缓存

生产要不要开启MySQL查询缓存

一.前言在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议生产环境中把MySQL Query Cache关闭.按道理,MySQL Server默认打开,是鼓励用户使用缓存,但是大拿们却建议关闭此功能,并且国内各个云厂商提供的MySQL云服务中默认都是关闭这个功能,这是为什么?他们在使用中遇到了什么坑?本文将会从以下几方面来详解MySQL Query Cach

mysql 下 计算 两点 经纬度 之间的距离

公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)* pow(sin( (lng1*pi()/180-lng2*pi()/180)/2),2)))*1000) 例如: SELECT store_id,lng,lat, ROUND(6378.13

转:mysql 下 计算 两点 经纬度 之间的距离 计算结果排序

转自cdsn:https://blog.csdn.net/u013160024/article/details/43635053?utm_source=blogxgwz0 公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)* pow(sin(

LBS应用之 根据一点的经纬度实现附近点的查询

这年头和LBS相关的应用越来越火.从foursquare的热闹程度就可见一般(什么,没听过 foursquare…. 哥们,你 out 了).和 LBS有关的应用一般都包括一些共同的操作,最常见的一个,就是找附近的东东(餐馆, 商店, 妞…). 所以, 这里就抛出了一个问题, 怎样才能知道两个物体离得近呢? 例如:用iPhone/android手机定位得到理想国际大厦的经纬度:39.98123848, 116.30683690 然后查找附近的妞根据一点的经纬度实现附近点的查询" title=&q

百度api查询多个地址的经纬度的问题

在使用百度api查询多个地址的经纬度的时候,由于百度api提供的经纬度查询方法是回调函数,并且后续操作必须等经纬度获取完成才能进行,问题就存在于怎么判断所有地点是否都回调完成了,问了之前的一个前端大佬同事(我是一只前端弱鸡),给我提供的思路,在百度api的回调函数里面再调一次自定义的回调函数,从而在自定义的函数里面进行判断所有地点是否都回调完成了. 下面是具体代码, 1 <script> 2 //所有待查询经纬度的地点 3 var allAddress=new Array("北京西站