javascript:
/**
* @param raidus 单位米
* return minLat,minLng,maxLat,maxLng
*/
this.getCircleBround=function(lon,lat,raidus){
var PI = 3.14159265;
var EARTH_RADIUS = 6378137;
var RAD = Math.PI / 180.0;
var latitude = lat;
var longitude = lon;
var degree = (24901*1609)/360.0;
var raidusMile = raidus;
var dpmLat = 1/degree;
var radiusLat = dpmLat*raidusMile;
//alert('latitude:'+latitude);
//alert('radiusLat:'+radiusLat);
var minLat = eval(latitude) - eval(radiusLat);
var maxLat = eval(latitude) + eval(radiusLat);
var mpdLng = degree*Math.cos(latitude * (PI/180));
var dpmLng = 1 / mpdLng;
var radiusLng = dpmLng*raidusMile;
//alert('radiusLng:'+radiusLng);
//alert('longitude:'+longitude);
var minLng = eval(longitude) - eval(radiusLng);
var maxLng = eval(longitude) + eval(radiusLng);
//alert('maxLng:'+maxLng);
//alert("["+minLng+","+minLat+","+maxLng+","+maxLat+"]");
return minLng+','+minLat+','+maxLng+','+maxLat;
}
java:
public class LatLonUtil {
private static final double PI = 3.14159265;
private static final double EARTH_RADIUS = 6378137;
private static final double RAD = Math.PI / 180.0;
//@see http://snipperize.todayclose.com/snippet/php/SQL-Query-to-Find-All-Retailers-Within-a-Given-Radius-of-a-Latitude-and-Longitude--65095/
//The circumference of the earth is 24,901 miles.
//24,901/360 = 69.17 miles / degree
/**
* @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 * (PI/180));
Double dpmLng = 1 / mpdLng;
Double radiusLng = dpmLng*raidusMile;
Double minLng = longitude - radiusLng;
Double maxLng = longitude + radiusLng;
//System.out.println("["+minLat+","+minLng+","+maxLat+","+maxLng+"]");
return new double[]{minLat,minLng,maxLat,maxLng};
}
/**
* 根据两点间经纬度坐标(double值),计算两点间距离,单位为米
* @param lng1
* @param lat1
* @param lng2
* @param lat2
* @return
*/
public static double getDistance(double lng1, double lat1, double lng2, double lat2)
{
double radLat1 = lat1*RAD;
double radLat2 = lat2*RAD;
double a = radLat1 - radLat2;
double b = (lng1 - lng2)*RAD;
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 * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000;
return s;
}
public static void main(String[] args){
Double lat1 = 34.264648;
Double lon1 = 108.952736;
int radius = 1000;
//[34.25566276027792,108.94186385411045,34.27363323972208,108.96360814588955]
getAround(lat1,lon1,radius);
//911717.0 34.264648,108.952736,39.904549,116.407288
double dis = getDistance(108.952736,34.264648,116.407288,39.904549);
System.out.println(dis);
}
}
一共有两个方法
第一个是 根据提供的经度和纬度、以及半径,取得此半径内的最大最小经纬度
第二个就是根据提供的两个经纬度计算距离
请教下大侠,已知参数(x,y)圆中心坐标,计算出20公里之内出现的商家“坐标“点,此坐商家标点在数据库已经有。怎么计算。
这个到不难,假设 商家为 (sx, sy):
1、范围框定:首先用 x-20,y-20 ~ x+20,y+20 做大范围过滤,必须快速缩小范围,否则浪费性能;
2、精确匹配:然后用在用 sqrt((sx - x)^2 + (sx - y)^2) <= 20 判定是否20公里内。
步骤 1 和 2都可以交给数据库,步骤1可1借助索引快速完成,步骤2需要计算。