根据经纬度查询最近距离,mysql查询经纬度附近范围

public class Test{

private static List<LocalAddress> ilist = new ArrayList<LocalAddress>();
public static void main(String[] args) {
Test test3 = new Test();
Double localDouble = 0.0;

//定义一个二维数组存放经纬度
Double[][] doubles = {
{ 22.6036906766, 113.8793209706 }, //雍华源
{ 22.5205569549, 113.9394272419 }, //西海湾花园
{ 22.6494305358, 114.0411629507 }, //世纪春城4期
{ 22.5255080247,114.0384880750 }, //金海湾花园
{ 22.5246432654,114.0720634923 }, //金港豪庭
{ 22.5963291708,113.9689558477 }, //得意名居
{ 22.5509638661,113.9358124450 }, //麒麟花园A区西门
{ 22.5509638661,113.9358124450 }, //麒麟花园A区北门
{ 22.5254496086,114.0555439122 }, //裕康时尚名居
{ 22.7789489191,114.3063672776 }, //桑泰丹华园
{ 22.5240537775,114.0641924822 }, //皇庭彩园
{ 22.5141408858,114.0624887496 } }; //城市3米6

//门店的经纬度
Double[] initlocal = {22.539899298946577,113.95296375395431 };


for (int i = 0; i < doubles.length; i++) {
System.out.println("doubles.length==============="+doubles.length);
System.out.println("(" + doubles[i][0] + "," + doubles[i][1] + ")");
Double z = test3.getDistance(doubles[i][0], doubles[i][1],initlocal[0], initlocal[1]);
System.out.println(z);
//获取最短距离后把经纬度和距离存放到对象中
LocalAddress localaddress = new LocalAddress(doubles[i][0], doubles[i][1], z);
//将对象用list保存
ilist.add(localaddress);
}

List<LocalAddress> shotlocal = getLocalList();
Double lat=shotlocal.get(0).getLat();
Double lon= shotlocal.get(0).getLon();
localDouble = shotlocal.get(0).getDistance();
System.err.println("最近的距离:" + localDouble + "。对应的经纬是:" +"(" + lat + "," + lon + ")");
}

/*第一种求最近距离 ===================================================*/
/**
* 获取最短的距离
* @param lat
* @param lon
* @param initlat
* @param initlon
* @return
*/
public Double GetShotLocal(Double lat, Double lon, Double initlat,Double initlon) {
Double x = (initlat - lat) * (initlat - lat);
Double y = (initlon - lon) * (initlon - lon);
Double z = Math.sqrt(x + y);
return z;
}

/**
* 对List<LocalAddress> 进行排序
* @return
*/
public static List<LocalAddress> getLocalList() {
Collections.sort(ilist, new Comparator<LocalAddress>() {
@Override
public int compare(LocalAddress arg0, LocalAddress arg1) {
Double double1 = arg0.getDistance();
Double double2 = arg1.getDistance();
if(double1>double2){
return 1;
}else if (double1 == double2) {
return 0;
}else {
return -1;
}
}
});
return ilist;
}

/* 第二种求最近距离 ==================================================================*/
private static final double EARTH_RADIUS = 6378.137;//地球半径,单位千米
private static double rad(double d)
{
return d * Math.PI / 180.0;
}

/**
*
* @param lat1 第一个纬度
* @param lng1 第一个经度
* @param lat2 第二个纬度
* @param lng2 第二个经度
* @return 两个经纬度的距离
*/
public static double getDistance(double lat1,double lng1,double lat2,double lng2)
{
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);

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;

}



}


entity
public class LocalAddress {

private Double lat; //纬度
private Double lon; //经度
private Double distance; //最近距离

public LocalAddress() {
// TODO Auto-generated constructor stub
}

public LocalAddress(Double lat, Double lon, Double distance) {
super();
this.lat = lat;
this.lon = lon;
this.distance = distance;
}

}



<!--根据经纬度查询最近距离范围-->
<select id="SelectDistanceByLat" parameterType="map" resultType="map">
SELECT
*,(
6371 * acos (
cos ( radians(#{lat}) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(#{lng}) )
+ sin ( radians(#{lat}) )
* sin( radians( lat ) )
)
) AS distance
FROM machine
HAVING 3 > distance
ORDER BY distance
LIMIT 0 , 20;
</select>

转载于:https://www.cnblogs.com/tomingto/p/11102240.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PHP中可以使用第三方库或者算法来计算给定经纬度范围内的点。具体的实现可以使用 MySQL 的空间函数或者 PHP 的第三方库,例如 geoPHP 。 如果使用 MySQL 的空间函数,你需要在数据库中存储经纬度信息并且支持空间数据类型。然后你可以使用 MySQL 的 ST_Contains() 函数来查询给定经纬度范围内的点。 如果使用第三方库,则可以使用 geoPHP 库来计算给定经纬度范围内的点。geoPHP 提供了各种函数来计算空间数据,如编码、距离计算、面积计算等。 ### 回答2: PHP经纬度查询范围是指利用PHP编程语言来查询指定经纬度范围内的数据或信息。在PHP中,我们可以利用经纬度的数值和一些特定的函数来实现这个功能。 要实现经纬度查询范围功能,首先需要明确查询范围是半径还是矩形范围。如果是半径范围,我们可以使用Haversine公式计算给定经纬度和半径的圆形范围内的地点。这个公式可以计算地球球面上两个点之间的距离。 如果是矩形范围,我们可以使用纬度和经度的最大最小值来实现。例如,我们可以定义一个矩形区域的南北边界和东西边界,然后在数据库查询位于该矩形范围内的数据。 在PHP中,有一些常用的函数可以帮助实现这些功能。例如,我们可以使用haversine函数计算两个经纬度之间的距离,再与给定的半径进行比较,以确定是否在查询范围内。 另外,我们可以使用SQL语句来查询数据库中符合条件的数据。例如,我们可以使用SELECT语句结合WHERE子句来筛选出位于特定经纬度范围内的数据。 总之,通过使用PHP中的一些特定函数和SQL查询语句,我们可以实现经纬度查询范围的功能。这可以帮助我们在地理信息系统、位置服务和其他应用中有效地查询和分析数据。 ### 回答3: PHP经纬度查询范围指的是通过PHP代码来查询特定经纬度范围内的地理点或位置。在PHP中,可以使用一些地理位置相关的库或API来实现这个功能。 一种常用的方法是通过调用第三方地理位置信息的API来实现范围查询。例如,可以使用谷歌地图的API或百度地图的API来查询指定经纬度范围内的地理位置。这些API提供了接口来传入经纬度范围参数,并返回符合条件的地理位置信息。 在PHP代码中,可以使用curl或http请求库来调用这些API,并通过传入相应的参数来查询指定经纬度范围内的地理位置。一般来说,需要传入一个矩形的边界坐标作为查询范围,在谷歌地图API中可以使用`bounds`参数,而在百度地图API中可以使用`bounds`或`bounds_ll`和`bounds_ur`参数。 通过调用API并解析返回的结果,可以获取指定经纬度范围内的地理位置数据,例如名称、经纬度、地址等信息。可以根据具体需求进一步处理这些数据,比如展示在地图上或进行其他相应的操作。 需要注意的是,不同的地图API可能有不同的查询限制和计费方式,使用前需要进行相关的了解和配置。此外,还需要确保PHP代码中网络请求相关的库已经安装和配置,并且有相应的API访问权限和密钥。 总之,通过PHP调用地图API来实现经纬度查询范围是一种常用的方法。以谷歌地图和百度地图为例,可以通过传入经纬度范围参数,获取指定范围内的地理位置信息,并进行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值