[GRASS/Советы] Добавление таблицы атрибутов
Добавлено: 15 окт 2008, 11:37
Как и все ГИС, GRASS поддерживает связь пространственных объектов с аттрибутивными данными, однако, в отличие от многих ГИС, GRASS позволяет связать с объектами не одну атрибутивную таблицу, а несколько. Это удобно, например, когда атрибуты делятся на логически непересекающиеся подмножества, и в этом случае лучше разделить данные на несколько таблиц, чем работать с одной большой таблицей.
Последовательность действий при добавлении таблицы:
Создаем таблицу, например, состоящую из колонок cat,x,y,flamo:
Проверяем, что таблица создана:
среди показанного списка должна быть таблица pnts_coord.
Однако, мало создать таблицу -- нужно еще добавить идентификаторы объектов в созданную таблицу (GRASS связывает каждый объект с соответствующей записью в таблице при помощи идентификаторов -- чисел, которые должны совпадать у объекта и у записи таблицы). По умолчанию, идентификаторы, по которым производится связывание, хранятся в поле "cat" таблицы атрибутов.
Идентификаторы к объектам можно узнать, например, используя команду v.out.ascii:
Результат:
Добавим в созданную таблицу записи, у которых в поле cat будут прописаны соответствующие идентификаторы объектов pnts:
в результате в таблицу pnts_coord будут добавлены записи содержащие в поле cat идентификаторы объектов. Однако, тут есть тонкое место: не исключено, что некоторые пространственные объекты относятся к одной и той же категории (с формальной точки зрения -- имеют однаковые идентификаторы), поэтому перед добавлением зписей в таблицу нужно предварительно избавиться от повторяющихся идентификаторов. Поэтому, если нет уверенности, что все объекты носят разные идентификаторы, использование следующей команды будет более разумно:
И, наконец, присоединяем таблицу:
В результате таблица станет текущей, т.е. все выборки и изменения будут производиться для этой таблицы. При необходимости можно будет, используя ту же команду v.db.connect, переподключиться другой таблице (например, исходной).
См.
db.execute
db.tables
v.out.ascii
v.db.connect
man cut
man sort
Последовательность действий при добавлении таблицы:
Создаем таблицу, например, состоящую из колонок cat,x,y,flamo:
Код: Выделить всё
echo "create table pnts_coord (cat int,x double,y double ,flamo int)" | db.execute
Код: Выделить всё
db.tables -p
Однако, мало создать таблицу -- нужно еще добавить идентификаторы объектов в созданную таблицу (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
Код: Выделить всё
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
См.
db.execute
db.tables
v.out.ascii
v.db.connect
man cut
man sort