цикл по точкам (из презентации "Знакомство с GRASS" )

Ответить
xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение xen87 » 27 ноя 2012, 22:59

Здравствуйте, уважаемые ГРАССоведы :-)
По стопам прошедшей конференции пытаюсь выполнить все пункты презентации "Знакомство с 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)
Заранее большое спасибо!!!

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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).

Код: Выделить всё

i=$(expr $i+1)
Очень надеюсь, что мануалы к модулям тоже читаются вместе с презентацией.

Если что не так написал, Дима поправит :)
Редактор материалов, модератор форума

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение KolesovDmitry » 28 ноя 2012, 08:05

У меня пара небольших поясняющих замечаний к тому, что написал amuriy.
Координаты точек у вас могут отличаться, поскольку точки получены путем векторизации. Их координаты можно определить командой v.out.ascii.
Если вы работаете не *nix системе, а, например, в windows, то вам нужно использовать для создания цикла синтаксические конструкции вашей системы.

[ Сообщение с мобильного устройства ]

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение Александр Мурый » 28 ноя 2012, 08:16

KolesovDmitry писал(а): Если вы работаете не *nix системе, а, например, в windows, то вам нужно использовать для создания цикла синтаксические конструкции вашей системы.
А ещё лучше питон :)
Редактор материалов, модератор форума

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение xen87 » 30 ноя 2012, 09:55

Добрый день, большое спасибо всем за пояснение и замечания к коду. Ваши советы мне помогли понять "физический" смысл алгоритма кода.
Очень надеюсь, что мануалы к модулям тоже читаются вместе с презентацией.
, мануалы читаются, тяжко правда, но а кому сейчас легко :-)
А ещё лучше питон :-)
, решил попробовать, прошу не судить строго, т.к. не силен я в этом ...

Код: Выделить всё

# формируем список координат по 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')
Все вроде работает.
При желании можно считывать список координат точек из файла, затем формировать список и брать данные из него ...
И еще раз спасибо!!!

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение Voltron » 30 ноя 2012, 10:31

Можно было бы и одним списком обойтись. Проще и легче читается

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение KolesovDmitry » 30 ноя 2012, 11:21

Как пишет 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')

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение xen87 » 30 ноя 2012, 12:30

Voltron, большое спасибо за мысль :-)
KolesovDmitry, большое спасибо за развернутый ответ, я понял идею v.out.ascii -> файл коорд. -> считывание+обработка -> вывод в список (list) -> использование координат в коде

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение KolesovDmitry » 30 ноя 2012, 13:12

xen87 писал(а):я понял идею v.out.ascii -> файл коорд. -> считывание+обработка -> вывод в список (list) -> использование координат в коде
Да, только файл с координатами не обязателен -- можно передавать вывод одной команды на вход другой при помощи каналов. Использование вывода результатов работы одной программы в другой можно посмотреть в документации Python. Тут, в разделе реализация, есть пример такого использования в GRASS

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение xen87 » 30 ноя 2012, 20:17

Да, только файл с координатами не обязателен -- можно передавать вывод одной команды на вход другой при помощи каналов.
- питон и так может :shock:
Спасибо за ссылку и просвещение, буду работать и разбираться дальше :-)

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение Voltron » 01 дек 2012, 11:13

xen87 писал(а):питон и так может :shock:
Любая вменяемая система умеет пайпы

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

Re: цикл по точкам (из презентации "Знакомство с GRASS" )

Сообщение xen87 » 04 дек 2012, 21:53

Попробовал разобраться в "пайпах".
Что-то получилось:

Код: Выделить всё

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')
Спасибо большое за советы и подсказки!!!

Ответить

Вернуться в «GRASS»

Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot] и 41 гость