Знаходження найближчого значення растрової комірки на основі векторної точки?


9

У ArcGIS у мене два шари: один - векторна точка, а другий - растровий шар. Я хочу додати значення сітки растрових даних до векторної точки. Проблема полягає в тому, що векторна точка відсутня від будь-яких існуючих растрових сіток зі значенням, тому команда "Зразок" не повертає значення для цих векторних точок.

Отже, моє запитання таке: як я можу знайти найближчу растрову клітинку з заданою векторною точкою та отримати значення з комірки?

Насправді мені потрібно зробити дві речі:

  1. Визначте контур у рейнджері (як правило, на 1-2 клітини від мого наявного растру)
  2. Призначте їм значення з найближчого растру, якщо вони знаходяться в діапазоні

Відредаговано: У мене близько 3000 векторних точок, і моя проблема полягає в наступному: введіть тут опис зображення

Мені потрібно додати векторні точки до растрових значень на основі розташування. Я використовував інструмент "Зразок", і він працює добре для більшості пунктів.

Однак є така ситуація введіть тут опис зображення

Права точка може отримати значення з растру ("Зразок" працює), але ліва точка не може через проблеми з вирівнюванням.

Растр на багатокутник не працює, тому що я отримую повідомлення про помилку, що я не можу перетворити їх у вектор, тому що вони поза доменом. Також у мене є такі очкивведіть тут опис зображення

Ці верхні точки не повинні отримувати жодних значень, оскільки вони занадто далеко від растру.

Я думав про те, щоб якось обійтись:

Крок 1. Спершу зробіть «зразок»

Крок 2. Виберіть нульове значення після операцій "зразок"

Крок 3. побудуйте буферні зони (в межах 1 десяткового градуса) на основі нульових точок

Крок 4. використовувати зональну статистику ?? ? або інші інструменти, щоб провести крізь усі растрові комірки в буфері, знайти найближчу, витягнути її значення та помістити у векторну точку.

Я застряг на кроці 4. Я не знаю, який інструмент в ArcSDK я можу використати для досягнення цієї функції.

Або ще ... Чи маєте ви кращу ідею розібратися з цим?

У мене є 20 растрових шарів, як це, і я хотів би зробити це автоматично (використовуючи конструктор моделей та arcobject).


@whuber: Ваш метод звучить дуже розумно. Моє запитання: я обробляю дані в глобальному масштабі, і як я можу визначити x0 та x1 для контурного растру?
Відвідано

Перевірте його властивості після додавання до проекту.
whuber

1
Зональна статистика - тупик. На основі вашої редакції існує просте пряме рішення: трохи розгорніть растр навколо його межі та відібрайте зразок розгорнутого растру. Існує багато способів зробити це, але всі вони потребують невеликої можливості з растровими розрахунками. Одне з найпростіших - збільшити масштаб аналізу, обчислити фокусне значення та (за допомогою 'con') вставити його значення в межову зону NoData. Це призначає середнє значення растрових значень, розташованих поблизу, для кожного місця вибірки растру.
whuber

@whuber Є ще одна проблема в тому, що я не знаю, де є контури. Отже, у моєму процесі є фактично дві процедури: визначте контури та призначте їм значення.
Відвідано

Що таке "контур"? Якщо це точка, не охоплена растровим значенням, ви не можете не знайти їх: це точки, які не отримують ніяких значень при застосуванні Sampleінструменту.
whuber

Відповіді:


8

Растровий контур займає прямокутник, обмежений в нижній лівій частині походження, має координати (скажімо) (x0, y0), а вгорі праворуч (x1, y1): це властивості, які легко виявляються з будь-якого растру. Ви можете використовувати цю інформацію для переміщення будь-яких точок поза межами растру до найближчої точки на межі растру та витягування растрових значень у нових місцях.

Такі завдання часто легко розробляються, враховуючи менші розміри . Одновимірний розмір растра - це просто інтервал чисел, скажімо, від x0 до x1> x0, умовно записаний [x0, x1]. Припустимо, ви хочете знайти найближчу точку в цьому інтервалі до заданого числа x. Є три випадки: x <x0 (x зліва), x0 <= x <= x1 (x знаходиться в інтервалі), і x1 <x (x - праворуч). Очевидно, що найближчі точки - x0, x і x1 відповідно. Формула цього результату є

x -> min (max (x, x0), x1),

як ви бачите, розглядаючи кожен із трьох випадків окремо.

Оскільки міра растру є декартовим твором двох інтервалів, [x0, x1] * [y0, y1], однакова формула працює у двох вимірах. Просто застосуйте його до кожного інтервалу. Таким чином, координати проектованої точки можна обчислити (у полевому калькуляторі, скажімо) як

(x, y) -> (min (max (x, x0), x1), min (max (y, y0), y1).

Ось ця формула в дії зі 100 балами, випадковим чином розміщених навколо та в межах сітки:

Малюнок

Пунктирні лінії візуально асоціюють точки поза межами місць, де вони будуть переміщені.

Створіть точковий шар з цих обчислених координат і застосуйте Sampleінструмент для вилучення растрових значень. Приєднайте результати до початкового шару точок.

З практичної точки зору , щоб уникнути проблем із заокругленням з плаваючою точкою, які могли б утримати нові точки не залежати в межах сітки, було б розумно зробити x0 та y0 трохи більше, ніж справжнє походження (ви можете додати до них половину стільця) і, аналогічно, роблять x1 і y1 трохи менше.

Підсумовуючи це , робочий процес складається з обчислення двох полів (нових координат) в таблиці вихідного точкового шару, створення рівня подій точки з цих нових координат, запуску Sampleінструмента та виконання з'єднання з базою даних (не просторового з'єднання).


Коли у вас є набагато більше векторних точок, ніж є комірок у растрі, вам слід віддати перевагу рішенню, поданому @celenius (який пропонує перетворити растр у точки та використовувати просторове з'єднання). Однак, як правило, у растрах є безліч комірок - мільйони до мільярдів - і перетворення в бали настільки трудомістке і трудомістке, що до нього слід підходити обережно.

Крім того, ви можете прискорити рішення Celenius , використовуючи растровий обчислення, щоб скласти цілу сітку зі значеннями лише вздовж її межі. Перетворення цього шару в точковий шар - це швидко та просто, оскільки у нього буде мало очок. Назвемо це "граничним шаром". Вибірка сітки в точках прикордонного шару, тим самим копіювання значень сітки в таблицю атрибутів прикордонного шару. Після запуску Sampleз початковим точковим шаром видаліть усі точки, в яких успішно отримано зразок. Просторово приєднайте прикордонний шар до решти точок, щоб завершити процес вибірки.

(Один із способів скласти сітку зі значеннями лише вздовж її межі - застосувати фокусну операцію сусідства, яка не проходить уздовж межі. Приклади включають пошук схилів, затінення пагорбів, фокусну статистику 3 х 3. Це створює сітку з одноклітинним, товсте кільце NoData біля його краю. Використання IsNull та SetNull для виявлення комірок NoData та перетворення між NoData та комірками даних створює сітку, повну значень NoData, за винятком межі.)


Підсумовуючи, робочий процес складається з обчислення двох полів (нових координат) в таблиці вихідного точкового шару, створення шару подій точки з цих нових координат, запуску інструмента "Зразок" та виконання з'єднання з базою даних (не просторового з'єднання). Не могли б ви розробити, як це зробити? (Ви можете побачити мої фото для моєї проблеми). Дякую!
Відвідано

У мене близько 15% балів мають цю проблему. як можна визначити x0 та x1 для кожної точки?
Відвідано

1
@Seen, x0, y0, x1, y1 призначені для сіток. Координати точок (x, y) можна обчислити в Польовому калькуляторі, як описано в довідці ArcGIS або в декількох потоках на цьому сайті. Існують пункти меню для створення точкового шару XY та бази даних: це стандартні основні операції.
whuber

4

Можна перетворити растр у точки ( ref ), а потім зробити просторове з'єднання точок (від растру) до точки.

(Я щойно дізнався, що очки можна просторово приєднати сюди вчора )


1
+1 за розумний підхід. Для великих сіток, де це стає нездійсненним, конвертуйте лише межі комірок растра в точки. (Я описую, як наприкінці своєї відповіді.)
блукання

У мене є тисячі комірок кожного растрового шару, і я маю 20 таких шарів ... тож перетворення їх у векторні точки займає багато часу
Seen

Крім того, коли я намагаюся зробити растр на багатокутник, я отримую повідомлення про помилку як ПОМИЛКА 000864 Растровий вхід: Введення не в межах визначеного домену. ПОМИЛКА 000863 Невірний тип GP даних
відвідування

Ви отримуєте помилку при перетворенні растра в точки?
djq

@celenius Це працює, але це зайняло тривалий час.
Відвідано

1

Ви можете конвертувати растровий шар у багатокутник за допомогою інструменту "Растр до полігону" та запустити просторове з'єднання (клацніть правою кнопкою миші на точковому шарі та виберіть "Приєднатись та відносини" - "Приєднатися". На першому спадному меню виберіть опцію просторового з'єднання та виберіть найближчий щоб вибрати параметр на кнопці readio) або скористатися інструментом «Близький».


Як ви використовуєте результат просторового з'єднання для отримання відповідного растрового значення?
whuber

@whuber, у діалоговому вікні "Приєднатись до даних", коли ви вибираєте опцію "найближче до неї", просторове з'єднання вибирає найближчу функцію полігону (результат від інструменту "Растр до полігону") і додає цю інформацію про ознаку до функції точки. Це те, що ви запитували? Моя початкова відповідь була розміщена перед його редагуванням. Я здогадуюсь, растр Seen може бути занадто великим, щоб перетворити його на багатокутник?
художній твір21

Ідея не в тому, щоб знайти найближчий растр. Дійсно, те, що шукається, це спосіб екстраполяції значень растру понад його початковий обсяг. Питання пропонує підхід найближчого сусіда: у будь-якій сусідній точці, що не знаходиться на растрі, знайдіть найближчу клітинку в растрі та використовуйте її значення.
whuber

Після повторного читання останнього коментаря, здається, ви можете запропонувати перетворити растр не в «багатокутник», а в багатокутний шар з одним многокутником для кожної комірки (або суміжним набором комірок). Якщо це так, це може досягти успіху з дуже маленькими растрами, але чому ви пропонуєте це - що є складною, дорогою операцією (і працює лише для цілих сіток) - замість аналогічного, але більш ефективного рішення @celenius, запропонованого раніше? Які переваги пропонує ваше рішення?
whuber

@whuber, багатокутний шар правильний. Так, метод celenius коштуватиме менше пам'яті.
художній твір21
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.