如何在oracle空间中为create table编写多个select语句?

时间:2014-01-28 15:13:38

标签: sql oracle oracle-spatial

我正在尝试根据另一个具有lat lon的表创建geom表。我正在尝试使用Spherical Mercator(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"

但是,如果我删除第二个select语句它工作正常,我的意思是如果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语句。但在这种情况下如何使用?

2 个答案:

答案 0 :(得分:3)

由于多种原因,您的陈述不符合您的期望。

据我所知,您的源表KP_STAGE B包含四列:LL_LAT,LL_LON,UR_LAT,UR_LON,大概是某个矩形的两个角(左下角和右上角)的纬度和经度。根据你的说法,这些坐标是长/纬度WGS84(即SRID 4326)

你想要一个包含两个几何对象的新表,一个包含long / lat中的矩形(SRID 4326),以及它在SRID 3857中的等价物(Google和其他人使用的球形墨卡托投影)。

您的语法有三个问题:

1)纵坐标的顺序始终是X然后是Y,对于地理坐标(纬度/经度),它们表示必须先以经度指定,然后指定纬度。这是所有GIS系统存储地理数据的方式。所以使用这个:

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)最重要的是:你不能通过在空间对象中设置不同的SRID来在不同的坐标系统(在你的情况下为3857)中构建几何体。你需要使用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;

答案 1 :(得分:1)

根本不知道什么是oracle Spatial。但只是通过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);