在PostGIS中投射地理类型

时间:2011-06-22 21:22:18

标签: database postgresql postgis

我定义了下表,它使用PostGIS地理。

CREATE TABLE test_geog (
    id SERIAL PRIMARY KEY,
    boundary GEOGRAPHY(Polygon)
);

我在表格中添加了以下测试多边形:

INSERT INTO test_geog VALUES (ST_GeographyFromText('SRID=4326;POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'));

我正在尝试确定一个点是否位于此表中的任何多边形内。我有这个问题:

SELECT ST_ContainsProperly(ST_GeographyFromText('Point(2 2)'), area)
FROM (SELECT boundary FROM test_geog) AS area;

这会产生以下错误:

ERROR:  function st_containsproperly(geography, record) does not exist
LINE 1: SELECT ST_ContainsProperly(ST_GeographyFromText('Point(2 2)'...
            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

如何将此“记录”转换为POLYGON?我很困惑,因为看起来列已经被声明只保留POLYGON类型,但由于某种原因,这不是我从数据库中提取出来的。

我试图将记录转换为POLYGON,如下所示:

SELECT ST_ContainsProperly(ST_GeographyFromText('Point(2 2)'), CAST (boundary AS POLYGON))
FROM (SELECT boundary FROM source_imagery) AS nitf_area;

但是这给了我这个错误:

ERROR:  cannot cast type record to polygon
LINE 1: ...tainsProperly(ST_GeographyFromText('Point(2 2)'), CAST (boun...

我在这里不理解什么?

1 个答案:

答案 0 :(得分:1)

我在GIS论坛上回答了我的问题。我犯了一个愚蠢的错误,认为ST_ContainsProperly可以用于地理,当它实际上只支持几何时。我也不需要我试图做的多余的子查询。

所以这是我的解决方案。我转而使用ST_Covers,这可以做我想要的并支持地理。这避免了转换为几何。这是有效的代码:

SELECT ST_Covers(
    boundary, 
    ST_GeographyFromText('Point(2 2)')
) 
FROM source_imagery