Как написать оператор множественного выбора для создания таблицы в пространственном оракуле?

Я пытаюсь создать таблицу геометрии на основе другой таблицы с долготой. Я пытаюсь создать два столбца со сферическим Меркатором (SRID 4326, географическая система координат) и другой столбец с проекционной системой координат (SRID 3857) в таблице. Ниже мой запрос.

create table KP_SPTL(
                            select mdsys.sdo_geometry(
                                                        2003, 
                                                        4326, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_GCS,
                              select mdsys.sdo_geometry(
                                                        2003, 
                                                        3857, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_PCS,
                                                      B.COMPANY, B.ADDRS,B_CDE
                              FROM KP_STAGE B);

Я получаю следующую ошибку

Error report:
SQL Error: ORA-00936: missing expression
00936. 00000 -  "missing expression"

Однако, если я удаляю второй оператор выбора, он работает нормально, я имею в виду, если запрос sql выглядит следующим образом:

create table KP_SPTL(
                            select mdsys.sdo_geometry(
                                                        2003, 
                                                        4326, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_GCS,
                                                      B.COMPANY, B.ADDRS,B_CDE
                              FROM KP_STAGE B);

Как использовать второй оператор выбора, если это обычный запрос, мы можем использовать оператор выбора из. а как пользоваться в этом случае?


person Karthik Prasad    schedule 28.01.2014    source источник


Ответы (2)


Я вообще не знаю, что такое oracle Spatial. но я думаю, что просто с помощью Lookin SQL ниже будет работать.!

mdsys.sdo_geometry() возвращает TYPE sdo_geometry, и его можно использовать в предложении A SELECT несколько раз. Нам не нужно каждый раз сопровождать SELECT.

Это как SELECT B.COMPANY, B.ADDRS,B_CDE .. вам не нужно всегда ставить префикс SELECT!

Общий синтаксис SQL может быть SELECT <types/columns> FROM <view/table> WHERE <conditions>

create table KP_SPTL(
                            select mdsys.sdo_geometry(
                                                        2003, 
                                                        4326, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_GCS,
                              mdsys.sdo_geometry(
                                                        2003, 
                                                        3857, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_PCS,
                                                      B.COMPANY, B.ADDRS,B_CDE
                              FROM KP_STAGE B);
person Maheswaran Ravisankar    schedule 28.01.2014
comment
Удивительно!! спасибо за быстрое и точное решение. Не могли бы вы обновить ответ, почему для второго оператора не требуется select (я плохо разбираюсь в sql). проверил данные, у обоих есть система координат, которую я дал - person Karthik Prasad; 28.01.2014
comment
Разве это не должно быть create table as select ... from; вместо create table (select ...from); - person a_horse_with_no_name; 29.01.2014
comment
@a_horse_with_no_name да, я смотрел на часть SELECT! - person Maheswaran Ravisankar; 29.01.2014

Ваше утверждение не будет делать то, что вы ожидаете, по нескольким причинам.

Насколько я понимаю, ваша исходная таблица KP_STAGE B содержит четыре столбца: LL_LAT, LL_LON, UR_LAT, UR_LON, которые предположительно являются широтой и долготой двух углов (нижний левый и верхний правый) некоторого прямоугольника. Из того, что вы говорите, эти координаты указаны в долготе/широте WGS84 (т.е. SRID 4326)

И вам нужна новая таблица, содержащая два геометрических объекта, один из которых содержит прямоугольник в долготе/широте (SRID 4326) и его эквивалент в SRID 3857 (сферическая проекция Меркатора, используемая Google и другими).

В вашем синтаксисе есть три проблемы:

1) Порядок ординат всегда следующий: X, затем Y, что для географических координат (широта/долгота) означает, что они должны быть указаны сначала в долготе, а затем в широте. Именно так все ГИС-системы хранят географические данные. Так что используйте это:

sdo_geometry(
  2003, 4326, NULL, 
  SDO_ELEM_INFO_ARRAY(1,1003,3),                                                          
  SDO_ORDINATE_ARRAY(
    LL_LON, LL_LAT, 
    UR_LON, UR_LAT
  ) 
) as KP_GCS,

2) Тип элемента для многоугольника должен быть одним из 1003 или 2003, а не только 3. Это делается для того, чтобы база данных могла различать «внешнее кольцо» (= правильный многоугольник) и «внутреннее кольцо» (= отверстие). ).

3) Самое главное: вы не можете построить геометрию в другой системе координат (в вашем случае 3857), просто установив другой SRID в пространственный объект. Вам нужно преобразовать его (спроецировать) в правильную систему координат, используя вызов SDO_CS.TRANSFORM(), например:

sdo_cs.transform (
  sdo_geometry(
    2003, 4326, NULL, 
    SDO_ELEM_INFO_ARRAY(1,1003,3),                                                          
    SDO_ORDINATE_ARRAY(
      LL_LON, LL_LAT, 
      UR_LON, UR_LAT
    ) 
  ),
  3857
) as KP_PCS

Обратите внимание, что это не вернет прямоугольник в простой нотации с двумя углами: хотя результат будет графически отображаться как прямоугольник, его внутренняя нотация — это полный многоугольник.

Таким образом, полный и правильный ответ будет таким:

create table KP_SPTL as
select  sdo_geometry (
          2003, 4326, NULL, 
          SDO_ELEM_INFO_ARRAY (1,1003,3),                                                          
          SDO_ORDINATE_ARRAY (
            LL_LON, LL_LAT, 
            UR_LON, UR_LAT
          ) 
        ) as KP_GCS,
        sdo_cs.transform (
          sdo_geometry(
            2003, 4326, NULL, 
            SDO_ELEM_INFO_ARRAY(1,1003,3),                                                          
            SDO_ORDINATE_ARRAY(
              LL_LON, LL_LAT, 
              UR_LON, UR_LAT
            ) 
          ),
          3857
        ) as KP_PCS,
        COMPANY, ADDRS, B_CDE
from KB_STAGE_B;

Или проще:

create table KP_SPTL as
with t as (
  select  COMPANY, ADDRS, B_CDE,
          sdo_geometry (
            2003, 4326, NULL, 
            SDO_ELEM_INFO_ARRAY (1,1003,3),                                                          
            SDO_ORDINATE_ARRAY (
              LL_LON, LL_LAT, 
              UR_LON, UR_LAT
            ) 
          ) as KP_GCS,
  from KB_STAGE_B
)
select KP_GCS, sdo_cs.transform(KP_GCS, 3857) KP_PCS, COMPANY, ADDRS, B_CDE
from t;
person Albert Godfrind    schedule 29.01.2014
comment
Большое спасибо @Albert Godfrind за исправление. Я получил свою ошибку. Я создал индекс с длинной/широтой, но создал goem с другим. Один вопрос у меня сейчас. Нужно ли использовать преобразование, где WKTEXT имеет PROJCS (проецируется) - person Karthik Prasad; 29.01.2014
comment
Да, вам всегда нужно преобразовываться между системами координат, то есть разными SRID, а также между разными системами проекции. База данных Oracle поставляется с каталогом, содержащим около 6000 определений систем координат, большинство из которых представляют собой различные проекционные системы. - person Albert Godfrind; 29.01.2014
comment
Да проходил через MDSYS.sdo_cs_srs чтобы узнать через разные сриды. Спасибо еще раз - person Karthik Prasad; 29.01.2014