我有两个表,一个在SRID4326中(包含MULTIPOLYGON
),另一个在SRID32188中(包含multilestring
)。
我试图从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的建议,并将其调整为针对点测试ST_DWITHIN,而不是表2的多行字符串,它工作正常。
SELECT * FROM table1 t1
WHERE EXISTS (
SELECT FROM table2 t2
WHERE ST_DWithin(t1.geom, ST_MakePoint(-73.63,45.52)::geography,100)
);
然而,我使用只包含一条直线的表2进行了测试(尽管仍然是多行线几何体),客户端崩溃。是否与此相关:https://gis.stackexchange.com/questions/31923/why-is-the-database-connection-lost-on-every-query ?
你的客户可能在计时。
实际上,您正在两个表之间进行交叉连接,因此如果t1
中的多边形位于t2
中10个要素的100m范围内,则将返回10次。您可能希望从t1
中获得不同的多边形。要执行此操作,请仅在t1
上选择,并在t2
上应用的条件满足时保留该行。
第二个问题——不幸的是,这不会引发任何错误——是使用3857计算距离是错误的。在魁北克省,长度畸变约为40%,这是巨大的。对于这两种几何形状,您必须使用合适的局部投影(如MTM或UTM),或者,如果不可能,则转换为地理来进行距离计算。
由于您确实将两个几何转换为新的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可以更快地处理我的查询,但每次修改它的尝试都会使它变慢! 我有两张桌子: < li >统计数据(id,field1,[...],field10) < li >几何图形(id,geom) 我在以下位置创建了索引: < li>statistics.id < li>geometry.id < Li > geometry(ST _ x(ST _ centroid(ST _ tra
以下操作正在控制台中尝试,用于启用postgis的铁路4.2应用程序。 lat和lon定义为十进制值。这转化为以下查询 与错误: 我认为我需要为这些值声明数据类型(几何或地理),但不确定如何声明。我还想知道ST_DWithin函数是否可以处理3857数据类型,即使文档中没有说明。 注意@target对象还具有一个属性,该属性在postgresql中定义为一个带有:srid的空间值= 最新消息 返回
问题内容: 这是我的代码: 如何查询以某些字符开头的服务器?例如,我如何为仅以“ AA”开头的服务器服务? 我正在使用Oracle SQL btw。 问题答案: 你可以这样做
我正在用Java编写一个DL查询解析器。当我将类名作为输入时,代码给出了正确的输出,但当我给出“hasColor value Red”或“hasSugar value Dry”这样的查询时,代码什么也不返回。我正在使用OWLAPI。
问题内容: 这是API生成的查询-不确定出什么问题了。 给我错误 SQL命令未正确结束 表中存在所有列,我相信联接和在oracle上运行此命令有问题。 编辑 还有一件事是, 当我从某些API获取时,查询的一部分已修复。 问题答案: Oracle不支持以下语法: 这是标准的SQL,可以在任何数据库中使用。 您的查询还有其他问题。。。子查询不在括号中,没有第一张表。 编辑: 您可以使用该子查询编写此查
我正在建立一个图书馆数据库。我想编写一个查询,返回每个类别的前5本书,这意味着它必须返回每个类别借阅次数最多的5本书以及借阅次数。 查询涉及以下表: Book(ISBN, title, pubYork, numpage, pubName) borrows(memberID, ISBN, Copnr,date_of_borrowing,date_of_return) belongs_to(ISBN,