Problemi con PostgreSQL nella modifica di punti / linee / poligoni in QGIS


14

Ho un problema con postgresql e QGIS:

  • Posso aggiungere punti / linee / poligoni e campo di riempimento

Ma non posso:

  • elimina punti / linee / poligoni
  • modifica punti / linee / poligoni (sposta o modifica campo)

es: dbname = host 'Europa' = porta localhost = 5432 user = 'postgres' sslmode = chiave disabilita = 'tid' stimata metadata = true srid = 900913 tipo = tabella dei punti = "public". "planet_osm_point" (way) sql =

QGIS è collegato a livello di amministratore nel database. Con pdAdmin III posso fare tutto (creare, eliminare, modificare ...)

Il database postgresql viene importato da OSM con osm2pgsql .

Su un altro livello, come .shp, non ho questo problema.

Qualche idea ?

Config: Ubuntu 14.04 / Posgresql 9.4 / QGIS 2.10


Ciao Mathieu, puoi chiarire il significato esatto di "Non posso". Gli strumenti sono disattivati, non riesce al salvataggio del livello? E, cosa più importante: c'è un messaggio di errore? Dai anche un'occhiata al pannello di registro dei messaggi nella scheda Postgis.
Matthias Kuhn,

offcourse Sono in modalità di modifica al livello interessato (penna gialla). Gli strumenti di modifica sono tutti grigi tranne l'aggiunta dell'icona dell'entità. il messaggio che ricevo è: Il servizio prestato non supporta l'implementazione: Il servizio prestato non dà l'impressione degli oggetti
Mathieu

1
messaggio di errore in inglese: il provider non supporta l'eliminazione: il provider di dati non supporta l'eliminazione delle funzionalità
Mathieu

1
Modifica icona in alto: Tutto grigio TRANNE Aggiungi funzione
Mathieu

1
2015-08-08T12: 10: 22 1 La chiave primaria è ctid - modifica delle funzionalità esistenti disabilitata (way; "public". "Planet_osm_point") 2015-08-08T12: 10: 23 1 La chiave primaria è ctid - modifica delle funzionalità esistenti disabled (way; "public". "planet_osm_line") 2015-08-08T12: 10: 23 1 Tipo di funzione o srid per "public". "planet_osm_polygon" non può essere determinato o non è stato richiesto.
Mathieu

Risposte:


13

Fisso. Il problema era che non c'era una chiave primaria.

In pgAdmin fai questa richiesta.

ALTER TABLE tableName ADD PRIMARY KEY (id);

Esempio di tabella planet_osm_line e impostazione della colonna osm_id come chiave primaria:

TABELLA ALTER planet_osm_line AGGIUNGI TASTO PRIMARIO (osm_id);

fino a quando osm_id è unico.


Ecco come lo fai!
DPSSpatial,

Pensi che sia giusto?
Mathieu,

Credo di si! Posso provarlo sul posto di lavoro e riferire, ma ora sapendo come hai importato i dati, questa è la soluzione alternativa. Un problema però: perché stai modificando questi dati in QGIS localmente invece di modificare i dati direttamente in un editor OSM e contribuendo indietro?
DPSSpatial,

1
Informazioni su OSM: è perché abbiamo solo bisogno di generare una mappa di output con le nostre specifiche di progettazione / grafica e l'aggiunta di alcuni altri dati a pagamento dai fornitori (non è possibile renderli pubblici). QGIS è uno strumento perfetto per questo. Contribuire è un'altra cosa, che lo faremo in tempo.
Mathieu

9

La soluzione è creare una chiave primaria, come già accennato.

Ma dal design, osm2pgsqlnon garantisce che osm_idsia unico. Può produrre più righe con lo stesso osm_id .

Per modificare le planet_osm_*tabelle in QGIS, ad esempio, è consigliabile aggiungere un'altra colonna ID gid.

Per aggiungere una gidcolonna unica :

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 ha problemi se la colonna geometrica è solo GEOMETRIA. Alcune query potrebbero non riuscire. Ho trovato utile cambiare la planet_osm_polygongeometria MultiPolygoncon:

ALTER TABLE planet_osm_polygon
    ALTER COLUMN way TYPE geometry(MultiPolygon,3857) USING ST_Multi(way);

3

Penso che questo sia un problema chiave principale. La tabella dovrebbe averne una e questo viene riconosciuto quando si visualizza la tabella tramite PGAdmin.

Ho avuto lo stesso problema, ma ho ricaricato il livello con un campo chiave principale chiamato ID (arbitrario) e tutti i miei strumenti di modifica sono ora attivi sulla barra degli strumenti.

Utilizzando SQL è possibile aggiungere una colonna OID del tipo di dati 'seriale' e creare una chiave primaria usando questa istruzione:

ALTER TABLE schema."Tablename"

ADD ID serial NOT NULL

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

Usando una GUI, puoi ricaricare il tuo livello con una chiave primaria che verrà riconosciuta dal database e quindi PostGIS e QGIS:

  • apri DB Manager
  • connettiti al tuo database
  • scegli 'import layer / file'
  • seleziona la casella "Chiave primaria" e inserisci un nome per la colonna "chiave primaria" che memorizzerà gli ID univoci che consentiranno la modifica:

inserisci qui la descrizione dell'immagine

Da lì, torna a PGAdmin, connettiti al tuo database e fai clic sulla tabella che hai appena ricreato: ora puoi vedere se la colonna OID è riconosciuta:

inserisci qui la descrizione dell'immagine


In PGAdmin nessuna chiave primaria. Come ricaricare il layer?
Mathieu,

@Mathieu Vorrei utilizzare il plug-in DBManager in QGIS e fare clic sull'opzione 'chiave primaria' e nominare il campo OBJECTID o qualcosa di simile. Ciò dovrebbe consentirti di avere funzioni modificabili ... se hai un campo ID univoco esistente che desideri utilizzare come chiave primaria, puoi sempre reimpostarlo in seguito ...
DPSSpatial

Sono certamente stupido ma sotto DBmanager non ho trovato dove impostare la chiave primaria. In realtà ho per "planetOSM poligono" (e altri) un avvertimento che dice che non c'è chiave primaria.
Mathieu,

ok - ho appena aggiornato la mia risposta, ma questo è il modo GUI per farlo ... fammi sapere se funziona per te ...
DPSSpatial

Grazie mille per la procedura, e ora capisco perché non posso farlo: il database viene importato usando osm2pgsql direttamente in postgis dal file osm.pbf. Nella tua procedura è un file esterno che deve essere caricato. Nel mio caso il database è già in postgis e non dice alcuna chiave primaria come quella mostrata nella schermata. Quindi c'è un modo - quando il database è già stato importato - di generare in pgsql una chiave primaria?
Mathieu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.