0

lat lon を持つ別のテーブルに基づいて geom テーブルを作成しようとしています。テーブルに球状メルカトル (SRID 4326、地理座標系) と投影座標系 (SRID 3857) を持つ 2 つの列 1 を作成しようとしています。以下は私の質問です。

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"

ただし、2 番目の 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);

2 番目の select ステートメントの使用方法。通常のクエリの場合、select from ステートメントを使用できます。しかし、この場合の使い方は?

4

2 に答える 2

3

あなたのステートメントは、いくつかの理由で期待どおりに機能しません。

私が理解しているように、ソース テーブル KP_STAGE B には 4 つの列が含まれています: LL_LAT、LL_LON、UR_LAT、UR_LON は、おそらく長方形の 2 つの角 (左下と右上) の緯度と経度です。あなたの言うことから、それらの座標は経度/緯度 WGS84 (つまり、SRID 4326) です。

そして、2 つのジオメトリ オブジェクトを含む新しいテーブルが必要です。1 つは、経度/緯度 (SRID 4326) の長方形を含み、SRID 3857 (Google などで使用される球状メルカトル図法) の同等のものです。

構文には 3 つの問題があります。

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) 多角形の要素タイプは、3 だけでなく、1003 または 2003 のいずれかでなければなりません。これは、データベースが「外輪」(= 正多角形) と「内輪」(= 穴) を区別できるようにするためです。 )。

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

これは、単純な 2 つの角の表記で長方形を返さないことに注意してください。結果はグラフィカルに長方形としてレンダリングされますが、その内部表記は完全な多角形の表記です。

したがって、完全で正しい答えは次のようになります。

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 に答える