我使用WHERE ST_Intersects(ST_SetSRID(ST_MakePoint($1, $2)::geography, 4326), geog)
在geography
字段中找到一个点(示例查询中名为geog
)。
由于我无法理解*的原因,ST_SetSRID
有时会导致问题,将其从查询中删除会导致这些问题消失。我想从查询中删除ST_SetSRID
,但无法在任何地方找到解释SRID ST_Intersects
将使用的内容。
geog
的SRID为4326. ST_Intersects
只会使用它,或者假定没有坐标系,并且给我的结果与使用ST_SetSRID
时的结果不同?
* 如果您感到好奇,该问题与准备好的事务,nodejs和最小连接池有关。对于池中的1个最小连接,在4-6个查询之后,下一个查询将花费15-30秒(通常需要大约100毫秒)。对于2分钟的连接,在发生问题之前需要大约8-10个查询,持续5分钟,大约25个查询(等等)。我觉得我正在服用Crazy Pills。
答案 0 :(得分:4)
ST_SetSRID返回geometry
,而不是geography
。您通常不需要为geography
设置SRID,因为它假定默认值为4326,因此我建议不要使用它(除非您有不同的椭球或其他东西)。 (但如果您正在使用geometry
,则ST_SRID是必需的。)
此外,ST_Intersects隐式操作geometry
或geography
类型。根据您是否使用ST_SetSRID,它将选择:
ST_Intersects(geometry, geometry)
;或ST_Intersects(geography, geography)
您可以通过强制转换每个参数来明确选择其中一个运算符:
ST_Intersects(ST_SetSRID(ST_MakePoint($1, $2), 4326)::geography, geog::geography)
(注意我已将第一个::geography
移到外部ST_SetSRID,因此它设置了一个SRID,然后将其转换为geography
)。或等效地:
ST_Intersects(ST_MakePoint($1, $2)::geography, geog::geography)
至于两个相交空间运算符的实际性能,这取决于geometry
的{{1}}或geography
类型的索引。