PostgreSQL проблем з редагуванням точок / ліній / полігонів у QGIS


15

У мене проблема з postgresql та QGIS:

  • Я можу додати точки / лінії / полігони та поле заповнення

Але я не можу:

  • видалити точки / лінії / полігони
  • зміна точок / ліній / багатокутників (переміщення чи зміна поля)

Наприклад: dbname = 'Europe' host = localhost port = 5432 user = 'postgres' sslmode = відключити ключ = 'tid' приблизительнометаданних = true srid = 900913 type = Таблиця точок = "public". "planet_osm_point" (шлях) sql =

QGIS підключається як рівень адміністратора до бази даних. З pdAdmin III я можу все (створити, видалити, змінити ...)

База даних postgresql імпортується з OSM з osm2pgsql .

На іншому шарі, наприклад .shp, у мене немає цієї проблеми.

Будь-яка ідея?

Налаштування: Ubuntu 14.04 / Posgresql 9.4 / QGIS 2.10


Привіт Матьє, ти можеш уточнити точне значення "я не можу". Чи інструменти деактивовані, чи не вдалося зберегти шар? І найголовніше: чи є повідомлення про помилку? Також перегляньте панель журналів повідомлень на вкладці Postgis.
Маттіас Кун

offcourse Я перебуваю в режимі редагування відповідного шару (жовта ручка). Інструменти редагування - всі сірі, за винятком додавання значка сутності. повідомлення, яке я отримую, є: Попередня підтримка не підтримує паспортизацію: Попередня підтримка не підтримує об'єкти
Матьє

1
повідомлення про помилку англійською мовою: Постачальник не підтримує видалення: Постачальник даних не підтримує видалення функцій
Mathieu

1
Редагування верхньої піктограми: Усі сірі ВДАЧИ Додати функцію
Матьє

1
2015-08-08T12: 10: 22 1 Первинний ключ ctid - зміна існуючих функцій вимкнено (спосіб; "public". "Planet_osm_point") 2015-08-08T12: 10: 23 1 Первинний ключ ctid - зміна існуючих функцій вимкнено (спосіб; "загальнодоступний". "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 ADD PRIMARY KEY (osm_id);

до цих пір osm_id унікальний.


Ось як ви це зробите!
DPSSpatial

Ви вважаєте, що це правильно?
Матьє

Я думаю так! Я можу перевірити це на роботі та подати звіт, але тепер знаючи, як ви імпортували дані, це ваш спосіб вирішення. Однак одне питання - чому ти редагуєш ці дані в QGIS локально, а не редагуєш дані безпосередньо в редакторі ОСМ та надаєш їх назад?
DPSSpatial

1
Про OSM: це тому, що нам просто потрібно генерувати вихідну карту з нашими дизайнерськими / графічними характеристиками та додавати деякі інші платні дані від провайдерів (неможливо оприлюднити їх). QGIS - ідеальний інструмент для цього. Сприяти - це інша річ, що ми це зробимо вчасно.
Матьє

10

Рішення полягає у створенні первинного ключа, як уже було сказано.

Але дизайн, 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);

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:

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


Під PGAdmin немає первинного ключа. Як повторно завантажити шар?
Матьє

@Mathieu Я б використав плагін DBManager в QGIS і натиснув на опцію 'первинний ключ' і назвав поле OBJECTID або щось подібне. Це повинно дозволяти вам редагувати функції ... якщо у вас є унікальне поле для ідентифікації, яке ви хочете використовувати в якості свого основного ключа, ви можете його знову встановити пізніше ...
DPSSpatial

Я звичайно німий, але в DBmanager я не знайшов, де встановити первинний ключ. Насправді у мене є для «багатокутника planetOSM» (та інших) попередження про те, що він не є первинним ключем.
Матьє

нормально - я просто оновив свою відповідь, але це спосіб GUI зробити це ... дайте мені знати, чи це працює для вас ...
DPSSpatial

Дякую за процедуру, і тепер я розумію, чому я не можу це зробити: база даних імпортується за допомогою osm2pgsql безпосередньо в postgis з файлу osm.pbf. У вас процедура - це зовнішній файл, який потрібно завантажити. У моєму випадку база даних вже перебуває в postgis і не говорить жодного первинного ключа, як показано під час захоплення екрана. Тож є спосіб - коли база даних вже імпортується - генерувати під pgsql первинний ключ?
Матьє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.