繁体   English   中英

将 ST_Intersects 与没有 SET_SRID 的 ST_MakePoint 一起使用

[英]Using ST_Intersects with ST_MakePoint with no SET_SRID

我正在使用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 次查询(以此类推)。 我觉得我正在服用疯狂药丸。

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)

至于两个相交空间运算符的实际性能,这取决于您是否有geog geometrygeography类型的索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM