系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
前言
一、空间范围中点位数量的快速统计算法
1.引入库
2.百度地图基于范围的搜索 Java
应用场景描叙: 假设数据库中有一个商家的table,里面记录了一些商家的基本信息和坐标,
那么如何在自己的APP中,通过定位,利用百度地图快速查找指定区域内符合条件的商家?
以下是java 代码的实现:
/**
* 百度地图
* 获取给定经纬度和半径距离的经纬度范围
*
* @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语句,就可以在指定区域内快速查找符合条件的商家。
这样做,比把客户信息直接存放到百度云,然后再调用百度地图API来搜索的速度要快很多
3.Java地图坐标查询距离内经纬度范围,及距离大小
一、计算两个经纬度坐标的距离
/**
* 求两点之间的距离
* @param long1 A点经度
* @param lat1 A点纬度
* @param long2 B点经度
* @param lat2 B点纬度
* @return 两点距离
*/
public double getDistance(double long1, double lat1, double long2, double lat2) {
double a, b, R;
R = 6378137;//地球半径
lat1 = lat1 * Math.PI / 180.0;
lat2 = lat2 * Math.PI / 180.0;
a = lat1 - lat2;
b = (long1 - long2) * Math.PI / 180.0;
double d;
double sa2, sb2;
sa2 = Math.sin(a / 2.0);
sb2 = Math.sin(b / 2.0);
d = 2 * R * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1) * Math.cos(lat2) * sb2 * sb2));
return d;
}
二、获取某个定位点经纬度,固定半径的经纬度范围
/**
* 根据经纬度和半径计算经纬度范围
*
* @param raidus 单位米
* @return minLat, minLng, maxLat, maxLng
*/
public static double[] getAround(double lat, double lon, 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 = degree * Math.cos(latitude * (Math.PI / 180));
Double dpmLng = 1 / mpdLng;
Double radiusLng = dpmLng * raidusMile;
Double minLng = longitude - radiusLng;
Double maxLng = longitude + radiusLng;
return new double[]{minLat, minLng, maxLat, maxLng};
}