У меня есть два слоя в ArcGIS: один - векторная точка, а другой - растровый слой. Я хочу добавить значение сетки растровых данных к точке вектора. Проблема в том, что векторная точка удалена от любых существующих растровых сеток со значением, поэтому команда «Образец» не возвращает значения для этой векторной точки.
Итак, мой вопрос: как мне найти ближайшую растровую ячейку по заданной точке вектора и извлечь значение из ячейки?
На самом деле мне нужно сделать две вещи:
- Идентифицируйте outliner в рейнджере (обычно 1-2 ячейки от моего существующего растра)
- Присвойте им значение из ближайшего растра, если они находятся в диапазоне
Отредактировано: у меня есть около 3000 векторных точек, и моя проблема заключается в следующем:
Мне нужно добавить растровое значение на основе местоположения к векторным точкам. Я использовал инструмент «Образец», и он хорошо работает для большинства пунктов.
Тем не менее, есть такая ситуация
Правая точка может получить значение из растра (работает «Образец»), но левая точка не может из-за проблем с выравниванием.
Растр в полигон не работает, потому что я получаю сообщение об ошибке, что не могу превратить их в вектор, потому что они находятся вне домена. Также у меня есть очки, как это
Эти верхние точки не должны получать никаких значений, потому что они находятся слишком далеко от растра.
Я думал о некоторых способах обойти:
Шаг 1. Сделайте «образец» первым
Шаг 2. Выберите нулевое значение после «образца» операции
Шаг 3. Построить буферные зоны (в пределах 1 десятичного градуса) на основе нулевых точек
Шаг 4. Использовать зональную статистику ? или другие инструменты, чтобы перебрать все растровые ячейки в буфере, найти ближайшую, извлечь ее значение и поместить в векторную точку.
Я застрял на шаге 4. Я не знаю, какой инструмент в ArcSDK я могу использовать для достижения этой функции.
Или еще ... У вас есть идея с этим справиться?
У меня есть 20 таких растровых слоев, и я хотел бы сделать это автоматически (используя построитель моделей и arcobject).
Sample
инструмента.Ответы:
Контур растра занимает прямоугольник, ограниченный в левом нижнем углу источником, имеющий координаты (скажем) (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, за исключением границы.)
источник
Вы можете преобразовать растр в точки ( ref ), а затем выполнить пространственное соединение точек (от растров) до точки.
(Я только что узнал, что точки могут быть пространственно объединены здесь вчера )
источник
Вы можете преобразовать растровый слой в многоугольник, используя инструмент Растр в полигон, и либо запустить пространственное объединение (щелкните правой кнопкой мыши на точечном слое и выберите Соединения и взаимосвязи - Объединение, в первом раскрывающемся списке выберите параметр пространственного объединения и выберите ближайший опцию на кнопку readio), или используйте инструмент Near.
источник