我正在尝试根据另一个具有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语句。但在这种情况下如何使用?
答案 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);