搜索中心点周边内容:
一、先根据外包矩形进行数据过滤
/**
* 百度地图
* 获取给定经纬度和半径距离的经纬度范围
*
* @param lat 纬度
* @param lon 经度
* @param raidus 单位:m
* @return 数组 minLng, minLat, maxLng, maxLat
*/
public static double[] getAround(double lon, double lat, int raidus) {
Double latitude = lat;
Double longitude = lon;
Double degree = (24901 * 1609) / 360.0;
double raidusMile = raidus;
Double dpmLat = 1 / degree;
Double radiusLat = dpmLat * raidusMile;
Double minLat = latitude - radiusLat;
Double maxLat = latitude + radiusLat;
Double mpdLng = Math.abs(degree * Math.cos(latitude * (PI / 180)));
Double dpmLng = 1 / mpdLng;
Double radiusLng = dpmLng * raidusMile;
Double minLng = longitude - radiusLng;
Double maxLng = longitude + radiusLng;
return new double[] { minLng, minLat, maxLng, maxLat };
}
根据得到的这个坐标范围,编写sql,查询坐标经纬度在结果范围内的,可以初步得到结果。
二、判断目标点与圆心的距离,如果距离小于或等于半径,则满足要求。
public static double computeLength(double dwStartX, double dwStartY, double dwEndX, double dwEndY) {
double PI = 3.1415926535898D;
double latRadians1 = dwStartY * (PI / 180.0D);
double latRadians2 = dwEndY * (PI / 180.0D);
double latRadians = latRadians1 - latRadians2;
double lngRadians = dwStartX * (PI / 180.0D) - dwEndX * (PI / 180.0D);
double f = 2.0D * Math.asin(Math.sqrt(Math.pow(Math.sin(latRadians / 2.0D), 2.0D)
+ Math.cos(latRadians1) * Math.cos(latRadians2) * Math.pow(Math.sin(lngRadians / 2.0D), 2.0D)));
return f * 6378137.0D;
}
最后选取 result <= r 的集合。