怎么用java实现根据一个经纬度查询附近的楼盘信息

这篇文章主要讲解了“怎么用java实现根据一个经纬度查询附近的楼盘信息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用java实现根据一个经纬度查询附近的楼盘信息”吧!

创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于网站设计、网站建设、美兰网络推广、小程序定制开发、美兰网络营销、美兰企业策划、美兰品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供美兰建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

实现原理

先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。

java代码

/**
     * 根据传入的经纬度和半径范围确定附近的经纬度范围
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @param distance 距离 多少千米
     * @return
     */
    public static Location getNearbyLocation(double longitude, double latitude, double distance) {

        boolean b = LocationUtil.checkItude(longitude + "", latitude + "");

        if (!b) {
            return null;
        }

        //先计算查询点的经纬度范围
        double r = 6371;//地球半径千米
        double dlng = 2 * Math.asin(Math.sin(distance / (2 * r)) / Math.cos(latitude * Math.PI / 180));
        dlng = dlng * 180 / Math.PI;//角度转为弧度
        double dlat = distance / r;
        dlat = dlat * 180 / Math.PI;
        double minlat = latitude - dlat;
        double maxlat = latitude + dlat;
        double minlng = longitude - dlng;
        double maxlng = longitude + dlng;

        Location location = new Location();
        location.setLatitude(latitude);
        location.setLongitude(longitude);
        location.setMaxLatitude(maxlat + "");
        location.setMinLatitude(minlat + "");
        location.setMaxLongitude(maxlng + "");
        location.setMinLongitude(minlng + "");
        return location;
    }

经纬度格式校验

/**
     * 经纬度校验
     * 经度longitude: (?:[0-9]|[1-9][0-9]|1[0-7][0-9]|180)\\.([0-9]{6})
     * 纬度latitude:  (?:[0-9]|[1-8][0-9]|90)\\.([0-9]{6})
     *
     * @return
     */
    public static boolean checkItude(String longitude, String latitude) {
        String reglo = "((?:[0-9]|[1-9][0-9]|1[0-7][0-9])\\.([0-9]{0,6}))|((?:180)\\.([0]{0,6}))";
        String regla = "((?:[0-9]|[1-8][0-9])\\.([0-9]{0,6}))|((?:90)\\.([0]{0,6}))";
        longitude = longitude.trim();
        latitude = latitude.trim();
        return longitude.matches(reglo) == true ? latitude.matches(regla) : false;
    }

求两点之间的距离

    /**
     * 求两点之间的距离
     * @param lng1 A点经度
     * @param lat1 A点纬度
     * @param lng2 B点经度
     * @param lat2 B点纬度
     * @return 两点距离
     */
    public static double getDistance(double lng1, double lat1, double lng2, double lat2) {
        double EARTH_RADIUS = 6371;
        double radiansAX = Math.toRadians(lng1); // A经弧度
        double radiansAY = Math.toRadians(lat1); // A纬弧度
        double radiansBX = Math.toRadians(lng2); // B经弧度
        double radiansBY = Math.toRadians(lat2); // B纬弧度

        // 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值
        double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)
                + Math.sin(radiansAY) * Math.sin(radiansBY);
        double acos = Math.acos(cos); // 反余弦值
        return EARTH_RADIUS * acos; // 最终结果
    }

拿到4个确定范围的经纬度就可以去数据库查询了,由于数据库经纬度存的是一个字段需要切割下字段(使用的是MySQL),在 原本的条件下拼接上范围条件就完成!

条件sql

substring( location, 1, LOCATE ( ',', location ) - 1 ) >= #{minLongitude}
AND substring( location, 1, LOCATE ( ',', location ) - 1 ) <= #{maxLongitude}
AND substring( location, LOCATE ( ',', location ) + 1, LENGTH ( a.location ) - 1 ) >= #{minLatitude}
AND substring( location, LOCATE ( ',', location ) + 1, LENGTH ( a.location ) - 1 ) <= #{maxLatitude}

得到的结果进行比较删除

因为得到的结果是个正方形方位内的数据,想要在地图上显示,会发现超过了地图上圆圈外也有数据,这时候就需要再做一下处理。

//判断两点之间的距离是否大于半径,大于的删除
for (int i = 0; i < 之前查询结果的len; i++) {
	double distance = LocationUtil.getDistance(longitude, latitude, longitude1, latitude1);
	if (distance > kilometer) {
		list.remove(i);
		i--;
		len--;
	}
}

感谢各位的阅读,以上就是“怎么用java实现根据一个经纬度查询附近的楼盘信息”的内容了,经过本文的学习后,相信大家对怎么用java实现根据一个经纬度查询附近的楼盘信息这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


网站名称:怎么用java实现根据一个经纬度查询附近的楼盘信息
文章位置:http://scyanting.com/article/ggddoo.html