ST_Covers:地理位置实现不起作用,几何实现耗时太长

时间:2013-01-18 14:49:17

标签: postgresql postgis

我有一个查询:(此查询使用ST_Covers函数的地理实现)

SELECT ST_Covers(ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)))'),ST_GeographyFromText('POINT(20 30)'));

当我运行此查询时,应返回true但返回false。我不知道PostGIS(或使用此查询)有什么问题

当我使用几何更改地理位置时,重新排列查询,如下所示:

SELECT ST_Covers(ST_ASTEXT(ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)))')),text('POINT(20 30)'));

它可以正常工作,返回true:

我可以使用以下查询作为内容,但问题是当数据库太大时需要花费太多时间

请有人告诉我

如何使查询1正常工作(按预期,返回true)或

如何使查询2使用大表快速工作

(请不要建议我删除* ST_GeoGraphyFromText('(MUL-POLYGON)(((179 -89,179 89,-179 89,-179 -89,179 -89)*,因为它只代表将被来自的数据替换的地理数据表格栏目

查询1不起作用的其他值是(5 5)(10 10)( - 10 -10)以及更多

1 个答案:

答案 0 :(得分:1)

第一个查询失败,因为您使用的geography类型的内容大于180°。如果它更真实,例如'MULTIPOLYGON(((100 0,100 50,0 50,0 0,100 0)))',它将返回TRUE。

没有直接的方法可以找到MultiPolygon地理类型的外环的最大直径,但您可以尝试使用以下内容搜索这些特定情况:

SELECT ST_XMax(geog::geometry) - ST_XMin(geog::geometry) AS width,
       ST_YMax(geog::geometry) - ST_YMin(geog::geometry) AS height
FROM polygons

检查那些> 180,并且看看每个部件是否也是> 180.如果是这样,这些应被视为无效的地理位置。


第二个查询返回TRUE的唯一原因是因为ST_AsText转换为WKT,然后将其作为geometry类型重新解释回WKB(并隐式调用ST_Covers(geometry, geometry),而不是{{1 }})。此查询很慢,因为它从WKB转换为WKT到WKB,转换之间可能会丢失精度。更快的版本是使用ST_Covers(geography, geography)将地理列投射到几何体,例如:

::geometry

几何类型对ST_Covers使用简单的“扁平地球”笛卡尔逻辑,这就是为什么你看到TRUE的原因。地理类型使用不同的“圆形地球”逻辑,它使用更复杂的球形逻辑,但如果你有一个方便的地球很容易看到。