Selección agrupada de vecinos más cercanos en QGIS

14

Tengo una lista que contiene más de 100,000 puntos en formato lat / long que he importado a qgis.

Ahora, lo que estoy tratando de hacer aquí es agrupar todos estos puntos en grupos de cuadros y con eso quiero decir que quiero dividir el mapa en cuadros delimitadores.

Mis requisitos son los siguientes:

  • ningún grupo en caja debe tener MENOS DE 100 y NO MÁS DE 200 puntos
  • ningún punto debe ubicarse en más de un grupo
  • todos los puntos deben basarse en su vecino más cercano

¿Cómo podría lograr esto a través de qgis?

Supongo que se puede pasar un código de consulta personalizado y guardar los resultados o los cuadros creados como un archivo de forma ¿correcto? ¿Podría alguien explicar cómo se podría hacer esto y cómo se vería el código?

Como se mencionó, mi objetivo es mostrar un montón de cuadros cuadrados como una capa de archivo de forma donde dentro de cada cuadro hay no menos de 100 propiedades y no más de 200.

NetConstructor.com
fuente
66
Para todos los que marcaron esta pregunta como "favorita": ¿por qué no votarla también? Uno pensaría que su pregunta favorita debería ser una buena pregunta.
oscuro
1
¿Por qué necesitas boxeo? Si crea cuadros basados ​​en el conteo, serán de diferentes tamaños de todos modos, por lo que el mosaico está fuera de discusión. Probablemente sea más fácil agrupar en polígonos (es decir, casco convexo).
diciu
@diciu gracias por la respuesta. Sí, supongo que un casco convexo estaría bien, ya que podría convertirlos en cajas a partir de entonces. ¿Qué código tendría que usar para hacerlo usando el enfoque de casco convexo?
NetConstructor.com
2
Si utiliza cascos convexos, sus cuadros delimitadores (que encierran los cascos) se superpondrán y su requisito de que un punto esté en un solo BBOX ya no se cumplirá. Los cascos convexos no funcionan como un paso intermedio hacia BBOX sino como un reemplazo. E incluso entonces, crear una solución genérica será bastante complicado.
diciu

Respuestas:

13

Puedo conseguirle parte del camino suponiendo que ha descubierto cómo solicitar (a) la mitad más oriental de un conjunto de puntos y (b) la mitad más septentrional de un conjunto de puntos. De estos puede, por supuesto, obtener fácilmente (c) la mitad más occidental o (d) la mitad más meridional. (No sé QGIS, pero una forma de hacer (a) en general es solicitar la coordenada x mediana y luego buscar todos los puntos cuyas coordenadas x exceden eso. Las soluciones para (b) - (d) son similares .)

Usando esta capacidad, la solución se obtiene con una recursión fácil. Para describirlo, supongamos que hay un procedimiento Half, que implementa las operaciones anteriores, que toma dos argumentos: el primero es un conjunto de puntos y el segundo es un código igual a truecuando se desea la partición este-oeste e igual a lo falsecontrario. Devuelve dos subconjuntos de su entrada que lo particionan según lo solicitado.

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

En este pseudocódigo, R y S partición P; Box (R,! I, n) es una partición de R en la dirección ortogonal , Box (S,! I, n) es una partición de S en la dirección ortogonal, "+" significa formar la unión de la teoría de conjuntos, y {} designa un conjunto. (Al alternar la dirección de división, se crean cuadros en lugar de tiras). El parámetro n especifica el tamaño mínimo de un grupo en la partición; El tamaño máximo es 2 n .

Ejemplo

Aquí, como ilustración, hay un conjunto P de 12,891 puntos aleatorios divididos Box(P,true,100)en grupos de tamaño entre 100 y 200. El algoritmo crea 128 cajas de las cuales 37 tienen 100 puntos y 91 tienen 101 puntos.

whuber
fuente
2
El algoritmo es eficiente. Ejecutando en un solo núcleo, procesó diez veces más puntos (128,910) en 18 segundos. Se escala como O (n log (n) log (n)) para n puntos. (Podría ser mejorado para eliminar uno de esos factores de log (n), pero el esfuerzo es poco probable que sea de mérito.)
whuber
1
@W, ¿usó un tipo lexicográfico para facilitar la partición de las coordenadas de los puntos?
2
@whuber esto es increíble
dassouki
1
@Dan Un tipo léxico ayudaría pero no es necesario. Tenga en cuenta que se puede encontrar una mediana de n valores en el tiempo O (n) (no en el tiempo O (n log (n))), por lo que la división de puntos en mitades este-oeste o mitades norte-sur es asintóticamente una O (n ) cálculo.
whuber