Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SDO_最近点返回的两个点的距离与dist本身返回的距离不同_Oracle_Spatial - Fatal编程技术网

Oracle SDO_最近点返回的两个点的距离与dist本身返回的距离不同

Oracle SDO_最近点返回的两个点的距离与dist本身返回的距离不同,oracle,spatial,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))',

当我查询两个几何体之间的距离时,如下所示:

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;  
它返回的结果如下:

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
  • 图1: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

为什么距离不一样?它是如何发生的? 感谢所有能给我一些想法的人。

以下给出了指定形状的不同方法。使用此选项,值是相同的:

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_距离,1254057.74485897.我认为点对多边形和点对点之间的计算是不合适的。@chen.wenwen坐标系(SRID)是问题的根本原因-因为其他一切都保持不变,将一件事(从无坐标系[
NULL
]更改为纬度/经度[
4326
])会产生差异。