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;

select * from 商家表
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中的空间函数和索引。以下是一个例子:

  1. 创建商家表
    CREATE TABLE merchants (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(50),
      location POINT,
      SPATIAL INDEX (location)
    ) Engine=InnoDB;
    

  2. 插入商家数据
    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)'));
    

  3. 查询距离最近的商家
    #默认是米
    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

  4. 如果在添加索引时,出现了如下错误:All parts of a SPATIAL index must be NOT NULL

  5. 请执行如下语句:

    ALTER TABLE merchants MODIFY location point NOT NULL;
    ALTER TABLE merchants ADD SPATIAL INDEX (location);

以上是关于oracle数据库中 如果按商家的距离排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何ListView依照GPS距离排序

地理空间距离计算及优化(根据两个点经纬度计算距离)

地理空间距离计算及优化(依据两个点经纬度计算距离)

如何从按距离排序的 JPA 实体中获取结果?

[算法系列]算法一 地理空间距离计算优化

地理空间距离计算优化