0

我正在尝试基于另一个具有 lat lon 的表创建 geom 表。我正在尝试在表格中使用球形墨卡托(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);

第二条select语句如何使用,如果是正常查询我们可以使用select from语句。但是在这种情况下如何使用?

4

2 回答 2

3

由于几个原因,您的陈述不会达到您的预期。

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

并且您需要一个包含两个几何对象的新表,一个包含长/纬度 (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;
于 2014-01-29T09:41:18.480 回答
1

根本不知道什么是 oracle Spatial。但只是通过 Lookin SQL,我认为,下面会工作。!

mdsys.sdo_geometry()返回 a TYPE sdo_geometry,并且可以在 A SELECT 子句中多次使用。我们不需要每次都伴随一个 SELECT。

它就像SELECT B.COMPANY, B.ADDRS,B_CDE..你不需要SELECT总是前缀a!

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);
于 2014-01-28T15:16:04.850 回答