2014-01-28 2 views
0

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

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); 

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

ответ

1

I не знаю Что такое оракул Пространственный вообще. но просто Lookin SQL, я думаю, ниже будет работать.!

mdsys.sdo_geometry() возвращает TYPE sdo_geometry, и его можно использовать в предложении 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); 
+0

Удивительного !! спасибо за быстрое и точное решение. Можете ли вы, пожалуйста, обновить ответ, почему для второго оператора не требуется выбор (я не разбираюсь в sql). проверенные данные имеют как систему координат, которую я дал –

+1

Я попытался рассказать об этом очень простыми словами.! Надеюсь, это поможет. –

+0

Хорошо, спасибо, многое получилось. –

3

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

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

И вы хотите создать новую таблицу, которая содержит два объекта геометрии: один из которых содержит прямоугольник в long/lat (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; 
+0

Большое спасибо @Albert Godfrind за исправление. Я ошибся. Я создал индекс с long/lat, но создал goem с другим. Один вопрос у меня сейчас. Нужно ли использовать преобразование, где WKTEXT имеет PROJCS (проецируется) –

+2

Да, вам всегда нужно преобразовывать между системами координат, то есть разными SRID, а также между разными проекционными системами. База данных Oracle поставляется с каталогом из примерно 6000 определений систем координат, большинство из которых являются разными проекционными системами. –

+0

Да прошло через MDSYS.sdo_cs_srs, чтобы узнать через разные srids. еще раз спасибо –

Смежные вопросы