PostGIS kullanarak çoklu tablolardan geometri mi alıyorsunuz?


13

Genel olarak PostGIS, PostgreSQL ve SQL için çok yeniyim.

PostGIS veritabanımda 44 tablo var ve her biri farklı vektör veri katmanını temsil eder. Her biri ayrı bir şekil dosyasından yüklendi ve her birinde o katmanın geometrisini tanımlayan bir sütun var.wkb_geometry

Bir katmanda belirli bir çokgen seçmek ve sonra TÜM geometri çokgenin sınırlama kutusuyla örtüşen katmanların bir alt kümesinden almak istiyorum. Çıkan sipariş hakkında seçici hissetmiyorum, ama her geometri grubunun geldiği tablolar tarafından organize olsaydı yararlı olurdu.

İşte benim SQL deyiminin bir örneği:

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
        );

bir hata döndürür:

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

Bunu yapmanın doğru yolu nedir?


1
SQL Primer'ımızı yararlı bulabilirsiniz. Öncelikle bazı gelişmiş SQL yapılarını da kapsamasına rağmen SQL acemi sorularına cevap vermek için tasarladık. postgis.us/chapter_appendix_c Bölüm 1, bir PostGIS uzamsal astarı olduğu için de yararlı olabilir.
LR1234567

+1. Bu ücretsiz bölümler. Bütün kitabı satın Benjamin, bu iyi bir yatırım. PostGIS ve çok daha fazlasını öğrenmek istiyorsanız.
Nicklas Avén

Yanıtlar:


8

her şeyden önce bu hata mesajını alırsınız, çünkü hangi tablodan geometri sütununu seçmek istediğinizi belirtmediniz (ve hepsinin aynı adı olduğundan, postgres karışıyor). Bu yüzden hata mesajını alıyorsunuz

sütun başvurusu "wkb_geometry" belirsiz

Birden çok tabloda aynı sütun adına sahipseniz, tablo adını her zaman sütun adının önüne ekleyin: örn. table1.wkb_geometry

Sorgunuz için: Sizi doğru anlarsam, farklı katmanlardaki nesneleri belirli bir katmandaki belirli bir nesneyle kesişen bulmak istersiniz.

Basit tutmak için başlangıçta bir kerede iki tabloya bakmaya başlayın:

Tablo1, belirli bir nesneye sahip tablodur, tablo2 diğer nesnelerle tablodur

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

Şimdi, diğer tablolardan ek nesneler eklemek istiyorsanız, Sasa'nın daha önce de belirtildiği gibi, UNION ALL'a ihtiyacınız var. Sütun adlarının aynı olması gerekmez, ancak sütun ve veri türü sayısı!

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...

Benzersiz bir kimlik olmadığından sorguyu bir görüntüleyicide açarak sorun yaşayabilirsiniz. Bunu çözmenin basit bir yolu sonucu id sütununa sahip bir tablo olarak kaydetmek.

iyi eğlenceler


6

Önümde bir SQL istemcisi yok, bu yüzden bu% 100 doğru olmayabilir, ancak satır boyunca bir şey isteyeceksiniz:

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

ve bunun gibi. Sorun, sql sorgusu SELECT ST_AsEWKT (wkb_geometry), böylece belirsiz başvuru belirttiğinizde hangi tablo (tablo2 / 3/4/5) başvurmak bilmiyor olmasıdır. Sipariş edilmelerini istiyorsanız sonuçlara SİPARİŞ BY ekleyebilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.