java 球面距离_附近商家位置java开发附近定位

根据给定经纬度(lat,lng)求出其左上角(left_top),右上角(right_top),左下角(left_bottom),右下角(right_bottom)的四个位置。所有在这个区域的范围都在该点附近。

public class Test {

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;

}

}

Java代码 收藏代码

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值