SDO_CLOSEST_POINTS返回的两点的距离与dist本身返回

时间:2017-06-06 08:03:46

标签: oracle spatial

当我查询两个几何图形之间的距离时:

DECLARE
  dist  NUMBER;
  geoma SDO_GEOMETRY;
  geomb SDO_GEOMETRY;

BEGIN
  SDO_GEOM.SDO_CLOSEST_POINTS(sdo_geometry('POINT(10 10)', 4326),
                              sdo_geometry('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))',
                                           4326),
                              0.005,
                              NULL,
                              dist,
                              geoma,
                              geomb);
  insert into test (info, geom1, geom2) values (dist, geoma, geomb);

END;  

它返回如下:

  • 信息:1254057.74485897
  • geom1:10,10
  • geom2:2,2

但是当我查询两点之间的距离时:

SELECT sdo_geom.sdo_distance(sdo_geom.sdo_geometry('POINT(10 10)', 4326),
                             sdo_geom.sdo_geometry('POINT(2 2)',
                                                   4326),
                             0.0001,
                             'unit=M') distance_in_m
  from DUAL;

返回:1251344.03770147

为什么距离不一样?怎么回事? 感谢任何能给我一些想法的人。

1 个答案:

答案 0 :(得分:0)

SDO_GEOMETRY documentation后面提供了一种指定形状的不同方法。使用它,值是相同的:

DECLARE
  d1 NUMBER;
  d2 NUMBER;
  d3 NUMBER;
  g1 SDO_GEOMETRY := SDO_GEOMETRY(
                      2003,                              -- 2 dimensional polygon,
                      NULL,                              -- No SRID / Co-ordinate System
                      NULL,                              -- SDO_POINT,
                      SDO_ELEM_INFO_ARRAY( 1, 1003, 3 ), -- Rectangle exterior
                      SDO_ORDINATE_ARRAY( 0,0, 2,2 )     -- Corners
                     );
  g2 SDO_GEOMETRY := SDO_GEOMETRY(
                      2001,                              -- 2 dimensional point,
                      NULL,                              -- No SRID / Co-ordinate System
                      SDO_POINT_TYPE(10,10,NULL),        -- SDO_POINT,
                      NULL,                              -- Not an array
                      NULL                               -- Not an array
                     );
  g3 SDO_GEOMETRY := SDO_GEOMETRY(
                      2001,                              -- 2 dimensional point,
                      NULL,                              -- No SRID / Co-ordinate System
                      SDO_POINT_TYPE(2,2,NULL),        -- SDO_POINT,
                      NULL,                              -- Not an array
                      NULL                               -- Not an array
                     );
  ga SDO_GEOMETRY;
  gb SDO_GEOMETRY
BEGIN
  SDO_GEOM.SDO_CLOSEST_POINTS(
    geom1     => g1,
    geom2     => g2,
    tolerance => 0.005,
    unit      => NULL,
    dist      => d1,
    geoma     => ga,
    geomb     => gb
  );

  d2 := SDO_GEOM.SDO_DISTANCE( g2, g3, 0.0001, NULL );

  d3 := SDO_GEOM.SDO_DISTANCE( g1, g3, 0.0001, NULL );

  DBMS_OUTPUT.PUT_LINE( d1 || ', ' || d2 || ', ' || d3 );
END;
/

<强>输出

11.3137084989848, 11.3137084989848, 11.3137084989848

作为一个额外的奖励,距离现在是SQRT(8*8 + 8*8),这是从(2,2)到(10,10)的笛卡尔距离,你也可以使用SDO_DISTANCE与多边形或者指出同样的答案。