使用PostGIS从多个表中获取几何图形?


13

一般来说,我对PostGIS,PostgreSQL和SQL还是很陌生。

我的PostGIS数据库中有44个表格,每个表格代表不同的向量数据层。每一个都是从单独的shapefile加载的,每个都有一个描述该层的几何形状的列,称为wkb_geometry

我想在一层上选择一个特定的多边形,然后从与该多边形的边界框重叠的一层子集中检索所有几何。我对发出的顺序并不感到挑剔,但是如果按每组几何体来自的表进行组织,将很有帮助。

这是我的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等更多信息。
NicklasAvén2011年

Answers:


8

首先,您会收到此错误消息,因为您没有指定要从哪个表中选择几何列(并且由于它们都具有相同的名称,因此postgres感到困惑)。这就是为什么您收到错误消息

列引用“ wkb_geometry”不明确

如果在多个表中具有相同的列名,请始终在该列名之前添加表名:table1.wkb_geometry

对于您的查询:如果我理解正确,那么您希望在不同的层中找到与一个特定层中的特定对象相交的对象。

为了简单起见,一开始就一次查看两个表:

Table1是具有特定对象的表,table2是具有其他对象的表

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

现在,如果要从其他表添加其他对象,则需要UNION ALL,如Sasa所述。列名不必相同,但是列数和数据类型都可以!

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

等等。您的问题是,当您指定SELECT ST_AsEWKT(wkb_geometry)时,sql查询不知道您要引用的表(table2 / 3/4/5),因此引用不明确。您也可以在结果中添加ORDER BY

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.