空间求交

搜索中心点周边内容:

一、先根据外包矩形进行数据过滤
/**
* 百度地图
* 获取给定经纬度和半径距离的经纬度范围
*
* @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 的集合。

你可能感兴趣的:(空间求交)