Calcolo di tutte le distanze da singoli punti a più poligoni [chiuso]


9

Ho due livelli: uno strato punto che definisce le proprietà (95 oggetti) e uno strato poligonale che definisce i lotti di terra associati alle proprietà (211 oggetti). Ogni punto si riferisce a uno o più poligoni. Quello che vorrei produrre è una tabella delle distanze di ciascun punto rispetto a TUTTI i poligoni associati a quel punto (il bordo più vicino o il centroide del poligono - o lo farà). Calcolare la distanza più vicina è relativamente facile in QGIS e ArcGIS, ma quei calcoli omettono tutti i poligoni distanti, almeno con i metodi che ho impiegato. Idealmente, vorrei un output di

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

Qualsiasi suggerimento in ArcGIS 10 o QGIS 2.2+ sarebbe di grande aiuto.


Questo può essere fatto con analisi vicine in ArcGIS, ma per farlo per ogni punto richiederà un po 'di automazione. Hai familiarità con lo scripting Python?
Emil Brundage,

Emil - No, non ho familiarità con Python, ma forse dovrei imparare.
NickN,

Risposte:


1

A tale scopo è possibile utilizzare la matrice di distanza in QGIS. Dovresti prima convertire i tuoi poligoni in punti centroidi tramite Vettore > Strumenti geometria > Centroidi poligonali o tramite la versione SAGA dei centroidi poligonali. La ragione di ciò è che la funzione Distance Matrix può analizzare solo tra 2 livelli di punti. Inoltre, l'output sarebbe così:

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

L'output sarebbe un file .csv in modo da poter modificare manualmente il layout utilizzando un altro software come Microsoft Excel.


Grazie Joseph - Per un nuovo arrivato al GIS come me, questo è il modo più semplice per ottenere le risposte che volevo.
NickN,

Benvenuto amico! Questa procedura (e i risultati) sono fondamentali ma quando si acquisisce maggiore familiarità con il software GIS, è possibile provare a utilizzare procedure più avanzate descritte nelle altre risposte.
Joseph,

1
@nickN Solo una nota molto minore di questo metodo, i centroidi non sempre rientrano in un poligono a seconda della sua forma. È possibile che tu possa ottenere alcune distanze / classifiche errate, ma dipende dai tuoi dati e dai requisiti se si tratterebbe di un problema. Altrimenti questa è essenzialmente la versione QGIS di GNT di ArcGIS, tranne che quest'ultima può gestire più di punti e non sono sicuro di come QGIS gestisca i nomi / ID nel risultato.
Chris W,

5

Questo è abbastanza semplice da ottenere utilizzando QGIS (penso che qualsiasi versione lo farà) e un'istruzione SQL molto semplice in DB Manager. Ma per quello il tuo deve essere in una specie di database spaziale (Postgis o spatialite). Dal momento che è più accessibile alla maggior parte delle persone, assumerò l'uso di spatialite, ma le istruzioni SQL sono le stesse per Postgis.

  1. Creare un nuovo database Spatialite;
  2. Importa i livelli di punti e poligoni nel nuovo database;
  3. Aprire il plug-in DB Manager, selezionare il database ed eseguire una delle seguenti istruzioni SQL:

Distanza da tutti i punti a tutti i confini dei poligoni

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

Distanza da tutti i punti ai limiti dei poligoni correlati (supponendo che esista un campo comune)

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)

Distanza da tutti i punti ai relativi centroidi poligoni :

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)

Nota che puoi aggiungere qualsiasi campo dai tuoi livelli al risultato:

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)

O anche tutti i campi:

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 hai bisogno di ulteriori input su come creare il database spazialite e importare il layer, fammi sapere e modificherò la risposta.
Alexandre Neto,

Ciao Alexandre, perché iscriversi e non un semplice DOVE?
Luigi Pirelli,

Bene, è qualcosa che ho preso da una delle presentazioni di Paul Ramsey. Non ricordo il motivo per cui sostiene l'uso esplicito di Join, ma se lo dice ...: -PI proverà a eseguire EXPLAIN su entrambe le query per vedere se c'è qualche differenza.
Alexandre Neto,

Sono nuovo di SpatialLite: questa risposta sembra risolvere un problema a cui sto lavorando. Il mio tavolo è vuoto. Forse non lo capisco. Ho uno strato poligonale chiamato "Pothole VRI" e un altro livello punto chiamato "Grid Pothole Center". Aggiungo il seguente codice usando le tue istruzioni come sopra: SELEZIONA f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) AS distance FROM 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ Ho una tabella vuota x con queste intestazioni: id, id: 1, distance Cosa ho fatto di sbagliato qui? Utilizzo di QGIS 3.6
Mark Thompson,

4

Lo strumento Genera vicino alla tabella in ArcGIS farà ciò che vuoi, ma richiede una licenza avanzata e lo farà per tutti i punti / poligoni, non solo quelli associati tra loro. Ciò significa che per ciascuno dei tuoi 95 oggetti otterrai la distanza classificata per tutte le 211 proprietà, quindi 20.045 righe nella tabella. Dovresti filtrare la tabella risultante o, come suggerisce Emil, automatizzare l'attività per creare selezioni basate sull'associazione ed eseguirla solo su quei gruppi.

Per quanto riguarda il filtro, sì, un join (seguito da una query di definizione o selezione) è tutto ciò di cui hai bisogno. Il risultato dello strumento ti dà IN_FID e NEAR_FID. A seconda di come si esegue lo strumento (proprietà vicino al punto o punto vicino alla proprietà) determinare quale FID è quale. Quindi unire le tabelle dei punti e delle proprietà (entrambe) al risultato dello strumento in base al FID appropriato.

Ciò presuppone che ciascuno dei 211 record di proprietà abbia un attributo che indica a quale dei 95 punti appartengono, poiché il passaggio successivo è selezionare (o interrogare la definizione) tutti i record nelle tabelle unite in cui due campi di un record dovrebbero match - field name point = campo nome punto associato alla proprietà. I casi in cui non corrispondono sono poligoni che non sono associati a quel punto, quindi non ti interessa la loro distanza da quel punto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.