我为客户A和客户B建立了质心。现在,我需要使用质心将客户A和客户B之间的距离计算为英里。我如何在Oracle中做到这一点?
现在,我正在使用alteryx“距离”空间工具进行质心距离计算,但需要将其转换为oracle查询。
谢谢!
答案 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
。
答案 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
时必须先指定经度。