У меня есть список, содержащий более 100 000 точек в формате lat / long, который я импортировал в qgis.
Теперь я пытаюсь сгруппировать все эти точки в группы блоков, и я имею в виду, что хочу разделить карту на ограничивающие блоки.
Мои требования следующие:
- ни одна группа в штучной упаковке не должна иметь менее 100 и не более 200 баллов
- ни одна точка не должна находиться в более чем одной группе
- все точки должны быть основаны на ближайшем соседе
Как я могу добиться этого через QGIS?
Я предполагаю, что можно передать некоторый пользовательский код запроса и сохранить результаты или поля, созданные как шейп-файл, правильно? Может кто-нибудь объяснить, как это можно сделать и как будет выглядеть код?
Как уже упоминалось, моя цель состоит в том, чтобы отображать в виде слоя шейп-файла группу квадратных блоков, в которых внутри каждого блока есть не менее 100 свойств и не более 200.
Ответы:
Я могу помочь вам в этом, предположив, что вы выяснили, как запросить (а) самую восточную половину набора точек и (б) самую северную половину набора точек. Из них вы, конечно, можете легко получить (с) самую западную половину или (d) самую южную половину. (Я не знаю QGIS, но один из способов сделать (а) в общем случае - запросить медианную координату x и затем выбрать все точки, координаты x которых превышают это. Решения для (b) - (d) аналогичны .)
Используя эту возможность, решение получается с простой рекурсией. Чтобы описать это, давайте предположим, что существует процедура
Half
, реализующая предыдущие операции, которая принимает два аргумента: первый - это набор точек, а второй - код, равный тому,true
когда желательно разделение восток-запад, и равный вfalse
противном случае. Он возвращает два подмножества своего ввода, которые разбивают его по запросу.В этом псевдокоде R и S разбиение P; Box (R,! I, n) является разбиением R в ортогональном направлении , Box (S,! I, n) является разбиением S в ортогональном направлении, «+» означает формирование теоретико-множественного объединения, и {} обозначает набор. (При изменении направления разделения создаются поля, а не полосы.) Параметр n указывает минимальный размер группы в разделе; максимальный размер 2 н .
Здесь, в качестве иллюстрации, приведен набор P из 12 891 случайных точек, разделенных
Box(P,true,100)
на группы размером от 100 до 200. Алгоритм создает 128 блоков, из которых 37 имеют 100 баллов, а 91 - 101 балл.источник