根据经纬度查询附近的点
2015-07-22 18:20
387 查看
大致思想:根据给定经纬度(lat,lng)求出其左上角(left_top),右上角(right_top),左下角(left_bottom),右下角(right_bottom)的四个位置。所有在这个区域的范围都在该点附近。
参照:http://blog.charlee.li/location-search/
java代码:
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
参照:http://blog.charlee.li/location-search/
java代码:
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 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
相关文章推荐
- 暑假集训-个人赛第一场
- Linux vmstat详解(系统IO)
- 关于js中onclick字符串传参问题
- java.lang.IllegalStateException: WRITER
- 获取屏幕尺寸大小
- PHP 5.3.0以上推荐使用mysqlnd驱动
- python中查找指定文件
- Cursor query
- 恶意软件"跨平台" 小心钱包很受伤
- poj 2386
- NOI2015滚粗记
- CSS:选择器
- Mysql 多表联合查询效率分析及优化
- Linux 查看文件夹大小,磁盘剩余空间(du/df)
- CC_CALLBACK 与 std::bind之间不可告人的秘密
- 项目笔记——高标(15.4.7-5.8)
- iOS —— 崩溃闪退日志
- MySQL的语句执行顺序
- java可变参数使用总结
- BM_SETSTATE 消息