zoukankan      html  css  js  c++  java
  • 根据经纬度查询附近的点

    大致思想:根据给定经纬度(lat,lng)求出其左上角(left_top),右上角(right_top),左下角(left_bottom),右下角(right_bottom)的四个位置。所有在这个区域的范围都在该点附近。
    参照:http://blog.charlee.li/location-search/

    package com.show.common.util;
    
    public class Location {
        private double latitude;
        private double longitude;
    
        public Location(double latitude, double longitude) {
            this.latitude = latitude;
            this.longitude = longitude;
        }
    
        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;
        }
    
    }
    package com.show.common.util;
    
    public class LatitudeLontitudeUtil {
    
        // http://blog.charlee.li/location-search/
    
        /** 地球半径 */
        private static final double EARTH_RADIUS = 6371000;
        /** 范围距离 */
        private double distance;
        /** 左上角 */
        private Location left_top = null;
        /** 右上角 */
        private Location right_top = null;
        /** 左下角 */
        private Location left_bottom = null;
        /** 右下角 */
        private Location right_bottom = null;
    
        private LatitudeLontitudeUtil(double distance) {
            this.distance = distance;
        }
    
        private void getRectangle4Point(double lat, double lng) {
    
            // float dlng = 2 * asin(sin(distance / (2 * EARTH_RADIUS)) / cos(lat));
            // float dlng = degrees(dlng) // 弧度转换成角度
            double dlng = 2 * Math.asin(Math.sin(distance / (2 * EARTH_RADIUS))
                    / Math.cos(lat));
            dlng = Math.toDegrees(dlng);
    
            // dlat = distance / EARTH_RADIUS
            // dlng = degrees(dlat) # 弧度转换成角度
            double dlat = distance / EARTH_RADIUS;
            dlat = Math.toDegrees(dlat); // # 弧度转换成角度
    
            // left-top : (lat + dlat, lng - dlng)
            // right-top : (lat + dlat, lng + dlng)
            // left-bottom : (lat - dlat, lng - dlng)
            // right-bottom: (lat - dlat, lng + dlng)
            left_top = new Location(lat + dlat, lng - dlng);
            right_top = new Location(lat + dlat, lng + dlng);
            left_bottom = new Location(lat - dlat, lng - dlng);
            right_bottom = new Location(lat - dlat, lng + dlng);
    
        }
    
        public static double hav(double theta) {
            double s = Math.sin(theta / 2);
            return s * s;
        }
    
        public static double getDistance(double lat0, double lng0, double lat1,
                double lng1) {
            // from math import sin, asin, cos, radians, fabs, sqrt
    
            // def hav(theta):
            // s = sin(theta / 2)
            // return s * s
    
            // def get_distance_hav(lat0, lng0, lat1, lng1):
            // "用haversine公式计算球面两点间的距离。"
            // # 经纬度转换成弧度
            // lat0 = radians(lat0)
            // lat1 = radians(lat1)
            // lng0 = radians(lng0)
            // lng1 = radians(lng1)
    
            // dlng = fabs(lng0 - lng1)
            // dlat = fabs(lat0 - lat1)
            // h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng)
            // distance = 2 * EARTH_RADIUS * asin(sqrt(h))
    
            // return distance
            lat0 = Math.toRadians(lat0);
            lat1 = Math.toRadians(lat1);
            lng0 = Math.toRadians(lng0);
            lng1 = Math.toRadians(lng1);
    
            double dlng = Math.abs(lng0 - lng1);
            double dlat = Math.abs(lat0 - lat1);
            double h = hav(dlat) + Math.cos(lat0) * Math.cos(lat1) * hav(dlng);
            double distance = 2 * EARTH_RADIUS * Math.asin(Math.sqrt(h));
    
            return distance;
        }
    
        public static Location[] getRectangle4Point(double lat, double lng,
                double distance) {
            LatitudeLontitudeUtil llu = new LatitudeLontitudeUtil(distance);
            llu.getRectangle4Point(lat, lng);
            Location[] locations = new Location[4];
            locations[0] = llu.left_top;
            locations[1] = llu.right_top;
            locations[2] = llu.left_bottom;
            locations[3] = llu.right_bottom;
            return locations;
        }
    
        public static void main(String[] args) {
            double lat = 30.500;
            double lng = 120.500;
            double distance = 500d;
            Location[] locations = LatitudeLontitudeUtil.getRectangle4Point(lat,
                    lng, distance);
            String sql = "SELECT * FROM place WHERE lat > "
                    + locations[2].getLatitude() + " AND lat < "
                    + locations[0].getLatitude() + " AND lng > "
                    + locations[0].getLongitude() + " AND lng < "
                    + locations[1].getLongitude();
            System.out.println(sql);
    
            double lat1 = 30.495503391970406;
            double lng1 = 120.49261708577215;
            double d = LatitudeLontitudeUtil.getDistance(lat, lng, lat1, lng1);
            System.out.println(d);
        }
    }

    文章出自:http://0414.iteye.com/blog/2039199

  • 相关阅读:
    写一个Windows上的守护进程(4)日志其余
    写一个Windows上的守护进程(3)句柄的管理
    写一个Windows上的守护进程(2)单例
    写一个Windows上的守护进程(1)开篇
    Xcode 特定项目运行提示无响应
    git squash 的使用
    关于.framework 文件过大 移除包内对i386 x86_64 的支持
    git 恢复被覆盖本地提交内容
    iOS企业应用 部署配置
    关于项目中测试环境跟正式环境的区分
  • 原文地址:https://www.cnblogs.com/tyjsjl/p/3901189.html
Copyright © 2011-2022 走看看