簡體   English   中英

Oracle Spatial-SDO_BUFFER不起作用?

[英]Oracle Spatial - SDO_BUFFER does not work?

我有一個包含SDO_Geometries的表,並查詢所有幾何圖形以查找其起點和終點,然后將這些點插入到另一個名為ORAHAN的表中。 現在,我的主要目的是針對orahan中的每個點,在給點2 cm的緩沖區時,我必須找出它是否與orahan中的另一個點相交。 因此,我使用Relate和Bufer函數編寫了一些pl sql,但是當我查看地圖信息中的某些記錄時,我發現距自身1厘米范圍內的點,但在稱為ORAHANCROSSES的相交表中沒有記錄。 我是錯誤地使用這些功能還是什么?

注意:我正在使用Oracle Database 11g企業版11.2.0.1.0版-64位生產和PL / SQL版本11.2.0.1.0版-和SDO_PACKAGE

ORAHAN大約有40萬條記錄(點和其他列)。

declare
BEGIN
 for curs in (select * from ORAHAN t) loop
   for curs2 in (select *
                   from ORAHAN t2
                  where SDO_RELATE(t2.geoloc,SDO_GEOM.SDO_BUFFER(curs.geoloc,0.02,0.5) , 
                  'mask=ANYINTERACT') = 'TRUE'
                    and t2.mi_prinx <> curs.mi_prinx) loop                    
     Insert INTO ORAHANCROSSES
     values
       (curs.Mip, curs.Startmi, curs2.Mip, curs2.Startmi);
     commit;
   end loop;
 end loop;
END;

這是MapInfo地圖圖像,顯示了彼此接近1厘米的3個點。 但是在orahancross中,沒有與這3個匹配的記錄。

注意:0,00001000km等於1cm 在此處輸入圖片說明

Orahan元數據:

select * from user_sdo_geom_metadata where table_name = 'ORAHAN';

在此處輸入圖片說明

和diminfo:

在此處輸入圖片說明

您的數據坐標系是什么? 而且,最重要的是,您在元數據中設置了什么容忍度

其他一些評論:

1)不要使用與緩沖區關聯的方法。 只需使用距離內方法即可。

2)您不需要使用PL / SQL循環進行此類查詢,只需使用簡單的CTAS:

create table orahancrosses as
select c1.mip mip_1, c1.startmi startmi_1, c2.mip mip_2, c2.startmi startmi_2
from orahan c1, orahan c2
where sdo_within_distance (c2.geoloc, c1.geoloc, 'distance=2 unit=cm') = 'TRUE'
and c2.mi_prinx <> c1.mi_prinx;

3)按照書面規定,兩厘米以內的點A和B將返回兩次:一次為(A,B),再次為(B,A)。 為了避免這種情況(並且僅返回其中一種情況),請編寫如下查詢:

create table orahancrosses as
select c1.mip mip_1, c1.startmi startmi_1, c2.mip mip_2, c2.startmi startmi_2
from orahan c1, orahan c2
where sdo_within_distance (c2.geoloc, c1.geoloc, 'distance=2 unit=cm') = 'TRUE'
and c1.rowid < c2.rowid;

3)使用SDO_JOIN技術可以更好地處理您提到的點數(400000+),如下所示:

create table orahancrosses as
select c1.mip mip_1, c1.startmi startmi_1, c2.mip mip_2, c2.startmi startmi_2
from  table (
        sdo_join (
          'ORAHAN','GEOLOC',
          'ORAHAN','GEOLOC',
          'DISTANCE=2 UNIT=CM'
        )
      ) j,
      orahan c1, 
      orahan c2
where j.rowid1 < j.rowid2
and c1.rowid = j.rowid1
and c2.rowid = j.rowid2;

這可能仍需要花費時間-根據數據庫服務器的容量。 如果您是Oracle Enterprise Edition的許可證,並且您的硬件具有適當的容量(內核數),那么並行性可以減少經過的時間。

4)您說您正在使用Oracle 11g。 確切的版本是什么? 11.2.0.4版是11gR2的終端版本。 不再支持任何較舊的版本。 到目前為止,您確實應該使用12cR1(12.1.0.2)。 12.1.0.2的主要優點是Vector Performance Accelerator功能,該功能可加快許多空間功能和運算符的速度(僅當您擁有適當的Oracle Spatial許可證時,免費的Oracle Locator功能不可用)。

======================================

在您的示例中使用這兩點。 讓我們計算距離:

select sdo_geom.sdo_distance(
  sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null), 
  sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.07336716,null),null,null),
  0.005
) distance
from dual;


  DISTANCE
----------
 .01000197

1 row selected.

注意,我沒有指定任何SRID。 假設坐標以米為單位,它們之間的距離確實略大於1厘米。

======================================

如您所注意到的,您的原始語法不起作用的原因是由於您為SDO_BUFFER()調用指定了公差。 您將其傳遞為0.5(= 50cm),以產生半徑為0.02(2cm)的緩沖區。 結果是產生的緩沖液有效地溶解到該點本身中。

例如,公差為0.5:

select sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.5) from dual;

生產:

SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(521554.782, 4230983.08, NULL), NULL, NULL)

公差為0.005時:

select sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.005) from dual;

您將獲得適當的緩沖區:

SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2), SDO_ORDINATE_ARRAY(521554.782, 4230983.06, 521554.802, 4230983.08, 521554.782, 4230983.1, 521554.762, 4230983.08, 521554.782, 4230983.06))

現在,非常接近的點與該緩沖區匹配:

select sdo_geom.relate(
  sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.005),
  'determine',
  sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.07336716,null),null,null),
  0.005
) relation
from dual;

RELATION
------------------------- 
CONTAINS

1 row selected.

======================================

現在,您的數據沒有正確的顯式SRID的事實意味着在測量或基於距離的搜索中使用顯式單位將不起作用。 由於數據庫不知道您的數據位於哪個坐標系中,因此它不知道如何確定兩個點之間的距離小於設定的厘米或米數。 您所能做的就是假設坐標單位為米。

因此,在我上面給出的示例中,將'DISTANCE=2 UNIT=CM'替換為'DISTANCE=0.02'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM