我正在使用PostGIS计算多边形的最近邻居。我要计算的是从每个多边形到最近的多边形的最小距离。
到目前为止,我在这里得到了Mike Toews的答案的帮助(我引用了一个小的更改):
SELECT
a.hgt AS a_hgt,
b.hgt AS b_hgt,
ST_Distance(a.the_geom, b.the_geom) AS distance_between_a_and_b
FROM
public."TestArea" AS a, public."TestArea" AS b
WHERE
a.hgt != b.hgt AND ST_Distance(a.the_geom, b.the_geom) < 400
然后,我计算出最小值:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
但是,我的挑战是为大量的多边形(1,000,000)计算此值。当上述计算将每个多边形与其他每个多边形进行比较时,我想知道如何改进计算,从而不必执行10 ^ 12的计算。
我曾经想过要缓冲每个多边形,然后计算该多边形的缓冲区中所有值的最近邻居,并记录下最小值。我不确定这是最好的方法,还是不确定我应该使用的PostGIS功能。
编辑:使用尼克拉斯的建议之一,我正在尝试ST_Dwithin()
:
CREATE TABLE mytable_withinRange AS SELECT
a.hgt AS a_hgt,
b.hgt AS b_hgt,
ST_DWithin(a.the_geom, b.the_geom, 400)
FROM
public."lon_TestArea" AS a, public."lon_TestArea" AS b
这将返回每个多边形ID的表格,以及该表格是否在一定距离内。是否可以IF/ELSE
使用SQL 构造类型语句?(我阅读了有关使用CASE
条件的信息)还是应该尝试将生成的表连接到原始表,然后使用ST_Distance重新运行查询?