PostGISを使用して複数のテーブルからジオメトリを取得しますか?


13

私は、PostGIS、PostgreSQL、SQL全般について非常に新しいです。

PostGISデータベースには44個のテーブルがあり、各テーブルはベクターデータの異なるレイヤーを表しています。それぞれが個別のシェープファイルからロードされ、それぞれには、そのレイヤーのジオメトリを記述する列があります。wkb_geometry

1つのレイヤーで特定のポリゴンを選択し、そのポリゴンの境界ボックスとオーバーラップするレイヤーのサブセットからすべてのジオメトリを取得したい。私は、出てくる順序について気難しいとは感じていませんが、各グループのジオメトリが由来するテーブルによって編成されていると便利です。

これが私のSQLステートメントのサンプルです。

SELECT
    ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
    table2, table3, table4, table5
WHERE 
    wkb_geometry &&
        (
        SELECT
            wkb_geometry
        FROM
            table1
        WHERE
            ogc_fid = 25
        );

エラーを返します:

column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */

これを行う正しい方法は何ですか?


1
SQL Primerが役立つかもしれません。主にSQLの初心者の質問に答えるように設計しましたが、いくつかの高度なSQL構造もカバーしています。postgis.us/chapter_appendix_c第1章もPostGIS空間入門書なので、役に立つかもしれません。
LR1234567

+1。それは無料の章です。本全体を購入してください、ベンジャミン、それは価値のある投資です。PostGISなどについてもっと学びたい場合。
ニックラスアベン

回答:


8

まず、どの列からジオメトリ列を選択するかを指定しなかったため、このエラーメッセージが表示されます(すべて同じ名前であるため、postgresは混乱しています)。それがエラーメッセージを受け取る理由です

列参照「wkb_geometry」があいまいです

複数のテーブルに同じ列名がある場合は、常に列名の前にテーブル名を追加します。table1.wkb_geometry

あなたのクエリについて:私があなたを正しく理解しているなら、あなたは1つの特定の層の特定のオブジェクトと交差する異なる層のオブジェクトを見つけたいです。

シンプルに保つために、最初に一度に2つのテーブルを調べ始めます。

Table1は特定のオブジェクトを持つテーブル、table2は他のオブジェクトを持つテーブル

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

さて、Sasaが既に述べたように、他のテーブルからオブジェクトを追加する場合は、UNION ALLが必要です。列名は同じである必要はありませんが、列の数とデータ型は同じです!

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

SELECT
ST_AsEWKT(table3.wkb_geometry)
FROM
table1, table3
WHERE
(table3.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

etc...

一意のIDがないため、ビューアでクエリを開くと問題が発生する場合があります。これを解決する簡単な方法は、id列を持つテーブルとして結果を保存することです。

楽しんで


6

私は目の前にSQLクライアントを持っていないので、これは100%正確ではないかもしれませんが、次のようなものが欲しいでしょう:

SELECT ST_AsEWKT(wkb_geometry) FROM table2 WHERE ...
UNION ALL
SELECT ST_AsEWKT(wkb_geometry) FROM table3 WHERE ...

等々。問題は、SQLクエリが、SELECT ST_AsEWKT(wkb_geometry)を指定するときに参照しているテーブル(table2 / 3/4/5)を認識しないため、あいまいな参照になることです。ORDER BYを結果に追加することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.