Selezione raggruppata dei vicini più vicini in QGIS


14

Ho un elenco contenente oltre 100.000 punti in formato lat / long che ho importato in qgis.

Ora, quello che sto cercando di fare qui è raggruppare tutti questi punti in gruppi di riquadri e con ciò intendo essenzialmente che voglio dividere la mappa in riquadri di delimitazione.

I miei requisiti sono i seguenti:

  • nessun gruppo in box dovrebbe avere MENO DI 100 e NON PIÙ DI 200 punti
  • nessun punto dovrebbe trovarsi in più di un gruppo
  • tutti i punti dovrebbero essere basati sul vicino più vicino

Come ho potuto raggiungere questo obiettivo tramite qgis?

Presumo che si possa passare un codice di query personalizzato e salvare i risultati o le caselle create come shapefile corrette? Qualcuno potrebbe spiegare come questo potrebbe essere fatto e come sarebbe il codice?

Come accennato, il mio obiettivo è quello di avere un gruppo di scatole quadrate visualizzate come uno strato shapefile in cui all'interno di ciascuna scatola non ci sono meno di 100 proprietà e non più di 200.


6
Per tutti coloro che hanno contrassegnato questa domanda come "preferita": perché non votarla troppo? Si potrebbe pensare che la tua domanda preferita dovrebbe essere una buona domanda.
underdark

1
Perché hai bisogno del pugilato? Se crei scatole basate sul conteggio, avranno comunque dimensioni diverse, quindi la piastrellatura è fuori discussione. È probabilmente più facile raggruppare in poligoni (cioè scafo convesso).
diciu,

@diciu grazie per la risposta. Sì, immagino che uno scafo convesso andrebbe bene in quanto potrei trasformarli in scatole in seguito. Quale codice dovrei usare per farlo usando l'approccio dello scafo convesso?
NetConstructor.com il

2
Se usi scafi convessi, le tue scatole di delimitazione (che racchiudono gli scafi) si sovrapporranno e il tuo requisito per un punto di essere in un singolo BBOX non è più soddisfatto. Gli scafi convessi non funzionano come un passo intermedio verso BBOX ma piuttosto come un sostituto. E anche allora, la creazione di una soluzione generica sarà piuttosto coinvolta.
diciu,

Risposte:


13

Posso farti parte del percorso supponendo che tu abbia capito come richiedere (a) la metà più orientale di una serie di punti e (b) la metà più settentrionale di una serie di punti. Da questi puoi ovviamente ottenere (c) la metà più occidentale o (d) la metà più meridionale. (Non conosco QGIS, ma un modo per fare (a) in generale è richiedere la coordinata x mediana e quindi recuperare tutti i punti le cui coordinate x lo superano. Le soluzioni per (b) - (d) sono simili .)

Utilizzando questa capacità, la soluzione si ottiene con una facile ricorsione. Per descriverlo, supponiamo che esista una procedura Half, implementando le operazioni precedenti, che accetta due argomenti: il primo è un insieme di punti e il secondo è un codice uguale a truequando si desidera il partizionamento est-ovest e uguale al falsecontrario. Restituisce due sottoinsiemi del suo input che lo partizionano come richiesto.

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

In questo pseudocodice, la partizione R e S P; Box (R,! I, n) è una partizione di R nella direzione ortogonale , Box (S,! I, n) è una partizione di S nella direzione ortogonale, "+" significa formare l'unione set-teorica, e {} designa un set. (Alternando la direzione di divisione si creano caselle anziché strisce.) Il parametro n specifica la dimensione minima di un gruppo nella partizione; la dimensione massima è di 2 n .

Esempio

Qui, a titolo di esempio, è un insieme P di 12.891 punti casuali suddivisi Box(P,true,100)in gruppi di dimensioni comprese tra 100 e 200. L'algoritmo crea 128 scatole di cui 37 con 100 punti e 91 con 101 punti.


2
L'algoritmo è efficiente. Funzionando su un singolo core, ha elaborato dieci volte più punti (128.910) in 18 secondi. Ridimensiona come O (n log (n) log (n)) per n punti. (Potrebbe essere migliorato per rimuovere uno di quei fattori di log (n), ma è improbabile che lo sforzo
valga la

1
@W hai usato un ordinamento lessicografico per facilitare il partizionamento delle coordinate del punto?

2
@whuber this is awesome
dassouki

1
@Dan Un ordinamento lessicale sarebbe d'aiuto, ma non è necessario. Si noti che una mediana di n valori può essere trovata nel tempo O (n) (non nel tempo O (n log (n))), quindi la suddivisione dei punti in metà est-ovest o metà nord-sud è asintoticamente una O (n ) calcolo.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.