Страница 1 из 1

[GRASS/Советы] Добавление таблицы атрибутов

Добавлено: 15 окт 2008, 11:37
KolesovDmitry
Как и все ГИС, GRASS поддерживает связь пространственных объектов с аттрибутивными данными, однако, в отличие от многих ГИС, GRASS позволяет связать с объектами не одну атрибутивную таблицу, а несколько. Это удобно, например, когда атрибуты делятся на логически непересекающиеся подмножества, и в этом случае лучше разделить данные на несколько таблиц, чем работать с одной большой таблицей.

Последовательность действий при добавлении таблицы:

Создаем таблицу, например, состоящую из колонок cat,x,y,flamo:

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

echo "create table pnts_coord (cat int,x double,y double ,flamo int)" | db.execute
Проверяем, что таблица создана:

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

db.tables -p
среди показанного списка должна быть таблица pnts_coord.

Однако, мало создать таблицу -- нужно еще добавить идентификаторы объектов в созданную таблицу (GRASS связывает каждый объект с соответствующей записью в таблице при помощи идентификаторов -- чисел, которые должны совпадать у объекта и у записи таблицы). По умолчанию, идентификаторы, по которым производится связывание, хранятся в поле "cat" таблицы атрибутов.
Идентификаторы к объектам можно узнать, например, используя команду v.out.ascii:

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

v.out.ascii pnts
Результат:
46.22599554|45.15012522|1
44.75096359|46.06735923|2
45.58276768|44.72287613|3
44.28656638|46.12159521|4
...
здесь первые два поля -- координаты, а третье поле -- идентификаторы

Добавим в созданную таблицу записи, у которых в поле cat будут прописаны соответствующие идентификаторы объектов pnts:

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

for id in `v.out.ascii pnts | cut -d\| -f3`
  do echo 'insert into pnts_coord (cat) values' \($id\) | db.execute 
done
в результате в таблицу pnts_coord будут добавлены записи содержащие в поле cat идентификаторы объектов. Однако, тут есть тонкое место: не исключено, что некоторые пространственные объекты относятся к одной и той же категории (с формальной точки зрения -- имеют однаковые идентификаторы), поэтому перед добавлением зписей в таблицу нужно предварительно избавиться от повторяющихся идентификаторов. Поэтому, если нет уверенности, что все объекты носят разные идентификаторы, использование следующей команды будет более разумно:

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

for id in `v.out.ascii pnts | cut -d\| -f3 | sort -un`
  do echo 'insert into pnts_coord (cat) values' \($id\) | db.execute 
done
И, наконец, присоединяем таблицу:

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

v.db.connect -o map=pnts table=pnts_coord
В результате таблица станет текущей, т.е. все выборки и изменения будут производиться для этой таблицы. При необходимости можно будет, используя ту же команду v.db.connect, переподключиться другой таблице (например, исходной).

См.
db.execute
db.tables
v.out.ascii
v.db.connect

man cut
man sort