Проблемы с редактированием точек / линий / полигонов в QGIS в PostgreSQL

14

У меня проблема с postgresql и QGIS:

  • Я могу добавить точки / линии / полигоны и заполнить поле

Но я не могу:

  • удалить точки / линии / полигоны
  • изменить точки / линии / полигоны (переместить или изменить поле)

Пример: dbname = 'Европа' хост = порт локального хоста = 5432 пользователь = 'postgres' sslmode = отключить ключ = 'tid' оценочные метаданные = true srid = 900913 type = таблица точек = "public". "planet_osm_point" (way) sql =

QGIS подключен как администраторский уровень к базе данных. С помощью pdAdmin III я могу делать все (создавать, удалять, изменять ...)

База данных postgresql импортируется из OSM с помощью osm2pgsql .

На другом слое, например .shp, у меня нет этой проблемы.

Любая идея ?

Конфиг: Ubuntu 14.04 / Posgresql 9.4 / QGIS 2.10

Матье
источник
Привет Матье, не могли бы вы уточнить точное значение «я не могу». Инструменты деактивированы, происходит сбой при сохранении слоя? И самое главное: есть ли сообщение об ошибке? Также обратите внимание на панель журнала сообщений на вкладке postgis.
Матиас Кун
Конечно, я нахожусь в режиме редактирования соответствующего слоя (желтая ручка). Все инструменты редактирования серые, кроме добавления значка сущности. сообщение, которое я получаю: «Служба предоплаты и поддержки»: «Служба предоплаты и поддержки»
Матье
1
сообщение об ошибке на английском языке: поставщик не поддерживает удаление: поставщик данных не поддерживает удаление функций
Матье
1
Редактирование главного значка: All Grey, КРОМЕ добавьте функцию
Матье
1
2015-08-08T12: 10: 22 1 Первичный ключ - ctid - изменение существующих функций отключено (путь; «public». «Planet_osm_point») 2015-08-08T12: 10: 23 1 Первичный ключ - ctid - изменение существующих функций отключено (путь; "public". "planet_osm_line") 2015-08-08T12: 10: 23 1 Тип объекта или srid для пути "public". "planet_osm_polygon" не может быть определен или не запрошен.
Матье

Ответы:

13

Исправлена. Проблема была не в первичном ключе.

В pgAdmin сделайте этот запрос.

ALTER TABLE tableName ADD PRIMARY KEY (id);

Пример для таблицы planet_osm_line и установки столбца osm_id в качестве первичного ключа:

ALTER TABLE planet_osm_line ДОБАВИТЬ ПЕРВИЧНЫЙ КЛЮЧ (osm_id);

пока osm_id является уникальным.

Матье
источник
Вот как ты это делаешь!
DPSSpatial
Ты считаешь правильным?
Матье
Я думаю так! Я могу проверить это на работе и доложить, но теперь, зная, как вы импортировали данные, это ваш обходной путь. Одна проблема - почему вы редактируете эти данные в QGIS локально, а не редактируете данные непосредственно в редакторе OSM и вносите их обратно?
DPSSpatial
1
О OSM: потому что нам просто нужно сгенерировать выходную карту с нашими проектными / графическими спецификациями и добавить некоторые другие платные данные от провайдеров (сделать их общедоступными невозможно). QGIS - идеальный инструмент для этого. Содействие это другое дело, что мы сделаем это вовремя.
Матье
9

Решение состоит в том, чтобы создать первичный ключ, как уже упоминалось.

Но по дизайну osm2pgsqlне гарантирует, что osm_idэто уникально. Может выдавать несколько строк с одинаковым osm_id .

Для редактирования planet_osm_*таблиц в QGIS целесообразно, например, добавить еще один столбец id gid.

Чтобы добавить уникальный gidстолбец:

ALTER TABLE planet_osm_point ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_line ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_polygon ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_roads ADD gid serial PRIMARY KEY;

У QGIS есть проблемы, если столбец геометрии - это просто ГЕОМЕТРИЯ. Некоторые запросы могут потерпеть неудачу. Я нашел полезным изменить planet_osm_polygonгеометрию на MultiPolygon:

ALTER TABLE planet_osm_polygon
    ALTER COLUMN way TYPE geometry(MultiPolygon,3857) USING ST_Multi(way);
jgrocha
источник
3

Я думаю, что это основной вопрос. Ваша таблица должна иметь такую, которая распознается при просмотре таблицы через PGAdmin.

У меня была такая же проблема, но я снова загрузил слой с полем первичного ключа с именем ID (произвольно), и все мои инструменты редактирования теперь активны на панели инструментов.

Используя SQL, вы можете добавить столбец OID типа «serial» и создать первичный ключ, используя следующую инструкцию:

ALTER TABLE schema."Tablename"

ADD ID serial NOT NULL

ALTER TABLE schema."Tablename" ADD PRIMARY KEY (id);

Используя графический интерфейс, вы можете перезагрузить ваш слой с первичным ключом, который будет распознан базой данных и, следовательно, PostGIS и QGIS:

  • открыть менеджер БД
  • подключиться к вашей базе данных
  • выберите «импортировать слой / файл»
  • установите флажок «Первичный ключ» и введите имя для столбца «первичный ключ», в котором будут храниться уникальные идентификаторы, которые позволят редактировать:

введите описание изображения здесь

Оттуда вернитесь в PGAdmin, подключитесь к своей базе данных и нажмите на таблицу, которую вы только что создали, - теперь вы можете увидеть, распознан ли столбец OID:

введите описание изображения здесь

DPSSpatial
источник
Под PGAdmin нет первичного ключа. Как перезагрузить слой?
Матье
@Mathieu Я бы использовал плагин DBManager в QGIS, щелкнул опцию «первичный ключ» и назвал поле OBJECTID или что-то подобное. Это должно позволить вам иметь редактируемые функции ... если у вас есть существующее поле уникального идентификатора, которое вы хотите использовать в качестве основного ключа, вы всегда можете переустановить это позже ...
DPSSpatial
Я конечно тупой, но в DBmanager я не нашел где установить первичный ключ. На самом деле у меня есть для «многоугольника планеты OSM» (и других) предупреждение о том, что нет первичного ключа.
Матье
хорошо - только что обновил мой ответ, но это GUI способ сделать это ... дайте мне знать, если это работает для вас ...
DPSSpatial
Большое спасибо за процедуру, и теперь я понимаю, почему я не могу этого сделать: база данных импортируется с помощью osm2pgsql непосредственно в postgis из файла osm.pbf. В вашей процедуре есть внешний файл, который нужно загрузить. В моем случае база данных уже находится в postgis и не содержит первичного ключа, как показано на снимке экрана. Так есть ли способ - когда база данных уже импортирована - генерировать под pgsql первичный ключ?
Матье