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

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

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

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

Добавлено: 14 дек 2012, 05:51
Petruxin
Доп модуль Table Manager пробовали?

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

Добавлено: 14 дек 2012, 07:28
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.

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

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

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

Добавлено: 14 дек 2012, 11:05
HasT
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 или использоваться в агрегатной функции". Как быть дальше?

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

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

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

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

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

Добавлено: 14 дек 2012, 11:33
HasT
В базу данных PostGIS залил все разбитые слои по полю Name. Может как-то используя запрос

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

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

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

Добавлено: 14 дек 2012, 11:35
rhot
Тогда у меня ещё вопрос: а зачем это надо? Ведь можно при добавлении слоя сделать выборку по атрибутам, а само поле name скрыть через меню "свойства слоя".

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

Добавлено: 14 дек 2012, 11:43
rhot
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();

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

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

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

Добавлено: 14 дек 2012, 12:40
HasT
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" не существует". Что я делаю неправильно?

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

Добавлено: 14 дек 2012, 13:04
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;

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

Добавлено: 14 дек 2012, 13:20
HasT
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, правильно?

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

Добавлено: 14 дек 2012, 13:35
rhot
my_row здесь - это любая запись из списка ваших таблиц.

А вообще, почитайте это.