oracle数据库中 如果按商家的距离排序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库中 如果按商家的距离排序?相关的知识,希望对你有一定的参考价值。
如题,数据库已有商家的经纬度信息 x:经度,y:纬度,假设当前用户的经纬度分别为x1,y1。已知到根据两个经纬度求出距离的函数(php函数,本人是php程序员)那么在数据库中按商家排序的sql语句该如何写。
附:根据经纬度求距离的函数
/*
@param lng1,lng2 经度
* @param lat1,lat2 纬度
* @return float 距离,单位米
* @author www.Alixixi.com
* */
function getdistance($lng1, $lat1, $lng2, $lat2)
//将角度转为狐度
$radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
$radLat2 = deg2rad($lat2);
$radLng1 = deg2rad($lng1);
$radLng2 = deg2rad($lng2);
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
return $s;
order by 2*asin(sqrt(power(sin((经度-你的经度)*3.14159265359/180/2),2)+cos(纬度*3.14159265359/180)*cos(你的纬度*3.14159265359/180)*power(sin((纬度-你的纬度)*3.14159265359/180/2),2)))*6378.137*1000
大致如上追问
sqrt(power(sin((经度-你的经度)这里的是两个都是纬度吧?
追答哦,前面是纬度-你的纬度,后面是经度-你的经度,不好意思,把你的代码看错了
参考技术A 将就距离的方法写成oracle的function 假设名为 getdistance如果要按照商家到某固定点的距离排序,可以这么写
select * from tab order by getdistance(pX,pY,x,y)
pX,pY为固定的的坐标
x,y为商家坐标 参考技术B 同意楼上的,你可以参考一下,我用的是拓林思的系统+mysql的库,至于Oracle我还真是欠些火候。
mysql8计算商家距离,按照由近及远排序
要计算商家距离并按照距离排序,可以使用MySQL 8中的空间函数和索引。以下是一个例子:
- 创建商家表
CREATE TABLE merchants ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), location POINT, SPATIAL INDEX (location) ) Engine=InnoDB;
- 插入商家数据
INSERT INTO merchants (name, location) VALUES ('商家A', ST_PointFromText('POINT(120.1435 30.2567)')), ('商家B', ST_PointFromText('POINT(120.1723 30.3249)')), ('商家C', ST_PointFromText('POINT(120.0674 30.2987)')), ('商家D', ST_PointFromText('POINT(119.9876 30.1459)')), ('商家E', ST_PointFromText('POINT(120.0452 30.1243)'));
- 查询距离最近的商家
#默认是米 SELECT id, name, ST_Distance_Sphere(location, ST_PointFromText('POINT(120.1325 30.2678)')) AS distance FROM merchants ORDER BY distance ASC; # 把米转换成公里 SELECT id, name, CONCAT(ROUND(ST_Distance_Sphere(location, ST_PointFromText('POINT(113.597219 34.783522)'))/1000,2),'公里') AS distance FROM merchants ORDER BY distance ASC;
在此示例中,ST_Distance_Sphere()函数用于计算两个点之间的球面距离(单位为米)。查询将返回距离指定坐标最近的商家,并按距离从近到远排序。
注意:为了使此查询更有效率,需要使用空间索引
idx_location
。 -
如果在添加索引时,出现了如下错误:All parts of a SPATIAL index must be NOT NULL
-
请执行如下语句:
ALTER TABLE merchants MODIFY location point NOT NULL; ALTER TABLE merchants ADD SPATIAL INDEX (location);
以上是关于oracle数据库中 如果按商家的距离排序?的主要内容,如果未能解决你的问题,请参考以下文章