Найти значение ближайшей растровой ячейки на основе векторной точки?

9

У меня есть два слоя в ArcGIS: один - векторная точка, а другой - растровый слой. Я хочу добавить значение сетки растровых данных к точке вектора. Проблема в том, что векторная точка удалена от любых существующих растровых сеток со значением, поэтому команда «Образец» не возвращает значения для этой векторной точки.

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

На самом деле мне нужно сделать две вещи:

  1. Идентифицируйте outliner в рейнджере (обычно 1-2 ячейки от моего существующего растра)
  2. Присвойте им значение из ближайшего растра, если они находятся в диапазоне

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

Мне нужно добавить растровое значение на основе местоположения к векторным точкам. Я использовал инструмент «Образец», и он хорошо работает для большинства пунктов.

Тем не менее, есть такая ситуация введите описание изображения здесь

Правая точка может получить значение из растра (работает «Образец»), но левая точка не может из-за проблем с выравниванием.

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

Эти верхние точки не должны получать никаких значений, потому что они находятся слишком далеко от растра.

Я думал о некоторых способах обойти:

Шаг 1. Сделайте «образец» первым

Шаг 2. Выберите нулевое значение после «образца» операции

Шаг 3. Построить буферные зоны (в пределах 1 десятичного градуса) на основе нулевых точек

Шаг 4. Использовать зональную статистику ? или другие инструменты, чтобы перебрать все растровые ячейки в буфере, найти ближайшую, извлечь ее значение и поместить в векторную точку.

Я застрял на шаге 4. Я не знаю, какой инструмент в ArcSDK я могу использовать для достижения этой функции.

Или еще ... У вас есть идея с этим справиться?

У меня есть 20 таких растровых слоев, и я хотел бы сделать это автоматически (используя построитель моделей и arcobject).

Видели
источник
@whuber: Ваш метод звучит очень умно. Мой вопрос заключается в том, что я обрабатываю данные в глобальном масштабе, и как я могу определить x0 и x1 для контура растров?
увидено
Проверьте его свойства после добавления его в проект.
whuber
1
Зональная статистика - это тупик. Основываясь на ваших изменениях, существует простое прямое решение: слегка растяните растр вокруг его границы и выберите расширенный растр. Есть много способов сделать это, но все они требуют небольшого средства с растровыми вычислениями. Одним из самых простых является увеличение степени анализа, вычисление среднего значения и (используя 'con') вставка его значений в граничную зону NoData. Это присваивает среднее значение близлежащих растровых значений каждому местоположению вне-растровой выборки.
whuber
@whuber Другая проблема в том, что я не знаю, где находятся планировщики. Так что на самом деле в моем процессе есть 2 процедуры: определить планировщики и присвоить им значения.
увидено
Что такое "планировщик"? Если это точка, на которую не распространяется растровое значение, вы не можете не найти их: это будут точки, которые не получают никаких значений при применении 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 соответственно. Формула для этого результата

х -> мин (макс (х, х0), х1),

как вы можете видеть, рассматривая каждый из трех случаев в отдельности.

Поскольку экстент растра является декартовым произведением двух интервалов [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, за исключением границы.)

Whuber
источник
Таким образом, рабочий процесс состоит из вычисления двух полей (новых координат) в таблице исходного точечного слоя, создания слоя точечного события из этих новых координат, запуска инструмента Sample и выполнения соединения с базой данных (а не пространственного соединения). Не могли бы вы уточнить, как это сделать? (Вы можете увидеть мои фотографии для моей проблемы). Спасибо!
увидено
У меня около 15% баллов есть эта проблема. Как вы можете определить x0 и x1 для каждой точки?
увидено
1
@ После x0, y0, x1, y1 для сетки. Координаты точек (x, y) можно вычислить в Калькуляторе поля, как описано в справке ArcGIS, или в нескольких потоках на этом сайте. Существуют пункты меню для создания слоя точек XY и соединений с базой данных: это стандартные, основные операции.
whuber
4

Вы можете преобразовать растр в точки ( ref ), а затем выполнить пространственное соединение точек (от растров) до точки.

(Я только что узнал, что точки могут быть пространственно объединены здесь вчера )

djq
источник
1
+1 за умный подход. Для больших сеток, где это становится невыполнимым, конвертируйте только граничные ячейки растра в точки. (Я опишу, как в конце моего ответа.)
whuber
У меня есть тысячи ячеек каждого растрового слоя, и у меня есть 20 таких слоев ... поэтому превращение их в векторные точки отнимает много времени ...
Видно
Кроме того, когда я пытаюсь сделать растр на полигон, я получаю сообщение об ошибке как ОШИБКА 000864 Входной растр: вход находится не в заданном домене. ОШИБКА 000863: Неверный тип GP данных
посещение
Вы получаете ошибку при преобразовании растра в точки?
DJQ
@celenius Это работает, но это заняло много времени.
увидено
1

Вы можете преобразовать растровый слой в многоугольник, используя инструмент Растр в полигон, и либо запустить пространственное объединение (щелкните правой кнопкой мыши на точечном слое и выберите Соединения и взаимосвязи - Объединение, в первом раскрывающемся списке выберите параметр пространственного объединения и выберите ближайший опцию на кнопку readio), или используйте инструмент Near.

artwork21
источник
Как вы используете результат пространственного объединения для извлечения соответствующего значения растра?
whuber
@whuber, в диалоговом окне «Соединение данных», когда вы выбираете опцию «ближайший к нему», пространственное объединение выбирает ближайший объект многоугольника (результат из инструмента «Растр в многоугольник») и добавляет информацию об этом атрибуте к точечному объекту. Это то, что вы спрашивали? Мой первоначальный ответ был опубликован до его редактирования. Я предполагаю, что растр увиденного был слишком большим для преобразования в полигон?
artwork21
Идея не в том, чтобы найти ближайший растр. Действительно, то, что требуется, - это способ экстраполировать значения растра за пределы его первоначального экстента. Вопрос предлагает подход ближайшего соседа: в любой соседней точке, не входящей в растр, найдите ближайшую ячейку в растре и используйте значение этой ячейки.
whuber
Перечитывая ваш последний комментарий, вы, возможно, предлагаете превратить растр не в «многоугольник», а в слой многоугольника с одним многоугольником для каждой ячейки (или смежного набора ячеек). Если это так, он может преуспеть с очень маленькими растрами, но почему вы предлагаете это - это сложная, дорогая операция (и работает только для целочисленных сеток) - вместо аналогичного, но более эффективного решения, которое @celenius предлагало ранее? Какие преимущества предлагает ваше решение?
uber
@whuber, слой многоугольника правильный. Да, метод celenius будет стоить меньше памяти.
artwork21