Страница 1 из 2
Удаление колонок таблицы атрибутов для нескольких слоёв
Добавлено: 14 дек 2012, 01:03
HasT
Приветствую! Есть шейп-слой со следующей структурой таблицы атрибутов:
![layer.jpg](./download/file.php?id=5584&sid=12ee0248bffe1f8f1d4bd7bff6be6df3)
- layer.jpg (59.68 КБ) 14121 просмотр
- название объекта, уникальный номер для каждого объекта слоя
Необходимо разбить шейп-слой по "названию объекта", но в результирующих слоях в таблице атрибутов должна остаться только колонка с "порядковым номером":
![result.jpg](./download/file.php?id=5582&sid=12ee0248bffe1f8f1d4bd7bff6be6df3)
- 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, но в строке
получил ошибку "колонка "geom" не существует", - заменил "geom" на "the_geom". Далее в строке
получаю ошибку "колонка "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". При запуске запроса
получаю ошибку "отношение "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 здесь - это любая запись из списка ваших таблиц.
А вообще, почитайте
это.