大致思想:根据给定经纬度(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);
}
}
分享到:
相关推荐
根据一个给定经纬度的点和距离,进行附近地点查询,计算两点位置的距离,返回两点的距离,单位:公里或千米
根据已知点坐标计算附近位置,代码详细解释了三种计算策略。主要涉及日常需要解决问题,例如类似于滴滴打车实现查找附近车辆业务逻辑和贝壳找房根据指定位置筛选出附近房源,上述两场场景应用可借鉴代码中两种方法...
PHP获取经纬度两点间距离,筛选,排序,多用于APP中用户与用户或用户与商家之间,进行距离筛选,排序
需求:现在移动app的运用越来越广泛了,这里有个需求就是查找我附近的酒店 或者是团购这样类似的功能 前提:一般我们的酒店都是有经纬度的 也保存在数据库中,那么我们只要在数据库查找这些就可以了 也就是说 我们...
https://blog.csdn.net/lanrenxiaowen/article/details/84635753
目前的工作是需要手机查找附近N米以内的商户,致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,经纬度是一个点,半径是一个距离,不能直接加减,下面提供C#的解决方法
实现步骤 1、 查询接口 网站上这种类型的接口还不少,笔者直接找了百度地图的接口做,接口文档,调用的API是Geocoding API中的地理编码服务 请求示例:对北京市百度大厦进行地理编码查询 ...这里面需要一个ak参数,...
(地区经纬度信息获取(利用Google地图API获取).
一个经纬度帮助类,包含:转化为弧度,两经纬度之间的距离(返回的距离,单位km),根据一个给定经纬度的点和距离,进行附近地点查询
本文实例讲述了PHP查询附近的人及其距离的实现方法。分享给大家供大家参考,具体如下: <?php //获取该点周围的4个点 $distance = 1;//范围(单位千米) $lat = 113.873643; $lng = 22.573969; define('EARTH_...
place WHERE geohash LIKE 'wx4g0e%'),即可查询附近的所有地点。Geohash比直接用经纬度的高效很多。用途: 移动互联网,lbs可以说是一个基础应用,geohash对于解决附近地点搜索提供了一个有效的解决方案。扩展: ...
下面小编就为大家带来一篇mysql 搜寻附近N公里内数据的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring boot基于Redis Hash数据结构实现附近的人Demo,框架由Spring-boot实现,压缩包含源码以及部署jar包。代码清晰,有注释,考虑性能优化
日常开发中我们经常需要查找某个物体的定位,或者查找附近的范围等,我们自然而然会想到的方法就是利用各种提供服务的地图网站的API,基于API,用经纬度去实现定位和查找附近范围等等。然而,由于原理没有做一个了解...
易语言通过IP地址定位源码 精确到附近50米,源码是通过百度地图的接口获取本机IP的当前位置,可查询刀经纬度和附近建筑,调用了精易模块。
根据经纬度计算当前位置和目标位置的距离,也可以在数据库里很方便的查询
在演示视频中,用户可以通过手机APP快速定位并查询附近的公交站点和路线,方便实用。 总之,基于Android的公交查询系统为用户提供了一个便捷的查询服务,帮助用户更好地了解周围的公交信息,提高了出行效率。如果你...
js 运用百度地图接口插件,筛选方圆五公里的学校
非常使用的 基于geohash 找一定范围内的 最近位置java代码