Расчет всех расстояний от отдельных точек до нескольких полигонов [закрыто]

9

У меня есть два слоя: точечный слой, определяющий свойства (95 объектов), и слой многоугольника, определяющий участки земли, связанные со свойствами (211 объектов). Каждая точка относится к одному или нескольким полигонам. Я хотел бы создать таблицу расстояний каждой точки до ВСЕХ многоугольников, связанных с этой точкой (ближайший край или центроид многоугольника - подойдет любой). Вычисление ближайшего расстояния относительно просто в QGIS и ArcGIS, но в этих вычислениях опущены все удаленные полигоны, по крайней мере, теми методами, которые я использовал. В идеале я хотел бы вывод

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

Любые указатели в ArcGIS 10 или QGIS 2.2+ будут наиболее полезными.

NickN
источник
Это можно сделать с помощью почти полного анализа в ArcGIS, но для этого для каждой точки потребуется небольшая автоматизация. Вы знакомы с сценариями Python?
Эмиль Брюндейдж
Эмиль - Нет, я не знаком с Python, но, возможно, я должен учиться.
NickN

Ответы:

1

Для этого вы можете использовать матрицу расстояний в QGIS. Сначала вам нужно будет преобразовать полигоны в точки центроида либо с помощью Vector > Geometry Tools > Polyroid centroids, либо с помощью SAGA-версии многоугольных центроидов. Причиной этого является функция матрицы расстояний, которая может анализировать только между двумя точечными слоями. Кроме того, вывод будет выглядеть так:

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

Выводом будет файл .csv, чтобы вы могли вручную редактировать макет с помощью другого программного обеспечения, такого как Microsoft Excel.

Джозеф
источник
Спасибо, Джозеф. Для новичка в ГИС, такого как я, это самый простой способ получить ответы, которые я хотел.
NickN
Самый желанный приятель! Эта процедура (и результаты) являются основными, но когда вы познакомитесь с программным обеспечением ГИС, вы можете попробовать использовать более сложные процедуры, которые описаны в других ответах.
Джозеф
1
@nickN Это очень незначительное замечание, центроиды не всегда попадают в многоугольник в зависимости от его формы. Это возможно вы могли бы получить некоторые некорректные расстояний / рейтинг, но это зависит от ваших данных и требований, будет ли это быть проблемой. В противном случае это по сути версия QGIS в ArcGIS GNT, за исключением того, что последняя может обрабатывать больше, чем точки, и я не уверен, как QGIS обрабатывает имена / идентификаторы в результате.
Крис W
5

Это довольно просто сделать, используя QGIS (думаю, подойдет любая версия) и очень простой оператор SQL в менеджере БД. Но для этого вы должны быть в какой-то пространственной базе данных (Postgis или пространственный). Поскольку он более доступен для большинства людей, я предполагаю использовать пространственный, но операторы SQL одинаковы для Postgis.

  1. Создать новую базу данных Spatialite;
  2. Импортируйте ваши точки и слои полигонов в новую базу данных;
  3. Откройте плагин менеджера БД, выберите базу данных и выполните один из следующих операторов SQL:

Расстояние от всех точек до всех границ полигонов

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

Расстояние до всех точек до границ связанных полигонов (при условии, что существует общее поле)

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)

Расстояние до всех точек до связанных многоугольников центроидов :

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)

Обратите внимание, что вы можете добавить любое поле из ваших слоев к результату:

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)

Или даже все поля:

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)
Александр Нето
источник
Если вам нужно больше информации о том, как создать пространственную базу данных и импортировать слой, дайте мне знать, и я отредактирую ответ.
Александр Нето
Привет Александр, зачем присоединяться, а не просто ГДЕ?
Луиджи Пирелли
Ну, это то, что я поймал из одной из презентаций Пола Рэмси. Не могу вспомнить причину, по которой он выступает за явное использование Join, но если он это скажет ...: -PI попытается выполнить EXPLAIN для обоих запросов, чтобы увидеть, есть ли какая-либо разница.
Александр Нето
Я новичок в SpatialLite - кажется, этот ответ решает проблему, над которой я работаю. Мой стол пуст Возможно, я не понимаю этого. У меня есть слой многоугольника, который называется «Pothole VRI», и еще один точечный слой, который называется «Grid Pothole Center». Я добавляю следующий код, используя ваши инструкции, как указано выше: SELECT f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) AS расстояние от 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ Я получаю пустую таблицу x с такими заголовками: id, id: 1, distance Что я здесь сделал неправильно? Использование QGIS 3.6
Марк Томпсон
4

Инструмент « Создать ближнюю таблицу» в ArcGIS будет делать то, что вы хотите, но он требует расширенной лицензии и будет делать это для всех точек / многоугольников, а не только для тех, которые связаны друг с другом. Это означает, что для каждого из ваших 95 объектов вы получите ранжированное расстояние для всех 211 свойств, то есть 20 045 строк в таблице. Вам нужно будет либо отфильтровать полученную таблицу, либо, как Эмиль предлагает автоматизировать задачу, чтобы создать выборки на основе ассоциации и запускать ее только в этих группах.

Что касается фильтрации, да, объединение (за которым следует запрос или выбор определения) - это все, что вам нужно. Результат инструмента дает вам IN_FID и NEAR_FID. В зависимости от того, как вы запустите инструмент (свойства рядом с точкой или свойство точки рядом), определите, какой FID является каким. Затем вы присоединяете свои таблицы точек и свойств (обе) к результату инструмента на основе соответствующего FID.

Это предполагает, что каждая из ваших 211 записей свойств имеет атрибут, который говорит, к какой из 95 точек они принадлежат, поскольку следующим шагом является выбор (или запрос определения) всех записей в объединенной таблице (таблицах), где два поля одной записи должны поле имени совпадающей точки = свойство связанное поле имени точки. Случаи, когда они не совпадают, представляют собой полигоны, которые не связаны с этой точкой, поэтому вам не важно их расстояние от этой точки.

Крис У
источник