根據經緯度查詢附近的點

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   art   ar   

大致思想:根據給定經緯度(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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.