Найближчий сукупний вибір у QGIS


14

У мене є список, що містить понад 100 000 балів у форматі lat / long, який я імпортував у qgis.

Зараз я намагаюся тут згрупувати всі ці пункти в групи вікон і, по суті, я маю на увазі, що я хочу розділити карту на обмежувальні поля.

Мої вимоги такі:

  • жодна група з коробкою не повинна мати менше 100 та НЕ БІЛЬШЕ 200 балів
  • жодна точка не повинна розташовуватися в більш ніж одній групі
  • всі пункти повинні базуватися на їх найближчому сусіді

Як я міг досягти цього за допомогою qgis?

Я припускаю, що можна передати якийсь спеціальний код запиту і зберегти результати чи поля, створені як правильні форми форми? Невже хтось може пояснити, як це можна зробити і як виглядатиме код?

Як уже згадувалося, моя мета полягає в тому, щоб купка квадратних коробок відображалася у вигляді шару форми, де в кожному полі міститься не менше 100 властивостей і не більше 200.


6
Всім, хто відзначив це питання "улюбленим": Чому б і його не прийняти? Можна було б подумати, що ваше улюблене питання має бути хорошим питанням.
underdark

1
Для чого потрібен бокс? Якщо ви створюєте коробки на основі підрахунку, то все одно вони будуть різного розміру, тому плитка не підлягає. Напевно, простіше згрупуватися в багатокутники (тобто опуклий корпус).
diciu

@diciu дякую за відповідь. Так, я думаю, опуклий корпус був би добре, оскільки згодом я міг би перетворити їх у коробки. Який код я повинен використовувати, щоб зробити це, використовуючи підпуклий корпус?
NetConstructor.com

2
Якщо ви користуєтесь опуклими корпусами, ваші обмежувальні коробки (огороджуючі корпуси) будуть перекриватися, і ваша вимога щодо точки, що знаходиться в одному BBOX, вже не буде задоволена. Опуклі корпуси працюють не як проміжний крок до BBOX, а як заміна. І навіть тоді створення загального рішення буде досить задіяно.
diciu

Відповіді:


13

Я можу отримати вас частиною шляху, якщо припустити, що ви зрозуміли, як запитати (а) найбільш східну половину набору точок і (б) найпівнічнішу половину набору точок. З них можна, звичайно, легко отримати (c) найзахіднішу половину або (d) найпівденнішу половину. (Я не знаю QGIS, але один із способів (a) взагалі - це запитувати медіану x-координати, а потім отримати всі точки, x-координати яких перевищують це. Рішення для (b) - (d) подібні .)

Використовуючи цю можливість, розчин виходить з легкою рекурсією. Щоб описати це, припустимо, що існує процедура Half, що реалізує попередні операції, яка бере два аргументи: перший - це набір точок, а другий - код, рівний, trueколи бажано розділити схід-захід і дорівнює falseіншому. Він повертає два підмножини свого входу, який розділяє його за запитом.

Procedure Box(P: set of points, i: boolean, n: integer)
Begin
    If (Count(P) > 2*n) then
        {R,S} = Half(P,i)
        Q = Box(R,!i,n) + Box(S,!i,n)
    Else
        Q = {P}
    Endif
    Return Q
End

У цьому псевдокоді R і S розділ P; Коробка (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 бал.


2
Алгоритм ефективний. Працюючи на одному ядрі, він обробив десять разів більше очок (128 910) за 18 секунд. Він масштабується як O (n log (n) log (n)) для n точок. (Можна було б покращити видалення одного з цих факторів журналу (n), але зусилля навряд чи будуть варті.)
whuber

1
@W Ви використовували лексикографічний сортування для полегшення розподілу точкових координат?

2
@whuber це дивовижно
dassouki

1
@Dan Лексичний сорт допоможе, але не є необхідним. Зауважимо, що медіану n значень можна знайти за час O (n) (не час O (n log (n))), тому розподіл точок на половини схід-захід або половини північ-південь асимптотично a O (n ) обчислення.
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.