我有一个查询:(此查询使用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)以及更多
答案 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的原因。地理类型使用不同的“圆形地球”逻辑,它使用更复杂的球形逻辑,但如果你有一个方便的地球很容易看到。