Обчислення всіх відстаней від одиничних точок до декількох багатокутників [закрито]


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+ були б найбільш корисними.


Це можна зробити за допомогою ближнього аналізу в ArcGIS, але для цього для кожної точки знадобиться трохи автоматизації. Ви знайомі зі сценарієм пітона?
Брюндж Еміля

Еміль - Ні, я не знайомий з Python, але, можливо, я повинен навчитися.
NickN

Відповіді:


1

Для цього можна використовувати матрицю відстані в QGIS. Спочатку вам потрібно буде перетворити свої багатокутники в точки зору центроїдів або векторними > Інструментами для геометрії > Центроїдами полігону або за допомогою версії 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

Найщиріший товариш! Ця процедура (і результати) є основними, але коли ви ознайомитесь із програмним забезпеченням GIS, ви можете спробувати скористатися більш досконалими процедурами, які описані в інших відповідях.
Йосип

1
@nickN Просто незначна примітка до цього методу, центроїди не завжди потрапляють у полігон залежно від його форми. Це можливо ви могли б отримати деякі некоректні відстаней / рейтинг, але це залежить від ваших даних і вимог, чи буде це бути проблемою. В іншому випадку це по суті QGIS-версія GNT ArcGIS, за винятком того, що остання може обробляти більше очок, і я не впевнений, як QGIS обробляє імена / ідентифікатори в результаті.
Chris W

5

Це досить просто для досягнення QGIS (я думаю, що це зробить будь-яка версія) та дуже простого оператора SQL у менеджері БД. Але для цього ваше має бути у певній просторовій базі даних (Postgis або просторіт). Оскільки це більш доступно для більшості людей, я припускаю, що використовую просторіт, але оператори SQL є однаковими для Postgis.

  1. Створити нову базу даних просторових даних;
  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 - ця відповідь, здається, вирішує проблему, над якою я працюю. Мій стіл порожній. Можливо, я цього не розумію. У мене є багатокутний шар під назвою "VTO Pothole VRI" та ще один точковий шар під назвою "Grid Pothole Center". Я додаю наступний код, використовуючи ваші вказівки, як зазначено вище: SELECT f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) НА відстані ВІД "Центр вибоїн сітки" AS f, "Vhole VRI" AS g __ Я отримую порожню таблицю x із заголовками: id, id: 1, відстань Що я тут зробив неправильно? Використовуючи QGIS 3.6
Марк Томпсон

4

Інструмент " Генерувати біля таблиці" в ArcGIS зробить все, що вам завгодно, але для цього потрібна розширена ліцензія та зробить це для всіх точок / полігонів - не лише тих, що пов'язані один з одним. Це означає, що для кожного з ваших 95 об’єктів ви отримаєте ранжировану відстань за всіма 211 властивостями, тобто 20,045 рядків у таблиці. Вам або доведеться фільтрувати отриману таблицю, або, як пропонує Еміль, автоматизувати завдання створити виділення на основі асоціації та запустити їх лише для цих груп.

Що стосується фільтрації, так, з'єднання (за яким слід запит або вибір) - це все, що вам потрібно. Результат інструменту дає IN_FID та NEAR_FID. Залежно від того, як ви запускаєте інструмент (властивості біля точки або точки біля властивості), визначте, який саме FID. Потім ви приєднаєте свої точки та таблиці властивостей (обидва) до результату інструменту на основі відповідного FID.

Це передбачає, що кожен із ваших записів 211 властивостей має атрибут, який вказує, якому з 95 пунктів вони належать, тому що наступним кроком є ​​вибір (або запит на визначення) всіх записів в об'єднаній таблиці (таблицях), де два поля одного запису повинні match - поле імені точки = поле, пов'язане з властивістю точки. Випадки, коли вони не збігаються, - це багатокутники, які не пов'язані з цією точкою, тому вам не байдуже їх відстань від цієї точки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.