Точки экстремума из srtm в GRASS?
- gimran
- Гуру
- Сообщения: 1902
- Зарегистрирован: 07 июл 2010, 15:43
- Репутация: 242
- Откуда: Уфа
Точки экстремума из srtm в GRASS?
Здравствуйте!
Как получить изолинии из srtm в GRASS понятно, а вот как получить точки вершин и точки низин из srtm?
Подскажите, пожалуйста, где в мануале искать.
Как получить изолинии из srtm в GRASS понятно, а вот как получить точки вершин и точки низин из srtm?
Подскажите, пожалуйста, где в мануале искать.
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Точки экстремума из srtm в GRASS?
Спец.модуля для подобных изысканий в составе GRASS для нет.
Но: есть старый скрипт <r.localmax>, написанный когда-то Jachym Cepicky на Perl, который находит локальный максимум для растра (т.е., по идее, вершины).
Вот сам модуль: Работает так:
, где после "-i" идёт имя ЦМР, после "-o" — имя выходного растра; после "-m" — размер матрицы в ячейках (только нечётные числа).
На выходе команда для <r.mapcalc>, которую ему надо подсунуть (чем больше размер матрицы, тем больше размер команды и тем реже в итоге будут точки).
------------------------------------------------------------------------
Пример получения вершин для набора данных Spearfish:
1)
2) Подсовываем команду <r.mapcalc>:
3) Векторизуем точечный растр:
4) Если надо, получаем высоты для точек.
Сначала добавляем новое поле "z" в таблицу атрибутов:
Добавляем в атрибуты высоты с ЦМР:
Итог:
Но: есть старый скрипт <r.localmax>, написанный когда-то Jachym Cepicky на Perl, который находит локальный максимум для растра (т.е., по идее, вершины).
Вот сам модуль: Работает так:
Код: Выделить всё
r.localmax -i dem -o dem.localmax -m 5
На выходе команда для <r.mapcalc>, которую ему надо подсунуть (чем больше размер матрицы, тем больше размер команды и тем реже в итоге будут точки).
------------------------------------------------------------------------
Пример получения вершин для набора данных Spearfish:
1)
Код: Выделить всё
r.localmax -i elevation.10m -o localmax -m 9
localmax = if(elevation.10m == max(elevation.10m[-4,-4],elevation.10m[-4,-3],elevation.10m[-4,-2],elevation.10m[-4,-1],elevation.10m[-4,0],elevation.10m[-4,1],elevation.10m[-4,2],elevation.10m[-4,3],elevation.10m[-4,4],elevation.10m[-3,-4],elevation.10m[-3,-3],elevation.10m[-3,-2],elevation.10m[-3,-1],elevation.10m[-3,0],elevation.10m[-3,1],elevation.10m[-3,2],elevation.10m[-3,3],elevation.10m[-3,4],elevation.10m[-2,-4],elevation.10m[-2,-3],elevation.10m[-2,-2],elevation.10m[-2,-1],elevation.10m[-2,0],elevation.10m[-2,1],elevation.10m[-2,2],elevation.10m[-2,3],elevation.10m[-2,4],elevation.10m[-1,-4],elevation.10m[-1,-3],elevation.10m[-1,-2],elevation.10m[-1,-1],elevation.10m[-1,0],elevation.10m[-1,1],elevation.10m[-1,2],elevation.10m[-1,3],elevation.10m[-1,4],elevation.10m[0,-4],elevation.10m[0,-3],elevation.10m[0,-2],elevation.10m[0,-1],elevation.10m[0,0],elevation.10m[0,1],elevation.10m[0,2],elevation.10m[0,3],elevation.10m[0,4],elevation.10m[1,-4],elevation.10m[1,-3],elevation.10m[1,-2],elevation.10m[1,-1],elevation.10m[1,0],elevation.10m[1,1],elevation.10m[1,2],elevation.10m[1,3],elevation.10m[1,4],elevation.10m[2,-4],elevation.10m[2,-3],elevation.10m[2,-2],elevation.10m[2,-1],elevation.10m[2,0],elevation.10m[2,1],elevation.10m[2,2],elevation.10m[2,3],elevation.10m[2,4],elevation.10m[3,-4],elevation.10m[3,-3],elevation.10m[3,-2],elevation.10m[3,-1],elevation.10m[3,0],elevation.10m[3,1],elevation.10m[3,2],elevation.10m[3,3],elevation.10m[3,4],elevation.10m[4,-4],elevation.10m[4,-3],elevation.10m[4,-2],elevation.10m[4,-1],elevation.10m[4,0],elevation.10m[4,1],elevation.10m[4,2],elevation.10m[4,3],elevation.10m[4,4]),1,null())
Код: Выделить всё
r.mapcalc 'localmax = if(elevation.10m == max(elevation.10m[-4,-4],elevation.10m[-4,-3],elevation.10m[-4,-2],elevation.10m[-4,-1],elevation.10m[-4,0],elevation.10m[-4,1],elevation.10m[-4,2],elevation.10m[-4,3],elevation.10m[-4,4],elevation.10m[-3,-4],elevation.10m[-3,-3],elevation.10m[-3,-2],elevation.10m[-3,-1],elevation.10m[-3,0],elevation.10m[-3,1],elevation.10m[-3,2],elevation.10m[-3,3],elevation.10m[-3,4],elevation.10m[-2,-4],elevation.10m[-2,-3],elevation.10m[-2,-2],elevation.10m[-2,-1],elevation.10m[-2,0],elevation.10m[-2,1],elevation.10m[-2,2],elevation.10m[-2,3],elevation.10m[-2,4],elevation.10m[-1,-4],elevation.10m[-1,-3],elevation.10m[-1,-2],elevation.10m[-1,-1],elevation.10m[-1,0],elevation.10m[-1,1],elevation.10m[-1,2],elevation.10m[-1,3],elevation.10m[-1,4],elevation.10m[0,-4],elevation.10m[0,-3],elevation.10m[0,-2],elevation.10m[0,-1],elevation.10m[0,0],elevation.10m[0,1],elevation.10m[0,2],elevation.10m[0,3],elevation.10m[0,4],elevation.10m[1,-4],elevation.10m[1,-3],elevation.10m[1,-2],elevation.10m[1,-1],elevation.10m[1,0],elevation.10m[1,1],elevation.10m[1,2],elevation.10m[1,3],elevation.10m[1,4],elevation.10m[2,-4],elevation.10m[2,-3],elevation.10m[2,-2],elevation.10m[2,-1],elevation.10m[2,0],elevation.10m[2,1],elevation.10m[2,2],elevation.10m[2,3],elevation.10m[2,4],elevation.10m[3,-4],elevation.10m[3,-3],elevation.10m[3,-2],elevation.10m[3,-1],elevation.10m[3,0],elevation.10m[3,1],elevation.10m[3,2],elevation.10m[3,3],elevation.10m[3,4],elevation.10m[4,-4],elevation.10m[4,-3],elevation.10m[4,-2],elevation.10m[4,-1],elevation.10m[4,0],elevation.10m[4,1],elevation.10m[4,2],elevation.10m[4,3],elevation.10m[4,4]),1,null())'
Код: Выделить всё
GRASS 6.4.3svn (spearfish60):~/bin > r.to.vect in=localmax out=localmax feat=point
Сначала добавляем новое поле "z" в таблицу атрибутов:
Код: Выделить всё
v.db.addcol localmax col="z double"
Добавляем в атрибуты высоты с ЦМР:
Код: Выделить всё
v.what.rast vector=localmax raster=elevation.10m column=z
Редактор материалов, модератор форума
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: Точки экстремума из srtm в GRASS?
Насчёт локальных минимумов ЦМР: если заменить в выложенном выше скрипте все "max" на "min", то можно вытащить некое подобие минимумов
Пример: На картинках видны недостатки этого способа: на расчленённых участках точек много, на ровных — мало. Сделать сеть точек более равномерной можно, видимо, использованием минимального размера матрицы (3) и последующей фильтрацией точек.
-------------------------------------------------------------------------------
P.S. в одну строку пункты №1 и №2 из поста выше выглядят так (в Linux+bash):
Пример: На картинках видны недостатки этого способа: на расчленённых участках точек много, на ровных — мало. Сделать сеть точек более равномерной можно, видимо, использованием минимального размера матрицы (3) и последующей фильтрацией точек.
-------------------------------------------------------------------------------
P.S. в одну строку пункты №1 и №2 из поста выше выглядят так (в Linux+bash):
Код: Выделить всё
r.mapcalc "$(r.localmax -i elevation.10m -o localmin -m 9)"
Редактор материалов, модератор форума
- gimran
- Гуру
- Сообщения: 1902
- Зарегистрирован: 07 июл 2010, 15:43
- Репутация: 242
- Откуда: Уфа
Re: Точки экстремума из srtm в GRASS?
Спасибо! Попытаюсь установить и изучить.
-
- Гуру
- Сообщения: 4067
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1062
- Ваше звание: программист
- Откуда: Казань
Re: Точки экстремума из srtm в GRASS?
а локальное направление потока по D8 там есть? ну тогда "низины" (pit) - это точки, в которых потока нет. А вершины - это низины на минус-рельефе (умножить его на -1)Александр Мурый писал(а):Спец.модуля для подобных изысканий в составе GRASS для нет.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость