Problemas de PostgreSQL editando puntos / líneas / polígonos en QGIS

14

Tengo un problema con postgresql y QGIS:

  • Puedo agregar puntos / líneas / polígonos y campo de relleno

Pero no puedo:

  • eliminar puntos / líneas / polígonos
  • Modificar puntos / líneas / polígonos (mover o modificar el campo)

ej .: dbname = 'Europa' host = puerto localhost = 5432 usuario = 'postgres' sslmode = deshabilitar clave = 'tid' estimado de metadatos = verdadero srid = 900913 type = Point table = "public". "planet_osm_point" (way) sql =

QGIS está conectado como nivel de administrador en la base de datos. Con pdAdmin III puedo hacer todo (crear, eliminar, modificar ...)

La base de datos postgresql se importa de OSM con osm2pgsql .

En otra capa, como .shp, no tengo este problema.

Alguna idea ?

Configuración: Ubuntu 14.04 / Posgresql 9.4 / QGIS 2.10

Mathieu
fuente
Hola Mathieu, ¿puedes aclarar el significado exacto de "No puedo". ¿Las herramientas están desactivadas, falla al guardar la capa? Y lo más importante: ¿hay un mensaje de error? También eche un vistazo al panel de registro de mensajes en la pestaña postgis.
Matthias Kuhn
Por supuesto, estoy en modo de edición de la capa en cuestión (lápiz amarillo). Todas las herramientas de edición son grises, excepto agregar el ícono de entidad el mensaje que recibo es: El servicio prestaire ne supporte pas l'effacement: El prestataire de données ne supporte pas l'effacement des objets
Mathieu
1
mensaje de error en inglés: el proveedor no admite la eliminación: el proveedor de datos no admite la eliminación de funciones
Mathieu
1
Edición del icono superior: Todo gris EXCEPTO Agregar función
Mathieu
1
2015-08-08T12: 10: 22 1 La clave principal es ctid: el cambio de las características existentes está deshabilitado (forma; "public". "Planet_osm_point") 2015-08-08T12: 10: 23 1 La clave principal es ctid: cambio de las características existentes disabled (way; "public". "planet_osm_line") 2015-08-08T12: 10: 23 1 El tipo de función o la cuadrícula para la forma de "public". "planet_osm_polygon" no se pudo determinar o no se solicitó.
Mathieu

Respuestas:

13

Fijo. El problema fue que no hay clave principal.

En pgAdmin haz esta solicitud.

ALTER TABLE tableName AGREGAR CLAVE PRIMARIA (id);

Ejemplo para la tabla planet_osm_line y establecer la columna osm_id, como clave primaria:

ALTER TABLE planet_osm_line AGREGAR CLAVE PRIMARIA (osm_id);

hasta que osm_id es único.

Mathieu
fuente
¡Asi es como lo haces!
DPSSpatial
¿Crees que es correcto?
Mathieu
¡Creo que sí! Puedo probarlo en el trabajo e informar, pero ahora sabiendo cómo importó los datos, esa es su solución. Sin embargo, un problema: ¿por qué está editando estos datos en QGIS localmente en lugar de editar los datos directamente en un editor OSM y contribuir de nuevo?
DPSSpatial
1
Acerca de OSM: es porque solo necesitamos generar un mapa de salida con nuestras especificaciones de diseño / gráfico y agregar algunos otros datos pagos de los proveedores (no es posible hacerlos públicos). QGIS es una herramienta perfecta para eso. Contribuir es otra cosa, que lo haremos a tiempo.
Mathieu
9

La solución es crear una clave primaria, como ya se mencionó.

Pero por diseño, osm2pgsqlno garantiza que osm_idsea ​​único. Puede producir varias filas con el mismo osm_id .

Para editar planet_osm_*tablas en QGIS, es aconsejable agregar otra columna de identificación, por ejemplo gid.

Para agregar una gidcolumna única :

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 tiene problemas si la columna de geometría es solo GEOMETRÍA. Algunas consultas pueden fallar. Me pareció útil cambiar la planet_osm_polygongeometría MultiPolygoncon:

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

Creo que este es un tema clave principal. Su tabla debe tener uno y eso se reconoce cuando ve la tabla a través de PGAdmin.

Tuve el mismo problema, pero volví a cargar la capa con un campo de clave principal llamado ID (arbitrario) y todas mis herramientas de edición ahora están activas en la barra de herramientas.

Con SQL, puede agregar una columna OID del tipo de datos 'en serie' y crear una clave principal con esta instrucción:

ALTER TABLE schema."Tablename"

ADD ID serial NOT NULL

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

Usando una GUI, puede volver a cargar su capa con una clave principal que será reconocida por la base de datos y, por lo tanto, PostGIS y QGIS:

  • abrir DB Manager
  • conectarse a su base de datos
  • elija 'importar capa / archivo'
  • marque la casilla 'Clave principal' e ingrese un nombre para la columna 'clave principal' que almacenará los ID únicos que permitirán la edición:

ingrese la descripción de la imagen aquí

Desde allí, regrese a PGAdmin, conéctese a su base de datos y haga clic en la tabla que acaba de volver a crear; ahora puede ver si se reconoce la columna OID:

ingrese la descripción de la imagen aquí

DPSSpacial
fuente
Bajo PGAdmin no hay clave primaria. ¿Cómo vuelvo a cargar la capa?
Mathieu
@Mathieu Usaría el complemento DBManager en QGIS y haría clic en la opción 'clave principal' y nombraría el campo OBJECTID o algo similar. Eso debería permitirle tener funciones editables ... si tiene un campo de ID único existente que desea usar como clave principal, siempre puede volver a configurarlo más tarde ...
DPSSpatial
Ciertamente soy tonto, pero bajo DBmanager no encontré dónde establecer la clave principal. En realidad, tengo para el "polígono planetOSM" (y otros) una advertencia que dice que no hay una clave principal.
Mathieu
ok, acabo de actualizar mi respuesta, pero esa es la forma GUI de hacerlo ... avíseme si eso funciona para usted ...
DPSSpatial
Muchas gracias por el procedimiento, y ahora entiendo por qué no puedo hacerlo: la base de datos se importa usando osm2pgsql directamente en postgis desde el archivo osm.pbf. En su procedimiento hay un archivo externo que debe cargarse. En mi caso, la base de datos ya está en postgis y no dice ninguna clave principal como se muestra en la captura de pantalla. Entonces, ¿hay una manera, cuando la base de datos ya está importada, de generar bajo pgsql una clave primaria?
Mathieu