Страница 1 из 1
цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 27 ноя 2012, 22:59
xen87
Здравствуйте, уважаемые ГРАССоведы

По стопам прошедшей конференции пытаюсь выполнить все пункты презентации "Знакомство с GRASS"
Сейчас застрял на 42 слайде.
Пояснить пожалуйста вот этот код:
Код: Выделить всё
i=1
for coords in 363208.01009116 ,6233222.93525224 \
364740.86786043 ,6229892.28133384 \
359215.01022308 ,6225993.90231572 \
360880.33718228 ,6226429.15822551 \
361031.73054221 ,6226694.09660538
do
r.cost -k in=cost out=p$i coord=$coords --o
r.drain input=p$i output=r$i vector points=poi --o
i=$(expr $i+1)
Заранее большое спасибо!!!
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 28 ноя 2012, 00:02
Александр Мурый
Здесь имеем цикл со счётчиком на языке командного интерпретатора (в Linux это в основном bash).
- Запускаем счётчик:
- Начало цикла (для выбранных нами пяти точек с координатами "долгота,широта", сделать):
Код: Выделить всё
for coords in 363208.01009116 ,6233222.93525224 \
364740.86786043 ,6229892.28133384 \
359215.01022308 ,6225993.90231572 \
360880.33718228 ,6226429.15822551 \
361031.73054221 ,6226694.09660538
do
- Тело цикла (повторяющиеся действия для каждой точки, а именно создание стоимостной поверхности (r.cost) и расчёт кратчайшего пути по этой поверхности от начальной точки "poi", оцифрованной на слайде 39 (r.drain).
Код: Выделить всё
r.cost -k in=cost out=p$i coord=$coords --o
r.drain input=p$i output=r$i vector_points=poi --o
- В имена выходных карт выше подставляются значения переменной
i, которая увеличивает значение на единицу с каждым повторением цикла (с 1 до 5).
Очень надеюсь, что мануалы к модулям тоже читаются вместе с презентацией.
Если что не так написал, Дима поправит

Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 28 ноя 2012, 08:05
KolesovDmitry
У меня пара небольших поясняющих замечаний к тому, что написал amuriy.
Координаты точек у вас могут отличаться, поскольку точки получены путем векторизации. Их координаты можно определить командой v.out.ascii.
Если вы работаете не *nix системе, а, например, в windows, то вам нужно использовать для создания цикла синтаксические конструкции вашей системы.
[ Сообщение с мобильного устройства ]
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 28 ноя 2012, 08:16
Александр Мурый
KolesovDmitry писал(а):
Если вы работаете не *nix системе, а, например, в windows, то вам нужно использовать для создания цикла синтаксические конструкции вашей системы.
А ещё лучше питон

Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 30 ноя 2012, 09:55
xen87
Добрый день, большое спасибо всем за пояснение и замечания к коду. Ваши советы мне помогли понять "физический" смысл алгоритма кода.
Очень надеюсь, что мануалы к модулям тоже читаются вместе с презентацией.
, мануалы читаются, тяжко правда, но а кому сейчас легко
А ещё лучше питон
, решил попробовать, прошу не судить строго, т.к. не силен я в этом ...
Код: Выделить всё
# формируем список координат по X
coord_x=[359958.48166882,361002.68521462,361173.35252512,362329.55216218, 362881.86894458, 364073.55958294, 368786.16759099]
# формируем список координат по Y
coord_y=[6227044.0076194, 6227013.42609976, 6226304.66885629, 6231192.23066216, 6232940.15028171, 6226675.16386736, 6226616.7088923]
# сам цикл на питоне
for i in range(7):
grass.run_command('r.cost', input='cost_7', output='p'+str(i), coordinate=(str(coord_x[i]),str(coord_y[i])))
grass.run_command('r.drain', input='p'+str(i), output='r'+str(i), coordinate=(str(coord_x[i]),str(coord_y[i])), vector_points='settlement_clip')
Все вроде работает.
При желании можно считывать список координат точек из файла, затем формировать список и брать данные из него ...
И еще раз спасибо!!!
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 30 ноя 2012, 10:31
Voltron
Можно было бы и одним списком обойтись. Проще и легче читается
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 30 ноя 2012, 11:21
KolesovDmitry
Как пишет Voltron, проще будет если создать один список с координатами (тем более, что v.out.ascii выдает координаты именно в виде одного списка -- потребуется минимальная обработка). Т.е. в результате получится что-то типа такого (только идея, синтаксис не выверял):
Код: Выделить всё
# формируем список координат
coord= ["363187.53112033,6233178.85892116",
"364493.09128631,6230397.44813278",
"359081.63900415,6226140.18672199",
"361295.41493776,6226802.42738589",
"363490.26970954,6227502.51037344"]
# сам цикл на питоне
for i in range(7):
grass.run_command('r.cost', input='cost_7', output='p'+str(i), coordinate=coord[i] )
grass.run_command('r.drain', input='p'+str(i), output='r'+str(i), coordinate=coord[i]), vector_points='settlement_clip')
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 30 ноя 2012, 12:30
xen87
Voltron, большое спасибо за мысль

KolesovDmitry, большое спасибо за развернутый ответ, я понял идею v.out.ascii -> файл коорд. -> считывание+обработка -> вывод в список (list) -> использование координат в коде
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 30 ноя 2012, 13:12
KolesovDmitry
xen87 писал(а):я понял идею v.out.ascii -> файл коорд. -> считывание+обработка -> вывод в список (list) -> использование координат в коде
Да, только файл с координатами не обязателен -- можно передавать вывод одной команды на вход другой при помощи каналов. Использование вывода результатов работы одной программы в другой можно посмотреть в документации Python.
Тут, в разделе реализация, есть пример такого использования в GRASS
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 30 ноя 2012, 20:17
xen87
Да, только файл с координатами не обязателен -- можно передавать вывод одной команды на вход другой при помощи каналов.
- питон и так может
Спасибо за ссылку и просвещение, буду работать и разбираться дальше

Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 01 дек 2012, 11:13
Voltron
xen87 писал(а):питон и так может

Любая вменяемая система умеет пайпы
Re: цикл по точкам (из презентации "Знакомство с GRASS" )
Добавлено: 04 дек 2012, 21:53
xen87
Попробовал разобраться в "пайпах".
Что-то получилось:
Код: Выделить всё
poi = grass.pipe_command('v.out.ascii', input='settlement_clip', fs=';')
for line in poi.stdout:
result.append([float(a) for a in line.strip().split(';')])
poi.wait()
print result # надо же проверить содержимое списка, но если уверен, то это не обязательно :-)
# а дальше наш знакомый цикл, только обращение к координатам чуть-чуть поправить
for i in range(len(result)):
grass.run_command('r.cost', input='cost_7', output='P'+str(i), coordinate=(str(result[i][0]),str(result[i][1])))
grass.run_command('r.drain', input='P'+str(i),output='R'+str(i), coordinate=(str(result[i][0]),str(result[i][1])), vector_points='settlement_clip')
Спасибо большое за советы и подсказки!!!