【问题标题】:Postgis disconnecting during some queriesPostgis 在某些查询期间断开连接
【发布时间】:2020-05-31 08:14:38
【问题描述】:

我有两张表,一张在 SRID 4326(包含MULTIPOLYGON),另一张在 SRID 32188(包含MULTILINESTRING)。

我正在尝试从t1 中选择与t2 中的任何线相距100 米以内的所有多边形。

这是我正在做的查询:

SELECT * FROM table1 AS t1, table2 AS t2 
WHERE ST_DWithin(
        ST_Transform(t1.geom, 3857),
        ST_Transform(t2.geom, 3857),
        100);

不幸的是,它不起作用,并且 pgAdmin4 没有给我一个有用的错误。相反,它会在我运行查询后立即与数据库断开连接(因此这不是超时情况):

我也尝试过使用同一个 SRID 中的两个表,但我仍然遇到问题...我在这里做错了什么?

编辑:为了尝试缩小问题的范围,我接受了@JGH 的建议,并对其进行了调整,以针对一个点而不是 table2 的多线串测试 ST_DWITHIN,它工作正常。

SELECT * FROM table1 t1
WHERE EXISTS (
    SELECT FROM table2 t2
    WHERE ST_DWithin(t1.geom, ST_MakePoint(-73.63,45.52)::geography,100)
);

但是,我使用仅包含一条直线的 table2 进行了测试(尽管仍然是多线串几何),但客户端崩溃了。会不会和这个有关:https://gis.stackexchange.com/questions/31923/why-is-the-database-connection-lost-on-every-query

【问题讨论】:

  • 你应该添加 postgres 标签。

标签: postgresql postgis


【解决方案1】:

您的客户端可能正在超时。

事实上,您正在两个表之间进行交叉连接,因此如果来自t1 的多边形在t2 中的 10 个要素的 100m 范围内,它将被返回 10 次。您可能想要来自t1 的不同多边形。为此,您将仅选择 t1 并在满足 t2 应用的条件时保留该行。

第二个问题 - 不幸的是不会引发任何错误 - 是使用 3857 计算距离是错误的。在魁北克,长度失真约为 40%,这是巨大的。您必须对两种几何图形都使用合适的局部投影(如 MTM 或 UTM),或者,如果不可能,则投射到 geography 以进行距离计算。

而且由于您确实将两个几何图形都转换为新的 CRS,因此无法单独使用几何图形的空间索引,并且距离计算将花费很长时间,从而导致您的客户端超时。

SELECT *
FROM   table1 t1
WHERE  EXISTS (
   SELECT FROM table2 t2
   WHERE  ST_DWithin(t1.geom::geography, ST_Transform(t2.geom, 4326)::geography, 100)
   );

不要忘记在地理(和/或转换后的几何)上创建空间索引

CREATE INDEX t1_geog ON t1 USING gist(geography(t1.geom);

CREATE INDEX t1_32188 ON t1 USING gist(st_transform(geom,32188));

【讨论】:

  • 它仍然断开连接,但非常感谢您的建议!我应该提到的是,一旦我运行查询,客户端就会断开连接,所以这不是超时情况:(我会更新我的问题以明确这一点。
  • 您无法通过不再存在的连接向客户端发送详细的错误消息,因此您必须查看 PostgreSQL 服务器的日志文件以了解它对此事的说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多