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

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

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

Сообщение KolesovDmitry » 15 окт 2008, 11:37

Как и все ГИС, 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

Ответить

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

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

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