Вопрос по SDO_GEOMETRY, что не так?

alex-chem
Дата: 23.11.2008 13:36:01
Есть следующая процедура
numarr SDO_ORDINATE_ARRAY := SDO_ORDINATE_ARRAY();

x number; y number; h number; i number;

CURSOR poly IS SELECT row x1, col y1, val*100 h1
FROM table1 a
where row_num < 100 and col_num < 100 order by 1,2;
begin

i := 1;

OPEN poly;
LOOP
FETCH poly INTO x, y, h;
EXIT WHEN poly%NOTFOUND;

numarr.EXTEND;
numarr(i) := x;

numarr.EXTEND;
numarr(i+1) := y;

numarr.EXTEND;
numarr(i+2) := h;

i := i + 3;
END LOOP;
CLOSE poly;

insert into table2 values (1, SDO_GEOMETRY(3005, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1,10000), numarr));
commit;

курсором poly выбирается 10000 строк, по 3 значения в каждой, т.е. в массиве numarr 30000 элементов типа number но в таблицу table2 вставляется массив типа SDO_ORDINATE_ARRAY в котором только 100 элементов, ПОЧЕМУ???
ZVV
Дата: 23.11.2008 14:51:22
Drop Table Table2
/
Create Table Table2
( Num Int,  Geom Sdo_geometry)
/

Declare
   Numarr   Sdo_ordinate_array := Sdo_ordinate_array ();
   X        Number;
   Y        Number;
   H        Number;
   I        Number;
   Cnt      Int;
   Geom     Sdo_geometry;

   Cursor Poly
   Is
      Select Rownum X1, Rownum Y1, Rownum * 100 H1
        From All_tables, All_tables
       Where Rownum <= 10000;
Begin
   I := 1;

   Open Poly;

   Loop
      Fetch Poly
       Into X, Y, H;

      Exit When Poly%Notfound;
      Numarr.Extend;
      Numarr (I) := X;
      Numarr.Extend;
      Numarr (I + 1) := Y;
      Numarr.Extend;
      Numarr (I + 2) := H;
      I := I + 3;
   End Loop;

   Close Poly;

   dbms_output.Put_line (Numarr.Count);

   Insert Into Table2
        Values (1, Sdo_geometry (3005, Null, Null, Sdo_elem_info_array (1, 1, 10000), Numarr));

   Commit;

   Select Table2.Geom
     Into Geom
     From Table2
    Where Num = 1;

   dbms_output.Put_line (Geom.Sdo_ordinates.Count);
End;

Результат:
30000
30000
alex-chem
Дата: 23.11.2008 16:52:10
Спасибо, с этим разобрался.
Еще вопрос, не могу создать пространственный индекс
CREATE INDEX Table2_Geom_idx
ON Table2
(Geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
alex-chem
Дата: 23.11.2008 17:05:35
alex-chem
Спасибо, с этим разобрался.
Еще вопрос, не могу создать пространственный индекс
CREATE INDEX Table2_Geom_idx
ON Table2
(Geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;


понял, нужно сначала занести запись о метаданных
INSERT INTO user_sdo_geom_metadata
(TABLE_NAME,
COLUMN_NAME,
DIMINFO,
SRID)
VALUES (
'cola_markets',
'shape',
SDO_DIM_ARRAY( -- 20X20 grid
SDO_DIM_ELEMENT('X', 0, 20, 0.005),
SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
),
NULL -- SRID
);

только как будет выглядеть для меня этот кусок

SDO_DIM_ELEMENT('X', 0, 20, 0.005),
SDO_DIM_ELEMENT('Y', 0, 20, 0.005)

у меня 3 измерения, т.е. получится так

SDO_DIM_ELEMENT('X', 0, 20, 0.005),
SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
SDO_DIM_ELEMENT('Z', 0, 20, 0.005),

а какими нужно задать занения которые в пример 0, 20, 0.005?
ZVV
Дата: 23.11.2008 17:19:23
alex-chem, а в доке посмотреть?

автор
The SDO_DIM_ELEMENT type is defined as:

Create Type SDO_DIM_ELEMENT as OBJECT (
SDO_DIMNAME VARCHAR2(64),
SDO_LB NUMBER,
SDO_UB NUMBER,
SDO_TOLERANCE NUMBER);

......
Each SDO_DIM_ELEMENT instance in the array
must have valid (not null) values for the SDO_LB, SDO_UB, and SDO_
TOLERANCE attributes.


Lower Bound, Upper Bound & Tolerance (шаг, точность).
Что вам нужно - вам видней.
alex-chem
Дата: 24.11.2008 10:13:16
ну подскажите еще, как мне выбрать все строки, точки в которых попадают (не обязательно полностью) в заданную область? знаю пр существование SDO_CONTAINS, SDO_COVEREDBY, SDO_COVERS, SDO_INSIDE но не получается задать область
запрос ничего не возвращает:
select * from Table2
where 'TRUE' = SDO_COVEREDBY(Geom, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),
SDO_ORDINATE_ARRAY(0, 0,
350, 350
)))
alex-chem
Дата: 24.11.2008 10:44:21
alex-chem
ну подскажите еще, как мне выбрать все строки, точки в которых попадают (не обязательно полностью) в заданную область? знаю пр существование SDO_CONTAINS, SDO_COVEREDBY, SDO_COVERS, SDO_INSIDE но не получается задать область
запрос ничего не возвращает:
select * from Table2
where 'TRUE' = SDO_COVEREDBY(Geom, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),
SDO_ORDINATE_ARRAY(0, 0,
350, 350
)))


Вообще возможно ли такое сравнение, в Table2.Geom точки с 3-мя параметрами SDO_GEOMETRY(3005
Alexander Konakov
Дата: 24.11.2008 13:59:24
alex-chem
alex-chem
ну подскажите еще, как мне выбрать все строки, точки в которых попадают (не обязательно полностью) в заданную область? знаю пр существование SDO_CONTAINS, SDO_COVEREDBY, SDO_COVERS, SDO_INSIDE но не получается задать область
запрос ничего не возвращает:
select * from Table2
where 'TRUE' = SDO_COVEREDBY(Geom, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),
SDO_ORDINATE_ARRAY(0, 0,
350, 350
)))


Вообще возможно ли такое сравнение, в Table2.Geom точки с 3-мя параметрами SDO_GEOMETRY(3005

SDO_RELATE с mask=ANYINTERACT?
alex-chem
Дата: 24.11.2008 15:25:39
автор
SDO_RELATE с mask=ANYINTERACT?

работает и просто вызов SDO_COVEREDBY, у меня была ошибка в формировании самого Table2.Geom.
теперь все работает:
select * from Table2
where 'TRUE' = --SDO_CONTAINS
SDO_ANYINTERACT
(Geom , SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),
SDO_ORDINATE_ARRAY(0, 0, 100,100)))
Alexander Konakov
Дата: 24.11.2008 15:29:20
alex-chem,
Поздравляю. Но пользуйте, блин, тэг SRC - совершенно невозможно код читать