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.


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.


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)

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.