Cálculo de todas as distâncias de pontos únicos a vários polígonos [fechado]

9

Eu tenho duas camadas: uma camada de ponto que define propriedades (95 objetos) e uma camada de polígono que define lotes de terra associados às propriedades (211 objetos). Cada ponto se refere a um ou mais polígonos. O que eu gostaria de produzir é uma tabela de distâncias de cada ponto para TODOS os polígonos associados a esse ponto (borda mais próxima ou centróide do polígono - qualquer um deles serve). Calcular a distância mais próxima é relativamente fácil no QGIS e no ArcGIS, mas esses cálculos omitem todos os polígonos distantes, pelo menos pelos métodos que tenho empregado. Idealmente, eu gostaria de uma saída de

Point_ID | distance to polygon 1 | distance to polygon 2 | distance to polygon 3 | etc.

Qualquer ponteiro no ArcGIS 10 ou QGIS 2.2+ seria mais útil.

NickN
fonte
Isso pode ser feito com análises próximas no ArcGIS, mas para cada ponto será necessário um pouco de automação. Você está familiarizado com scripts python?
Emil Brundage
Emil - Não, eu não estou familiarizado com Python, mas talvez eu deva aprender.
NickN

Respostas:

1

Você pode usar a Matriz de distâncias no QGIS para conseguir isso. Você primeiro precisa converter seus polígonos em pontos de centróide por Vector > Ferramentas de geometria > Centroides de polígono ou por meio da versão SAGA dos centróides de polígono. O motivo disso é que a função Matriz de distâncias pode analisar apenas entre duas camadas de pontos. Além disso, a saída seria assim:

Point_1 | PolygonCentroid_1 | Distance
Point_1 | PolygonCentroid_2 | Distance
Point_1 | PolygonCentroid_3 | Distance
Point_2 | PolygonCentroid_1 | Distance
Point_2 | PolygonCentroid_2 | Distance

A saída seria um arquivo .csv, para que você pudesse editar manualmente o layout usando outro software, como o Microsoft Excel.

Joseph
fonte
Obrigado Joseph - Para um novato no GIS como eu, esta é a maneira mais simples de obter as respostas que eu queria.
NickN
Muito bem-vindo, companheiro! Este procedimento (e os resultados) são básicos, mas quando você se familiariza com o software GIS, pode tentar usar procedimentos mais avançados, descritos nas outras respostas.
Joseph
11
@nickN Apenas uma nota muito pequena desse método, nem sempre os centróides se enquadram em um polígono, dependendo de sua forma. É possível que você obtenha distâncias / classificações incorretas, mas isso depende de seus dados e requisitos para determinar se isso seria um problema. Caso contrário, essa é essencialmente a versão QGIS do GNT do ArcGIS, exceto que o último pode lidar com mais de pontos e não tenho certeza de como o QGIS lida com os nomes / IDs no resultado.
Chris W
5

Isso é bastante simples de obter usando o QGIS (acho que qualquer versão serve) e uma instrução SQL muito simples no gerenciador de banco de dados. Mas para isso você deve estar em algum tipo de banco de dados espacial (Postgis ou spatialite). Como é mais acessível para a maioria das pessoas, assumirei o uso do spatialite, mas as instruções SQL são as mesmas para o Postgis.

  1. Crie um novo banco de dados Spatialite;
  2. Importe suas camadas de ponto e polígonos para o novo banco de dados;
  3. Abra o plug-in do gerenciador de banco de dados, selecione o banco de dados e execute uma das seguintes instruções SQL:

Distância de todos os pontos a todos os limites dos polígonos

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f, 
  polygons_table AS g

Distância de todos os pontos aos limites dos polígonos relacionados (assumindo que existe um campo comum)

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Distância de todos os pontos aos centróides de polígonos relacionados :

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Observe que você pode adicionar qualquer campo de suas camadas ao resultado:

SELECT 
  f.point_id,
  f.point_number,
  g.polygon_id,
  g.parcel_name,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Ou mesmo todos os campos:

SELECT 
  f.*,
  g.*,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)
Alexandre Neto
fonte
Se você precisar de mais informações sobre como criar o banco de dados espacial e importar a camada, informe-me e editarei a resposta.
Alexandre Neto
Olá Alexandre, por que participar e não um simples ONDE?
Luigi Pirelli
Bem, é algo que eu peguei em uma das apresentações de Paul Ramsey. Não consigo lembrar o motivo pelo qual ele defendeu o uso explícito de Join, mas se ele disser ...: -PI tentará executar EXPLAIN nas duas consultas para ver se há alguma diferença.
Alexandre Neto
Eu sou novo no SpatialLite - esta resposta parece resolver um problema no qual estou trabalhando. Minha mesa está em branco. Talvez eu não esteja entendendo isso. Eu tenho uma camada de polígono chamada "Pothole VRI" e outra camada de ponto chamada "Grid Pothole Center". Adicionei o seguinte código usando suas instruções conforme descrito acima: SELECT f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) AS distance FROM 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ Recebo uma tabela vazia x com os seguintes títulos: id, id: 1, distance O que fiz de errado aqui? Usando QGIS 3.6
Mark Thompson
4

A ferramenta Generate Near Table no ArcGIS fará o que você deseja, mas requer uma licença Avançada e o fará para todos os pontos / polígonos - não apenas aqueles associados um ao outro. Isso significa que, para cada um dos seus 95 objetos, você obterá a distância classificada para todas as 211 propriedades, portanto, 20.045 linhas na tabela. Você precisaria filtrar a tabela resultante ou, como sugere Emil, automatizar a tarefa para criar seleções com base na associação e executá-la apenas nesses grupos.

Quanto à filtragem, sim, uma junção (seguida por uma consulta ou seleção de definição) é tudo que você precisa. O resultado da ferramenta fornece IN_FID e NEAR_FID. Dependendo de como você executa a ferramenta (propriedades perto do ponto ou propriedade perto do ponto), determine qual FID é qual. Você juntaria suas tabelas de pontos e propriedades (ambas) ao resultado da ferramenta com base no FID apropriado.

Isso pressupõe que cada um dos seus 211 registros de propriedades possui um atributo que diz a qual dos 95 pontos eles pertencem, porque a próxima etapa é selecionar (ou definir uma consulta) todos os registros nas tabelas unidas onde dois campos de um registro devem campo do nome do ponto de correspondência = campo do nome do ponto associado à propriedade. Os casos em que eles não correspondem são polígonos que não estão associados a esse ponto, então você não se importa com a distância deles a partir desse ponto.

Chris W
fonte