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
])会产生差异。