Cálculo de vizinho mais próximo no PostGIS?

8

Estou aprendendo a usar o PostGIS e os bancos de dados espaciais para análise. O que estou tentando fazer é executar um cálculo para obter a distância do polígono mais próximo em um arquivo, usando o cálculo de arestas, em vez de vértices.

Usando esta resposta de Paul Ramsey para Encontrar a distância mínima de ponta a ponta dos polígonos usando o ArcGIS Desktop? que é uma pergunta semelhante:

CREATE TABLE mytable_distances AS SELECT a.id, b.id, ST_Distance (a.geom :: geography, b.geom :: geography) como distância da mytable a, mytable b;

Estou tentando aplicá-lo ao meu banco de dados espacial. Eu não entendo a estrutura desta consulta embora. Eu acho que CREATE TABLE mytable_distances AScria uma tabela para armazenar o resultado, mas depois dessa parte estou perdida. São ae bnomes de colunas? Se sim, por que especificaria duas colunas para calcular isso?

Minha tabela é chamada TestAreae experimentei com êxito algumas consultas básicas:

SELECT 
  "TestArea".hgt
FROM 
  public."TestArea"
WHERE
  "TestArea".area > 100

A estrutura do banco de dados no PGAdmin III é a seguinte, com minha tabela chamada TestArea. Não sei como deve ser o cálculo do vizinho mais próximo usando meus cabeçalhos de coluna (todos esses objetos são polígonos).

insira a descrição da imagem aqui

djq
fonte

Respostas:

10

ae bsão nomes de tabela de alias para a mesma tabela. Esta é efetivamente uma T1 CROSS JOIN T2fala em DB. Isso permite que uma união automática diga "quão perto uma parte está da outra" em uma única tabela.

SELECT 
  a.hgt AS a_hgt,
  b.hgt AS b_hgt,
  ST_Distance(a.the_geom, b.the_geom) AS distance_between_a_and_b
FROM 
  public."TestArea" AS a, public."TestArea" AS b
WHERE
  a.gid < b.gid AND a.area > 100 AND b.area > 100

Você pode querer adicionar outra WHEREcláusula para limitar o número de linhas, por exemplo, adicionar AND ST_Distance(a.the_geom, b.the_geom) < 1000.0para que todas as distâncias sejam menores que um quilômetro (se você projetou o UTM).

Mike T
fonte
Obrigado pela sua resposta Mike. Eu usei e agora entendo o que está acontecendo. Talvez eu deva fazer isso como uma nova pergunta, mas existe uma maneira de otimizar o cálculo? Por exemplo, se eu tiver 100 polígonos, são 10.000 cálculos. Por acaso tenho 1.000.000 de polígonos e estou pensando em como reduzir o cálculo.
8111 djq
1
foi exatamente por isso que introduzi o último ST_Distancefiltro na WHEREcláusula ... para dizer que "não queremos encontrar distâncias entre nada além de uma certa distância". Você esperava encontrar a [uma] área mais próxima de outra? Essa seria realmente uma consulta um pouco diferente.
Mike T
Eu pensei que isso não apenas registraria os valores acima de um certo nível, mas que ainda os calcularia. Daí a minha pergunta subseqüente .... gis.stackexchange.com/q/11979/803
DJQ