JavaWeb日记——SQL和hibernate实现经纬度求距离并排序

来源:互联网 发布:淘宝的虚拟试衣间入口 编辑:程序博客网 时间:2024/06/05 08:57

我们在做定位的时候,App端获取到定位,经度和维度都是Double,获取附近的人,就要根据用户经纬度求出附近的人的距离,并按降序排序。

以一个user表为例
表的结构如下

CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `latitude` double DEFAULT NULL,  `longitude` double DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='latin1_swedish_ci'

最原始的sql语句

select *,(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(111.86141967773438-latitude)/360),2)+COS(PI()*33.07078170776367/180)* COS(latitude * PI()/180)*POW(SIN(PI()*(33.07078170776367-longitude)/360),2)))) as juli from user  order by juli asc

其中111.86141967773438代表参考点维度,33.07078170776367代表参考点经度

若是hibernate语句

select new com.ima.dto.NearByUser(u.id,u.latitude,u.longitude,(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(:latitude-latitude)/360),2)+COS(PI()*:longitude/180)* COS(latitude * PI()/180)*POW(SIN(PI()*(:longitude-longitude)/360),2)))) as juli) from User u order by juli asc

:latitude是传入维度,:longtitude是传入经度

NearByUser的代码

public class NearByUser {    private Long id;    private Double latitude;    private Double longitude;    private Double distance;    public NearByUser(Long id, Double latitude, Double longitude, Double distance) {        this.id = id;        this.latitude = latitude;        this.longitude = longitude;        this.distance = distance;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public Double getLatitude() {        return latitude;    }    public void setLatitude(Double latitude) {        this.latitude = latitude;    }    public Double getLongitude() {        return longitude;    }    public void setLongitude(Double longitude) {        this.longitude = longitude;    }    public Double getDistance() {        return distance;    }    public void setDistance(Double distance) {        this.distance = distance;    }}

User代码

public class User {    private Long id;    private Double latitude;    private Double longitude;    public User(Long id, Double latitude, Double longitude) {        this.id = id;        this.latitude = latitude;        this.longitude = longitude;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public Double getLatitude() {        return latitude;    }    public void setLatitude(Double latitude) {        this.latitude = latitude;    }    public Double getLongitude() {        return longitude;    }    public void setLongitude(Double longitude) {        this.longitude = longitude;    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 仓鼠没有鼠粮了怎么办 仓鼠被踩吐血了怎么办? 买的蓝莓太酸怎么办 荷兰猪夏天掉毛怎么办 被猫抓伤肿了怎么办 荷兰猪鼻子破了怎么办 荷兰猪吃了包菜怎么办 龙猫不爱吃主粮怎么办 荷兰猪躲起来了怎么办 荷兰猪一直叫是怎么办 龙猫不吃粗的主粮怎么办 转龙猫中暑症状+龙猫中暑怎么办 火车上空调太冷怎么办 格力空调太冷怎么办 未满月龙猫宝宝怎么办 房间小空调太冷怎么办 奶猫半夜不睡觉怎么办 龙猫不喜欢吃草粒怎么办 龙猫一直在发抖怎么办 龙猫牙齿掉了怎么办 龙猫晚上很吵怎么办 小狗把手咬破了怎么办 夏天仓鼠太热了怎么办 仓鼠玩转轮会摔怎么办 如何发截图不会发现吐怎么办 嘴巴烂了药过敏怎么办 非法校车被扣了怎么办 手指削掉一块肉怎么办 在广州误走brt道怎么办 平安eq测试没过怎么办 物业在小区私自建房怎么办 婚后父母出钱买房离婚怎么办 情人忙工作没时间约会怎么办 情人很忙不主动联系我怎么办 丈夫毫不关心基督徒妻子怎么办 眼睛太小怎么办不整容 被野生猴子咬了怎么办 被野猴子抓伤了怎么办 孩子入学前疫苗补不全怎么办 额头肤色比脸黑怎么办 高跟鞋小了挤脚怎么办