首页 > 解决方案 > PostGIS:在半径内查找重复标签

问题描述

我在 PostGIS 中有具有价值和几何形状的数据。如果让我们说 <10 m 内有相同的值,我想从我的表中检测或删除该值。这是一个小例子:

create table points (id serial primary key, val integer, label2);

select addGeometryColumn('points', 'geom', 1, 'point', 2);

insert into points (id, val, label2, geom) values
  (1, 1, aaa, st_geomFromText('POINT(1 1)', 1)),
  (2, 1, bbb, st_geomFromText('POINT(1 2)', 1)),
  (3, 1, aaa, st_geomFromText('POINT(10 100)', 1)),
  (4, 2, ccc, st_geomFromText('POINT(10 101)', 1));

因为 data(id) 1 和 2 具有相同的值并且距离<10m,所以会有:

  id |val| source | geom 
-----+------------+------
   3 | 1 |  aaa   | xxx
   4 | 2 |  ccc   | xxx

你知道如何在 PostGIS 中查询吗?

标签: gispostgis

解决方案


首先,我会考虑什么是真正的要求?例如,考虑距离为 8 米的线上的点:A、B、C 和相等的值。您希望将其简化为 A 和 C,还是 B?两者都消除了10米内的重复,但结果不同。那么 A、B、C、D 呢?您希望结果是 A、C 还是 B、D 还是 A、D 或者可能是 B、C?定义特定标准并非易事,有时很难在 SQL 中实现。

或者也许你不在乎,只是想降低点密度?然后它更简单,只需snapped = ST_SnapToGrid使用适当的网格大小进行计算,并按相等的值分组snapped, value并从每组中选择任意点。请注意,这并不能保证没有接近点(具有相似坐标的点可以捕捉到不同的网格单元),但它确实减少了大多数重复,并且计算成本非常低。


推荐阅读