Obliczanie wszystkich odległości od pojedynczych punktów do wielu wielokątów [zamknięte]

9

Mam dwie warstwy: warstwę punktową określającą właściwości (95 obiektów) i warstwę wielokąta definiującą działki powiązane z właściwościami (211 obiektów). Każdy punkt dotyczy jednego lub więcej wielokątów. Chciałbym stworzyć tabelę odległości każdego punktu do WSZYSTKICH wielokątów powiązanych z tym punktem (najbliższa krawędź lub środek ciężkości wielokąta - albo to zrobi). Obliczanie najbliższej odległości jest stosunkowo łatwe w QGIS i ArcGIS, ale te obliczenia pomijają wszystkie odległe wielokąty, przynajmniej metodami, które stosowałem. Idealnie chciałbym uzyskać wynik

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

Wszelkie wskazówki w ArcGIS 10 lub QGIS 2.2+ byłyby najbardziej pomocne.

NickN
źródło
Można to zrobić za pomocą analizy zbliżonej w ArcGIS, ale wykonanie tego dla każdego punktu będzie wymagało niewielkiej automatyzacji. Czy znasz skrypty python?
Emil Brundage,
Emil - Nie, nie znam Pythona, ale może powinienem się nauczyć.
NickN

Odpowiedzi:

1

Aby to osiągnąć, możesz skorzystać z macierzy odległości w QGIS. Najpierw musisz przekonwertować swoje wielokąty na punkty centroidów za pomocą opcji Wektor > Narzędzia geometrii > Centroidy wielokątów lub za pomocą wersji SAGA centroidów wielokątów. Powodem tego jest to, że funkcja macierzy odległości może analizować tylko między 2 punktowymi warstwami. Ponadto wynik będzie taki:

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

Dane wyjściowe to plik .csv, dzięki czemu można ręcznie edytować układ za pomocą innego oprogramowania, takiego jak Microsoft Excel.

Joseph
źródło
Dzięki Joseph - Dla nowicjusza w GIS, takiego jak ja, jest to najprostszy sposób na uzyskanie odpowiedzi, których chciałem.
NickN
Najbardziej mile widziany kolego! Ta procedura (i jej wyniki) jest podstawowa, ale gdy zapoznasz się z oprogramowaniem GIS, możesz spróbować zastosować bardziej zaawansowane procedury opisane w innych odpowiedziach.
Joseph
1
@nickN Niewielka uwaga dotycząca tej metody, centroidy nie zawsze mieszczą się w wielokącie, w zależności od jego kształtu. Jest to możliwe, można uzyskać kilka niepoprawnych Odległości / rankingi, ale to zależy od danych i wymagań co do tego, czy będzie to problemem. W przeciwnym razie jest to zasadniczo wersja GNG ArcGIS w QGIS, z tym wyjątkiem, że ta ostatnia może obsłużyć więcej niż punkty i nie jestem pewien, jak QGIS obsługuje nazwy / identyfikatory w wyniku.
Chris W
5

Jest to dość proste do osiągnięcia przy użyciu QGIS (myślę, że każda wersja to zrobi) i bardzo prostej instrukcji SQL w menedżerze DB. Ale do tego twoja musi znajdować się w jakiejś przestrzennej bazie danych (Postgis lub spatialite). Ponieważ jest on bardziej dostępny dla większości ludzi, założę się, że używa spatialite, ale instrukcje SQL są takie same dla Postgis.

  1. Utwórz nową bazę danych Spatialite;
  2. Zaimportuj warstwy punktów i wielokątów do nowej bazy danych;
  3. Otwórz wtyczkę menedżera DB, wybierz bazę danych i uruchom jedną z następujących instrukcji SQL:

Odległość od wszystkich punktów do granic wszystkich wielokątów

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

Odległość do wszystkich punktów do powiązanych granic wielokątów (przy założeniu istnienia wspólnego pola)

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)

Odległość do wszystkich punktów do powiązanych centroidów wielokątów :

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)

Zauważ, że możesz dodać dowolne pole ze swoich warstw do wyniku:

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)

Lub nawet wszystkie pola:

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
źródło
Jeśli potrzebujesz więcej informacji na temat tworzenia bazy danych przestrzennych i importowania warstwy, daj mi znać, a ja wyedytuję odpowiedź.
Alexandre Neto,
Cześć Alexandre, dlaczego warto dołączyć, a nie proste GDZIE?
Luigi Pirelli,
Cóż, to coś, co złapałem z jednej z prezentacji Paula Ramseya. Nie pamiętam powodu, dla którego zalecał jawne użycie funkcji Join, ale jeśli to powie ...: -PI spróbuje uruchomić EXPLAIN dla obu zapytań, aby sprawdzić, czy jest jakaś różnica.
Alexandre Neto,
Jestem nowy w SpatialLite - ta odpowiedź wydaje się dotyczyć problemu, nad którym pracuję. Mój stolik jest pusty. Być może nie rozumiem tego. Mam warstwę wielokąta o nazwie „Pothole VRI” i inną warstwę punktową o nazwie „Grid Pothole Center”. Dodaję następujący kod, korzystając z instrukcji jak powyżej: WYBIERZ f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) AS odległość OD 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ Dostaję pustą tabelę x z następującymi nagłówkami: id, id: 1, dystans Co tutaj źle zrobiłem? Korzystanie z QGIS 3.6
Mark Thompson
4

Narzędzie Generuj w pobliżu tabeli w ArcGIS zrobi to, co chcesz, ale wymaga licencji Advanced i zrobi to dla wszystkich punktów / wielokątów - nie tylko tych powiązanych ze sobą. Oznacza to, że dla każdego z 95 obiektów otrzymasz odległość rankingową dla wszystkich 211 właściwości, czyli 20 045 wierszy w tabeli. Musisz albo odfiltrować wynikową tabelę, albo, jak sugeruje Emil, zautomatyzować zadanie, aby utworzyć selekcje na podstawie powiązania i uruchomić je tylko na tych grupach.

Jeśli chodzi o filtrowanie, tak, wystarczy połączyć (a następnie zapytanie lub wybór definicji). Wynik narzędzia daje IN_FID i NEAR_FID. W zależności od sposobu uruchomienia narzędzia (właściwości w pobliżu punktu lub właściwość w pobliżu punktu) określ, który FID jest który. Następnie dołączysz tabelę punktów i właściwości (obie) do wyniku narzędzia na podstawie odpowiedniego FID.

Zakłada się, że każdy z 211 rekordów właściwości ma atrybut określający, do którego z 95 punktów należą, ponieważ następnym krokiem jest wybranie (lub zdefiniowanie zapytania) wszystkich rekordów w połączonych tabelach, w których dwa pola jednego rekordu powinny match - pole nazwy punktu = pole nazwy punktu powiązane z właściwością. Przypadki, w których nie pasują do siebie, to wielokąty, które nie są powiązane z tym punktem, więc nie obchodzi Cię ich odległość od tego punktu.

Chris W.
źródło