Oracle代码计算点/质心/多边形之间的距离

时间:2019-12-03 18:50:53

标签: oracle geospatial distance alteryx

我为客户A和客户B建立了质心。现在,我需要使用质心将客户A和客户B之间的距离计算为英里。我如何在Oracle中做到这一点?

现在,我正在使用alteryx“距离”空间工具进行质心距离计算,但需要将其转换为oracle查询。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您具有笛卡尔坐标,则近似距离(如果由毕达哥拉斯定理给出)(如Matthew所提供)。

对于纬度/经度值,应该使用Oracle SDO_GEOM.SDO_DISTANCE内置函数(如果有)。

如果您的Oracle数据库未安装Oracle Spatial(需要额外付费),则可以使用Haversine formula来获取近似距离,如下所示:

CREATE OR REPLACE FUNCTION p2p_distance(
        p_latitude1 NUMBER,
        p_longitude1 NUMBER,
        p_latitude2 NUMBER,
        p_longitude2 NUMBER) 
    RETURN NUMBER DETERMINISTIC IS

    earth_radius NUMBER := 6371;
    pi NUMBER := ACOS(-1)/180; 

    lat_delta NUMBER;
    lon_delta NUMBER;
    arc NUMBER;

BEGIN

    lat_delta := (p_latitude2-p_latitude1)*pi;
    lon_delta := (p_longitude2-p_longitude1)*pi;
    arc := SIN(lat_delta/2) * SIN(lat_delta/2) + SIN(lon_delta/2) * SIN(lon_delta/2) * COS(p_latitude1*pi) * COS(p_latitude2*pi);
    return earth_radius * 2 * atan2(sqrt(arc), sqrt(1-arc));
END;

以公里为单位给出结果,如果您想获得里程,则用以英里为单位的值替换earth_radius

积分:https://connor-mcdonald.com/2017/01/17/haversine-plsql/

答案 1 :(得分:0)

质心只是一个点,它是给定几何形状(形状,点集,等等)的质心。因此,它们之间的距离只是勾股定理。

例如,在Oracle中查找点(1,1)和(4,5)之间的距离:

select sqrt(power(4-1,2)+power(5-1,2)) distance from dual;
+----------+
| DISTANCE |
+----------+
|        5 |
+----------+

如果您使用内置的Oracle类型SDO_GEOMETRY来表示您的观点,则可以使用SDO_GEOM.DISTANCE函数。例如,

with centroids as (
select sdo_geometry(2001 /* 2001=single point in 2 dimensions using non linear referencing system geometry */, 
                    null, 
                    sdo_point_type(1,1,0), 
                    null, 
                    null) point_x,
       sdo_geometry(2001 /* 2001=single point in 2 dimensions using non linear referencing system geometry */, 
                    null, 
                    sdo_point_type(4,5,0), 
                    null, 
                    null) point_y                   
from dual )
SELECT sdo_geom.sdo_distance(point_x, point_y, 0.005) distance
from centroids;
+----------+
| DISTANCE |
+----------+
|        5 |
+----------+

针对在地球上有客户的人的更新

如果质心以纬度和经度给出,则如上所述,您需要使用SDO_GEOM.SDO_DISTANCE函数,但要表明您正在使用WGS84坐标(纬度和经度)。像这样:

with centroids as (
select sdo_geometry(2001 /* 2001=single point in 2 dimensions using non linear referencing system geometry */, 
                    4326,   -- Spatial reference system id (SRID) for WGS84 coordinates
                    sdo_point_type(74.0060,40.7128,null), 
                    null, 
                    null) point_x,
       sdo_geometry(2001 /* 2001=single point in 2 dimensions using non linear referencing system geometry */, 
                    4326,   -- Spatial reference system id (SRID) for WGS84 coordinates
                    sdo_point_type(118.2437,34.0522,null), 
                    null, 
                    null) point_y                   
from dual )
SELECT sdo_geom.sdo_distance(point_x, point_y, 0.005, 'unit=km') distance
from centroids;
+-------------------+
|          DISTANCE |
+-------------------+
|  3944.42223197608 |
+-------------------+

我给出的示例点是针对纽约和洛杉矶的。答案以公里为单位。请注意,构造SDO_POINT_TYPE时必须先指定经度。