PostGIS: поиск дубликата ярлыка в радиусе - PullRequest
0 голосов
/ 30 марта 2020

У меня есть данные в PostGIS, которые имеют значение и геометрию. Если есть то же значение в пределах, скажем, <10 м, я хочу обнаружить или удалить это значение из моей таблицы. Вот небольшой пример: </p>

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));

, поскольку данные (id) 1 и 2 имеют одинаковое значение и расстояние <10 м, поэтому просто будет: </p>

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

знаете, как запросить это в PostGIS?

1 Ответ

0 голосов
/ 01 апреля 2020

Во-первых, я бы рассмотрел, каковы реальные требования? Например, рассмотрим точки на линии с расстоянием 8 метров: A, B, C и равное значение. Вы хотите, чтобы это было уменьшено до A и C, или B? Оба устраняют дубликаты в пределах 10 метров, но результат отличается. А как насчет A, B, C, D - хотите ли вы, чтобы результат был A, C, или B, D, или A, D, или, может быть, B, C? Определение определенных c критериев не тривиально, а иногда трудно реализовать в SQL.

Или, может быть, вам все равно, и вы просто хотите уменьшить плотность точек? Тогда это проще, просто вычислите snapped = ST_SnapToGrid с соответствующим размером сетки и сгруппируйте равными значениями snapped, value и выберите произвольную точку из каждой группы. Обратите внимание, что это не гарантирует отсутствие близких точек (точки с одинаковыми координатами могут привязываться к разным ячейкам сетки), но уменьшает количество дубликатов и вычислительно очень дешево.

...