将ST_Intersects与ST_MakePoint一起使用,不使用SET_SRID

时间:2017-01-25 22:59:53

标签: postgresql postgis

我使用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。

1 个答案:

答案 0 :(得分:4)

ST_SetSRID返回geometry,而不是geography。您通常不需要为geography设置SRID,因为它假定默认值为4326,因此我建议不要使用它(除非您有不同的椭球或其他东西)。 (但如果您正在使用geometry,则ST_SRID是必需的。)

此外,ST_Intersects隐式操作geometrygeography类型。根据您是否使用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类型的索引。