2 votos

Fusión de dos capas geométricas diferentes en una (SQL, GeoPackage)

Tengo una capa de puntos ('points') y una capa de polígonos ('multipolygons') . Quiero cargar la capa de puntos combinada con los centroides de la capa de polígonos.

Estoy utilizando GeoPackage y he intentado utilizar SQL insertando los centroides en la tabla de puntos:

insert into points
select ST_Centroid(geom) as geometry, *
from multipolygons where "tourism"!='NULL'

Esto devuelve ese error:

la tabla puntos tiene 27 columnas pero se suministraron 28 valores

Estoy utilizando el DB-Manager de QGIS: enter image description here

enter image description here

El GeoPackage se generó a partir de osm.pbf utilizando ogr2ogr

Necesito tener los centroides y los puntos en un mismo sitio. También otras soluciones sería bueno (capa virtual?)

Añade: De acuerdo a la respuesta del usuario30184, escribí la siguiente consulta, dando como resultado una tabla de atributos esperada pero sin relacionar geometrías:

insert into points (geom, osm_id, name, amenity, historic, leisure, man_made, natural, office, place, sport, tourism)
select st_centroid(geom) as geom, osm_id, name, amenity, historic, leisure, man_made, natural, office, place, sport, tourism
from multipolygons 
where tourism in ('attraction','museum','camp_site','caravan_site','hostel','zoo','information','viewpoint')

2voto

Joe Puntos 16

Tienes algunos problemas en tu consulta SQL.

Supongo que sus tablas de puntos y multipolígonos tienen idéntico esquema con 27 atributos. El error de no coincidencia del número de columnas se debe a que

SELECT * selecciona todas las columnas (27), incluida la geometría de origen "geom", y ST_Centroid(geom) as geometry anuncia uno, hace 28 en total. No puede utilizar select * pero debe enumerar todos los atributos excepto la geometría nativa en su sentencia SQL. Todos los atributos deben seleccionarse en el mismo orden en que aparecen en la tabla de puntos.

Si ha superado el primer error puede que el siguiente le diga "Unique constraint failed:points.fid" que se produce porque puede que tenga los mismos valores fid en las tablas de puntos y multipolígonos. Para resolverlo, debe generar fids que no se utilicen ya en la tabla de puntos. También debe convertir las geometrías de gpkg BLOB a SpatiaLite BLOB y viceversa para que el ST_Centroid y las inserciones funcionen. Algo como esto debería funcionar

insert into points
select max(p.fid)+1,
AsGPB(ST_Centroid(castautomagic(pol.geom))) as geometry,
mpol.attr_1,mpol_attr_2,...mpol_attr_27)
from points p,multipolygons mpol;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X