выборка на основе растров

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

выборка на основе растров

Сообщение Анна » 11 мар 2006, 23:37

Есть два растра: первый растр в основном состоит из значений nodata и только около сотни имеют значение 1, второй растр - ЦМР. Из второго растра (ЦМР) нужно выбрать те ячейки, которые перекрываются с сотней ячеек растра номер один, и (!) те ячейки цмр, которые имеют теже значения, что и ячейки попадающие в перекрытие.
Кто поможет советом как такую штуку сделать, буду очень-очень благодарна (конвертацию в вектор не предлагать :) - нужен именно растр).
(PS в принципе решение есть - но не очень красивое с точки зрения атоматизации :( )

geologic
Гуру
Сообщения: 852
Зарегистрирован: 15 сен 2005, 13:19
Репутация: 6
Откуда: москва
Контактная информация:

Re: выборка на основе растров

Сообщение geologic » 13 мар 2006, 15:16

С ходу приходит на ум одно соображение: задача очень похожа по стилю на то, как делаются выборки в РБД, точнее на операции реляционной алгебры. К тому же при одинаковой дискретности грид в ней нет ни одной собственно пространственной составляющей, все можно делать через пересчет параметров X,Y,Z. Попробую изложить мысль:

Первая операция тривиальна даже в грид-алгебре, это grid12 = grid1 intersect grid2 (или что-то в этом роде, неважно).

Рассматривая grid12 как таблицу, имеем некое множество допустимых значений (получить уникальный список таких значений, т.е. сжать таблицу в РБД - дело чисто техническое). Далее имея любое множество реальных значений (а это опять-таки Grid2) мы можем его "ограничить" по Grid12: Grid3 = Grid2 join Grid12 (причем только по значению, не по XY!). Для получения окончательного результата нужно объединить - union - Grid12 и Grid3 с поглощением "лишних" значений (по XY).

Чтобы это сработало, нужно исходные гриды представить как таблицы X, Y, Z(Value), и провернуть с ними вышеописанное средствами РСУБД (сгодится Access). Первую операцию можно делать и в ГИС, но и SQL-запросом тоже легко (что-то типа "grid1 join grid2 on XY where Grid1 = 1"). Есть чувство, что это прокатит. Значения желательны целочисленные или адекватные оным: последнее, кажется, уже обсуждалось.

Подумайте, если заинтересует, могу повозиться над SQL-формулировками. Но думаю, если вам приглянется, то самим будет интересно. Мне так уже... :)

Если с точки зрения автоматизации вам не захочется покидать ГИС-среду, то стоит поискать путей превращения грида в таблицу внутри ГИС, а запросы можно сочинять и там. Хотя через РБД техничнее - многие так называемые "пространственные" задачи на деле таковыми не являются, и эффективно проходят через прямой расчет/выборку.

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Сообщение Анна » 13 мар 2006, 15:45

спасибо за отклик. по сути именно это и есть мое решение (только не выходя за пределы наших гис-пакетов - хоть arcgis, хоть arcinfo, хоть arcview - так как любой грид имеет атрибутивную таблицу - так что добавлять участие бд нет необходимости). вопрос в том, как такой процесс автоматизировать.
мое решение такое
1. выборка ячеек ЦМР перекрывающихся со вторым растром через con (conditional statement) - получаем растр3
2. Join таблиц растра3 и ЦМР
3. выделение всех строк в этой общей таблице, где значение в присоединенном столбце не равно nodata.
то есть тоже самое. но процесс полуручной. вот и интересно, можно его автоматически провести только через команды arcgis - arcinfo (пусть даже через скриптик) или нужно писать отдельный tool.

geologic
Гуру
Сообщения: 852
Зарегистрирован: 15 сен 2005, 13:19
Репутация: 6
Откуда: москва
Контактная информация:

Сообщение geologic » 14 мар 2006, 14:41

Да, уже подумал об этом. Прошу прощения за излишние подробности...

Растр ведь не совсем таблица, кажется, там в табличном виде видны не все ячейки, а лишь уникальные значения? Впрочем, на решение это не влияет, даже удобней.

К сожаленью, алгебру растров не могу попробовать, на данный момент без ArcMap... Но по восьмерке помню, что там операции друг с другом плохо состыкованы отлажено, и скрипт все равно просится в дело. Может, через modelbuilder...?

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Сообщение Анна » 14 мар 2006, 15:54

ага, ну что ж, так и думала, что надо будет дописывать. просто было любопытно, может чего упустила...
да, тоже думала про modelbuilder, но к сожалению там не все нужные операции есть, думала про arcinfo - тоже не все есть.
Спасибо geologic!
Последний раз редактировалось Анна 20 мар 2006, 21:21, всего редактировалось 1 раз.

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Сообщение Анна » 14 мар 2006, 18:00

да, маленькое добавление - два полезные команды есть - zonalrange и zonalvariety, делают почти то, что надо, но все-таки, к сожалению, не до конца.

yumakaev
Активный участник
Сообщения: 143
Зарегистрирован: 10 мар 2004, 08:07
Репутация: 10
Откуда: Redlands
Контактная информация:

Сообщение yumakaev » 14 мар 2006, 22:43

Анна, мне кажется, можно проще, без интерсект и джойн. Попробуйте выражение:

SetNull ( ^ (DEM In Con( IsNull(GridA), GridA, DEM)), DEM)

Надеюсь, цвета помогут понять логику выражения. GridA - это грид с Null/1, DEM - это ЦМР.

Нет, даже просто вот так, если я правильно понимаю логику In:

DEM In Con( IsNull(GridA), GridA, DEM)

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Сообщение Анна » 15 мар 2006, 01:51

у меня получилось тоже, что и при использование просто con, если честно :( - то есть выбраны только те ячейки которые присутствуют в GridA.
но за "наводку" спасибо - попробую поэкспериментировать.
вообще, вот вся задача целиком - нужно выбрать из ЦМР весь диапазон значений в переделах которого встречаются значения другого грида (GridA).
на примере - есть вышки (GridA) и есть цмр, нужна та часть цмр, в пределах которой встречаются вышки.

yumakaev
Активный участник
Сообщения: 143
Зарегистрирован: 10 мар 2004, 08:07
Репутация: 10
Откуда: Redlands
Контактная информация:

Сообщение yumakaev » 15 мар 2006, 02:45

Анна писал(а):нужна та часть цмр, в пределах которой встречаются вышки.
Не совсем понятно - нужна часть ЦМР вокруг вышек, или "высотные регионы" вышек?

Приведённое выше выражение должно выделять "высотные регионы" (фу, дубовый термин, но лучше на ум не приходит). Попробуйте прогнать его (выражение) по шагам, начиная "изнутри" выражения. Единственное, что там может быть "не так", это оператор IN - он может делать не то, что я понял из хелпа. Жаль, но самому мне сейчас экспериментировать некогда :(

yumakaev
Активный участник
Сообщения: 143
Зарегистрирован: 10 мар 2004, 08:07
Репутация: 10
Откуда: Redlands
Контактная информация:

Сообщение yumakaev » 15 мар 2006, 03:25

А вот так получится? {Превращаем растр в список значений?}

DEM In { Con( IsNull(GridA), GridA, DEM) }

geologic
Гуру
Сообщения: 852
Зарегистрирован: 15 сен 2005, 13:19
Репутация: 6
Откуда: москва
Контактная информация:

Сообщение geologic » 15 мар 2006, 12:03

yumakaev писал(а):можно проще, без интерсект и джойн.
Имелись в виду просто общие алгебраические термины теории множеств. Как их моделировать в конкретной ситуации нужно думать. Может In и дает INtersect в результате :) Да, если бы растры были одновременно полноценными таблицами, как в геологических пакетах, многое решалось бы проще. Уот что значит модель данных! Прошу прощения за некоторый оффтоп, но интересно следить, как развивается тема :oops: здесь и на ESRI
Последний раз редактировалось geologic 15 мар 2006, 22:46, всего редактировалось 1 раз.

yumakaev
Активный участник
Сообщения: 143
Зарегистрирован: 10 мар 2004, 08:07
Репутация: 10
Откуда: Redlands
Контактная информация:

Сообщение yumakaev » 15 мар 2006, 21:36

geologic писал(а):Имелись в виду просто общие алгебраические термины теории множеств. Как их моделировать в конкретной ситуации нужно думать. Может In и дает INtersect в результате
Ну всё-таки слово intersect имеет определённую смысловую нагрузку в ГИС, так что надо осторожнее :)

Собственно, решить поставленную задачу "через скриптик" не должно составлять ну просто никаких проблем, хоть в ArcGIS/VB, хоть в ArcView/Avenue. Я пытаюсь сообразить решение в одну строку. Анна, что-нибудь получается с преобразованием грида в список значений?

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Сообщение Анна » 15 мар 2006, 23:12

да, перепробовала все возможные комбинации, но к сожалению, не получается то, что надо. In работает таким образом, что если в скобках {} будет грид с nodata значениями, то результирующий грид будет иметь теже nodata value. Поэтому было бы здорово получить какой-то операцией внутри {} не грид, а именно список значений. пробовала например такую комбинацию
outgrid = dem in {(zonalmax(dem, gridA)),(zonalmin(dem, gridA))}
выбирает то, что надо. то есть те пикселы dem, которые "пересекаются" с минимальным значением gridA и максимальным значения gridA
теперь пробую усложнить выражение, чтобы выбрать все значения между min и max
test2 = dem in {(dem > (zonalmin(dem, gridA), (dem < (zonalmax(dem, gridA)))}
вот так уже не работает - выдает нулевую vat таблицу. вот думаю, где ошиблась.

yumakaev
Активный участник
Сообщения: 143
Зарегистрирован: 10 мар 2004, 08:07
Репутация: 10
Откуда: Redlands
Контактная информация:

Сообщение yumakaev » 15 мар 2006, 23:57

Анна писал(а):test2 = dem in {(dem > (zonalmin(dem, gridA), (dem < (zonalmax(dem, gridA)))}
вот так уже не работает - выдает нулевую vat таблицу. вот думаю, где ошиблась.
Здесь-то всё понятно - данное выражение в {} должно составлять список из двух элементов, каждый из которых содержит булевский результат (True/False, или 1/0) выполнения условий. Потом dem проверяется на наличие этих значений. Ессно, это не то, что нужно для вашей выборки.

Я надеялся (на основе примеров в хелпе), что может быть выражение {GridA} сделает список значений, имеющихся в ГридА, но, очевидно, напрасно.

Короче, я бы рекомендовал состряпать коротенький скрипт для решения проблемы. Можно взять за основу например вот: http://forums.esri.com/Thread.asp?c=3&f=39&t=161782

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Сообщение Анна » 16 мар 2006, 00:06

ок, по-любому спасибо огромное за помощь!!!! если вдруг удастся найти решение в одну строчку - обязательно "отпостую"
Спасибо!

Ответить

Вернуться в «Общий - ПО»

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей