Удаление колонок таблицы атрибутов для нескольких слоёв

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 01:03

Приветствую! Есть шейп-слой со следующей структурой таблицы атрибутов:
layer.jpg
layer.jpg (59.68 КБ) 14007 просмотров
- название объекта, уникальный номер для каждого объекта слоя
Необходимо разбить шейп-слой по "названию объекта", но в результирующих слоях в таблице атрибутов должна остаться только колонка с "порядковым номером":
result.jpg
result.jpg (50.97 КБ) 14007 просмотров
Разбитие слоя по "названию объекта" сделал в QGIS (Вектор - Управление данными - Разбить векторный слой), удаление "лишнего текста" в названии файлов удалил через коммандер. Как удалить в наборе шейп-слоев из таблицы атрибутов определённую колонку (перебор каждого слоя не предлагать, очень много их...)? Софт: ArcGIS, QGIS, PostGIS, OGR... Спасибо!

Petruxin
Гуру
Сообщения: 1695
Зарегистрирован: 14 июн 2011, 16:47
Репутация: 133
Ваше звание: Завсегдатай
Откуда: Череповец

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение Petruxin » 14 дек 2012, 05:51

Доп модуль Table Manager пробовали?

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение rhot » 14 дек 2012, 07:28

В PostGIS:

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

CREATE TABLE new AS
	SELECT number, ST_Multi(ST_Collect(the_geom))
		FROM 
			(SELECT name, number, (ST_Dump(geom)).geom AS the_geom
				FROM region) AS r
		GROUP BY name;
SELECT Populate_Geometry_Columns('new'::regclass);
Вместо ST_Collect можно использовать ST_Union, если хотите, чтобы удалились общие границы между полигонами с одинаковым полем NAME.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 10:56

Petruxin писал(а):Доп модуль Table Manager пробовали?
Table Manager не подходит. С ним нужно каждый слой (слоёв будет не менее 700) просматривать и удалять ненужное поле.

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 11:05

rhot писал(а):В PostGIS:

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

CREATE TABLE new AS
	SELECT number, ST_Multi(ST_Collect(the_geom))
		FROM 
			(SELECT name, number, (ST_Dump(geom)).geom AS the_geom
				FROM region) AS r
		GROUP BY name;
SELECT Populate_Geometry_Columns('new'::regclass);
Вместо ST_Collect можно использовать ST_Union, если хотите, чтобы удалились общие границы между полигонами с одинаковым полем NAME.
Запустил данный запрос в pgAdmin, но в строке

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

(ST_Dump(geom))
получил ошибку "колонка "geom" не существует", - заменил "geom" на "the_geom". Далее в строке

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

SELECT number, 
получаю ошибку "колонка "r.number" должна фигурировать в предложении GROUP BY или использоваться в агрегатной функции". Как быть дальше?

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение rhot » 14 дек 2012, 11:15

HasT писал(а):Как быть дальше?
Я вас, наверное, не правильно понял. Вы хотите из одного слоя получить несколько, разбитых по полю NAME?
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 11:18

rhot писал(а):
HasT писал(а):Как быть дальше?
Я вас, наверное, не правильно понял. Вы хотите из одного слоя получить несколько, разбитых по полю NAME?
Да. Нужно из одного слоя сделать несколько, разбитых по полю Name, при этом в новых слоях не должно остаться поля Name.

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 11:33

В базу данных PostGIS залил все разбитые слои по полю Name. Может как-то используя запрос

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

ALTER TABLE [u]"все таблицы"[/u] DROP COLUMN "NAME";
можно удалить ненужное поле? только как задать все таблицы в базе для этого запроса?...

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение rhot » 14 дек 2012, 11:35

Тогда у меня ещё вопрос: а зачем это надо? Ведь можно при добавлении слоя сделать выборку по атрибутам, а само поле name скрыть через меню "свойства слоя".
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение rhot » 14 дек 2012, 11:43

HasT писал(а):В базу данных PostGIS залил все разбитые слои по полю Name. Может как-то используя запрос

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

ALTER TABLE [u]"все таблицы"[/u] DROP COLUMN "NAME";
можно удалить ненужное поле? только как задать все таблицы в базе для этого запроса?...
Вам следует создать функцию, а потом вызвать её.

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

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN 
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        ALTER TABLE my_row.table_name DROP COLUMN "NAME";
    END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT test();
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 11:52

rhot писал(а):Тогда у меня ещё вопрос: а зачем это надо? Ведь можно при добавлении слоя сделать выборку по атрибутам, а само поле name скрыть через меню "свойства слоя".
слой создается в БД несколькими пользователями, затем будет производится дальнейшая его "обработка" несколькими операторами в проприетарном ПО, которое загружает слои только с определенной таблицей атрибутов

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 12:40

rhot писал(а):Вам следует создать функцию, а потом вызвать её.

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

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN 
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        ALTER TABLE my_row.table_name DROP COLUMN "NAME";
    END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT test();
Сделал функцию test(), только из-за ошибки "схема "my_row" не существует" поменял "my_row" на "public". При запуске запроса

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

SELECT test();
получаю ошибку "отношение "public.table_name" не существует". Что я делаю неправильно?

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение rhot » 14 дек 2012, 13:04

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

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        EXECUTE 'ALTER TABLE' || my_row.table_name || 'DROP COLUMN "NAME"';
    END LOOP;
END;
$$ LANGUAGE plpgsql;
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

HasT
Активный участник
Сообщения: 142
Зарегистрирован: 16 окт 2009, 22:08
Репутация: 55
Откуда: Харьков

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение HasT » 14 дек 2012, 13:20

rhot писал(а):

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

CREATE OR REPLACE FUNCTION test()
RETURNS VOID
AS $$
DECLARE
    my_row    RECORD;
BEGIN       
    FOR my_row IN
        SELECT table_name
        FROM   information_schema.tables
        WHERE  table_schema = 'information_schema'
    LOOP
        EXECUTE 'ALTER TABLE' || my_row.table_name || 'DROP COLUMN "NAME"';
    END LOOP;
END;
$$ LANGUAGE plpgsql;
Пробую этот запрос... my_row - это же название схемы (у меня схема public)?
Для запроса получаю ошибку

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

ОШИБКА:  ошибка синтаксиса (примерное положение: "TABLEinformation_schema_catalog_nameDROP")
LINE 1: ALTER TABLEinformation_schema_catalog_nameDROP COLUMN "Polyg...
              ^
QUERY:  ALTER TABLEinformation_schema_catalog_nameDROP COLUMN "PolygonID"
CONTEXT:  PL/pgSQL function test() line 10 at оператор EXECUTE
И в базе сейчас загружены слои разбитые по полю Name, правильно?

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Удаление колонок таблицы атрибутов для нескольких слоёв

Сообщение rhot » 14 дек 2012, 13:35

my_row здесь - это любая запись из списка ваших таблиц.

А вообще, почитайте это.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

Ответить

Вернуться в «Общие вопросы»

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

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