Estou procurando um algoritmo de agrupamento espacial para usá-lo no banco de dados habilitado para PostGIS para recursos de ponto. Vou escrever a função plpgsql que leva distância entre pontos dentro do mesmo cluster que a entrada. Na função de saída, retorna a matriz de clusters. A solução mais óbvia é criar zonas de buffer especificadas a distância ao redor do recurso e procurar recursos nesse buffer. Se esses recursos existirem, continue criando um buffer em torno deles, etc. Se esses recursos não existirem, isso significa que a construção do cluster foi concluída. Talvez haja algumas soluções inteligentes?
postgis
clustering
drnextgis
fonte
fonte
Respostas:
Existem pelo menos dois bons métodos de clustering para o PostGIS: k -means (via
kmeans-postgresql
extensão) ou geometrias de clustering dentro de uma distância limite (PostGIS 2.2)1) k - significa com
kmeans-postgresql
Instalação: Você precisa ter o PostgreSQL 8.4 ou superior em um sistema host POSIX (eu não saberia por onde começar para o MS Windows). Se você tiver este instalado a partir de pacotes, verifique também se possui os pacotes de desenvolvimento (por exemplo,
postgresql-devel
para o CentOS). Faça o download e extraia:Antes de compilar, você precisa definir a
USE_PGXS
variável de ambiente (minha postagem anterior foi instruída para excluir essa parte do arquivoMakefile
, o que não era a melhor das opções). Um desses dois comandos deve funcionar no seu shell Unix:Agora crie e instale a extensão:
(Nota: Eu também tentei isso com o Ubuntu 10.10, mas sem sorte, pois o caminho
pg_config --pgxs
não existe! Esse provavelmente é um bug de empacotamento do Ubuntu)Uso / Exemplo: Você deve ter uma tabela de pontos em algum lugar (desenhei vários pontos pseudo-aleatórios no QGIS). Aqui está um exemplo com o que eu fiz:
o
5
I fornecido no segundo argumento dakmeans
função window é o número K para produzir cinco clusters. Você pode alterar isso para o número inteiro que desejar.Abaixo estão os 31 pontos pseudo-aleatórios que desenhei e os cinco centróides com o rótulo mostrando a contagem em cada cluster. Isso foi criado usando a consulta SQL acima.
Você também pode tentar ilustrar onde esses clusters estão com ST_MinimumBoundingCircle :
2) Clustering dentro de uma distância limite com
ST_ClusterWithin
Esta função agregada está incluída no PostGIS 2.2 e retorna uma matriz de GeometryCollections onde todos os componentes estão a uma distância um do outro.
Aqui está um exemplo de uso, em que uma distância de 100,0 é o limite que resulta em 5 clusters diferentes:
O maior aglomerado intermediário possui um raio de círculo fechado de 65,3 unidades ou cerca de 130, que é maior que o limite. Isso ocorre porque as distâncias individuais entre as geometrias dos membros são inferiores ao limite e, portanto, as unem como um cluster maior.
fonte
Eu escrevi a função que calcula grupos de recursos com base na distância entre eles e constrói um casco convexo sobre esses recursos:
Exemplo de uso desta função:
'poi' - nome da camada, 'wkb_geometry' - nome da coluna geométrica, 'ogc_fid' - chave primária da tabela, 14000 - distância do cluster.
O resultado do uso desta função:
fonte
geometry
coluna na sua tabela, não armazenar o intervalo separadamente e criar colunas com valores únicos (IDs).Até agora, a mais promissora que encontrei é essa extensão para o cluster K-means como uma função de janela: http://pgxn.org/dist/kmeans/
No entanto, ainda não consegui instalá-lo com sucesso.
Caso contrário, para clustering de grade básico, você poderá usar o SnapToGrid .
fonte
Complementando a resposta @MikeT ...
Para MS Windows:
Requisitos:
O que você vai fazer:
cl.exe
compilador para gerar uma DLL com akmeans
função.Passos:
Abra o
kmeans.c
em qualquer editor:Depois das
#include
linhas, defina a macro DLLEXPORT com:Coloque
DLLEXPORT
antes de cada uma destas linhas:Abra a linha de comando do Visual C ++.
Na linha de comando:
kmeans-postgresql
.SET POSTGRESPATH=C:\Program Files\PostgreSQL\9.5
Corre
Copie
kmeans.dll
para%POSTGRESPATH%\lib
Agora execute o comando SQL no seu banco de dados para "CREATE" a função.
fonte
Aqui está uma maneira de exibir no QGIS o resultado da consulta PostGIS fornecida em 2) nesta resposta
Como o QGIS não lida com coleções de geometria nem tipos de dados diferentes na mesma coluna de geometria, criei duas camadas, uma para clusters e outra para pontos em cluster.
Primeiro para clusters, você só precisa de polígonos, outros resultados são pontos solitários:
Em seguida, para pontos em cluster, você precisa transformar as geometrycollections em multiponto:
Alguns pontos estão nas mesmas coordenadas, portanto, o rótulo pode ser confuso.
fonte
Você pode usar a solução Kmeans mais facilmente com o método ST_ClusterKMeans disponível no postgis da 2.3 Exemplo:
A caixa delimitadora de recursos é usada como geometria de cluster no exemplo acima. A primeira imagem mostra as geometrias originais e a segunda é o resultado da seleção acima.
fonte
Solução de cluster de baixo para cima da Obtenha um cluster único da nuvem de pontos com diâmetro máximo no postgis, o que não envolve consultas dinâmicas.
e um tipo com o ID do cluster
Em seguida, a função de algoritmo
Uso:
fonte