Добавление дополнительного столбца геометрии в PostGIS?
10
Я импортирую множество наборов геоданных в PostGIS, и они имеют разные SRID. (У некоторых есть EPSG:3857, у EPSG:4326некоторых что-то еще).
Я хотел бы создать дополнительный geometry column, например. the_geom_mercatorс SRIDEPSG:3857, а также сохраните исходную geomколонку в том виде, в каком SRIDона была.
который может быть заполнен из другого столбца (the_geom) с помощью:
UPDATE my_table SET
the_geom_mercator = ST_Transform(the_geom,3857)FROM spatial_ref_sys
WHERE ST_SRID(the_geom)= srid;
(третья строка FROM spatial_ref_sys ...не обязательна, но она защищает попытки преобразования с неизвестными или недействительными проекциями, которые вызывают ошибки).
И если эта таблица должна поддерживаться (добавляться / обновляться), вы можете использовать функцию триггера для обновления the_geom_mercator, например:
CREATEOR REPLACE FUNCTION my_table_tg_fn() RETURNS triggerAS$BODY$BEGINIF TG_OP ='INSERT'AND NEW.the_geom ISNULL THENRETURN NEW;-- no new geometry
ELSIF TG_OP ='UPDATE'THENIF NEW.the_geom ISNOTDISTINCTFROM OLD.the_geom THENRETURN NEW;-- same old geometryENDIF;ENDIF;-- Attempt to transform a geometryBEGIN
NEW.the_geom_mercator := ST_Transform(NEW.the_geom,3857);
EXCEPTION WHEN SQLSTATE 'XX000'THEN
RAISE WARNING 'the_geom_mercator not updated: %', SQLERRM;END;RETURN NEW;END;$BODY$ LANGUAGE plpgsql;CREATETRIGGER my_table_tg BEFORE INSERTORUPDATEON my_table FOR EACH ROWEXECUTEPROCEDURE my_table_tg_fn();
Обратите внимание, что ST_Transform должен перехватывать ошибки и отображать предупреждение, например:
Спасибо за отличный ответ. Очень удобно использовать триггеры, я начну это делать. Могу ли я добавить этот триггер в базу данных, чтобы мне не пришлось добавлять этот триггер для каждой новой таблицы?
Кнутоль
Я добавляю данные в postgis с помощью shp2psqlи таблица создается при прокачке psql. Так что я не могу добавить триггер, пока таблица не существует?
Кнутоль
1
Если вы используете shp2pgsql, используйте оператор обновления, см. Выше. Триггер полезен, если вам нужно вести таблицу, но не для загрузки.
Майк Т
2
Сначала создайте обычную непространственную таблицу, которая у вас уже есть. Затем добавьте пространственный столбец в таблицу, используя функцию OpenGIS «AddGeometryColumn».
Пример:
CREATETABLE terrain_points (
ogc_fid serial NOTNULL,
elevation doubleprecision,);SELECT AddGeometryColumn('terrain_points','wkb_geometry',3725,'POINT',3);
Вы можете создать столбец геометрии SRID без ограничений для хранения собственной формы, а затем преобразовать ее в существующую. Вот надуманный пример, предполагающий, что у вас есть полигоны, которые вы копируете из промежуточной таблицы (если вы смешали, вы можете установить тип для геометрии, например, геометрия (Geometry, 3857):
Спасибо за Ваш ответ. Есть ли способ сделать это на уже существующих таблицах (т.е. без использования промежуточных таблиц)? Допустим, у меня уже есть таблица со geomстолбцом, и я просто хочу добавить еще один the_geom_webmercatorстолбец. Как бы я это сделал?
shp2psql
и таблица создается при прокачкеpsql
. Так что я не могу добавить триггер, пока таблица не существует?Сначала создайте обычную непространственную таблицу, которая у вас уже есть. Затем добавьте пространственный столбец в таблицу, используя функцию OpenGIS «AddGeometryColumn».
Пример:
источник
Вы можете создать столбец геометрии SRID без ограничений для хранения собственной формы, а затем преобразовать ее в существующую. Вот надуманный пример, предполагающий, что у вас есть полигоны, которые вы копируете из промежуточной таблицы (если вы смешали, вы можете установить тип для геометрии, например, геометрия (Geometry, 3857):
источник
geom
столбцом, и я просто хочу добавить еще одинthe_geom_webmercator
столбец. Как бы я это сделал?