(注:知识浩瀚,本人能力有限,定有不足,望各位多多指点,不足之处请指出,俺好随时改进,小的无以为报,在此鞠躬致谢…)
根据自身经纬度,查询周围一定范围内的地理位置(经纬度),这在很多需要定位的项目中经常遇到。下面是我在项目中遇到后,各种上网搜索后,然后自己整理的:
/**
* 获取附近dis千米内的站点
* @param lon [经度]
* @param lat [纬度]
* @param dis [半径范围(单位:千米)]
* @return [符合条件站点的list集合]
*/
public List<Map<String, Object>> getNeighStation(double lon,double lat, double dis){
//先计算查询点的经纬度范围
double r = 6371;//地球半径千米
double dlng = 2*Math.asin(Math.sin(dis/(2*r))/Math.cos(lat*Math.PI/180));
dlng = dlng*180/Math.PI;//角度转为弧度
double dlat = dis/r;
dlat = dlat*180/Math.PI;
double minlat =lat-dlat;
double maxlat = lat+dlat;
double minlng = lon -dlng;
double maxlng = lon + dlng;
String getStaSql = "select distinct(sta.station_id) as stationid, sta.station_name as stationname, sta.station_memo as stationmemo," +
" sta.longitude as lon, sta.latitude as lat" +
" from bus_station_tb sta where sta.longitude between ? and ? and sta.latitude between ? and ?";
Object[] values = {minlng,maxlng,minlat,maxlat};
List<Map<String, Object>> stationList = daService.getAll(getStaSql, values);
List<Map<String, Object>> staList = new ArrayList<Map<String,Object>>();
for (int i = 0; i < stationList.size(); i++) {
double lon2 = Double.valueOf(stationList.get(i).get("lon").toString());
double lat2 = Double.valueOf(stationList.get(i).get("lat").toString());
double len = GetDistance(lat,lon,lat2,lon2);
if (len <= 300) {
staList.add(stationList.get(i));
}
}
return stationList;
}
/**
* 计算两个经纬度之间的距离
* @param lat1 [纬度1]
* @param lng1 [经度1]
* @param lat2 [纬度2]
* @param lng2 [经度2]
* @return [两点之间的距离]
*/
public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double r = 6371.393;//地球半径千米
double radLat1 = lat1 * Math.PI / 180.0;
double radLat2 = lat2 * Math.PI / 180.0;
double a = radLat1 - radLat2;
double b = (lng1 * Math.PI / 180.0) - (lng2 * Math.PI / 180.0);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s * r;
s = Math.round(s * 1000);
return s;
}