1 votos

La inserción en PostGIS ha fallado sin que se produzca un error

Estoy aprendiendo PostGIS a través de un libro "PostGIS en acción".

El código SQL escrito en el libro tiene muchos problemas y he resuelto la mayoría de ellos excepto este:

Copiado del capítulo del libro:

CREATE TABLE ch03.paris_points(gid SERIAL PRIMARY KEY, osm_id integer, ar_num integer, feature_name varchar(200), feature_type varchar(50)); 

SELECT AddGeometryColumn('ch03', 'paris_points', 'geom', 32631,'POINT', 2); 

INSERT INTO ch03.paris_points(osm_id, ar_num, geom, feature_name,feature_type)

SELECT osm_id, ar_num, geom, tags->'name' As feature_name,

COALESCE(tags->'tourism', tags->'railway','other')::varchar(50) As feature_type

FROM ch03.paris_hetero

WHERE ST_GeometryType(geom) = 'ST_Point'; "

El ch03.paris_hetero contiene todas las columnas necesarias. La consulta no devuelve ningún error, pero simplemente no se inserta, no se ha añadido nada en la tabla ch03.paris_points.

Después de examinar brevemente el código, realmente no puedo decir nada que haya ido mal.

4voto

Sanket Gupta Puntos 21

Como regla general, cuando un INSERT no hace nada y no produce ningún error es porque intenta insertar un conjunto vacío. Como otra regla general si tienes un conjunto vacío es buscar primero la cláusula WHERE.

También un pequeño consejo de depuración extra para tal situación. Cuando escriba un INSERT basado en una cláusula SELECT, intente ejecutar la parte SELECT sola para ver si el resultado coincide con sus expectativas, y luego escriba la cláusula INSERT encima.

EDITAR : Se ha eliminado una parte de la respuesta que confundía ST_GeometryType() y GeometryType(), como ha señalado LR1234567.

1voto

bob-the-destroyer Puntos 138

Si ejecuta la siguiente sentencia, probablemente verá que su tabla no contiene ningún punto:

Select *

FROM ch03.paris_hetero

WHERE ST_GeometryType(geom) = 'ST_Point'; 

Puede enumerar los Geometrytypes que contiene su tabla así:

Select Distinct ST_GeometryType(geom)

FROM ch03.paris_hetero; 

Supongo que te has perdido algunos pasos del flujo de trabajo PostGIS-In-Action del capítulo 3:

-- Crear la extensión hstore desde el archivo sql o en las versiones más nuevas sólo

Create Extension hstore;

-- -- ejecutar planet_osm_line.sql desde la subcarpeta "raw_data_files"

-- a continuación, el etiquetado de la región y el recorte de datos a un distrito específico

INSERT INTO ch03.paris_hetero(osm_id, geom, ar_num, tags) --[1 BEG] SELECT o.osm_id, ST_Intersection(o.geom, a.geom) As geom, a.ar_num, o.tags DE (SELECT osm_id, ST_Transform(way, 32631) As geom, tags FROM planet_osm_line) AS o INNER JOIN ch03.arrondissements AS A ON (ST_Intersects(o.geom, a.geom));

-- -- ejecutar planet_osm_point.sql desde la subcarpeta "raw_data_files"

-- -- ejecutar planet_osm_polygon.sql desde la subcarpeta "raw_data_files"

-- repetir para planet_osm_polygon, planet_osm_point -- NO SE MUESTRA EN EL LIBRO

INSERT INTO ch03.paris_hetero(osm_id, geom, ar_num, tags)         
SELECT o.osm_id, ST_Intersection(o.geom, a.geom) As geom, 
      a.ar_num, o.tags
FROM 
(SELECT osm_id, ST_Transform(way, 32631) As geom, tags FROM planet_osm_polygon) AS o 
  INNER JOIN ch03.arrondissements AS A ON (ST_Intersects(o.geom, a.geom));                                  

INSERT INTO ch03.paris_hetero(osm_id, geom, ar_num, tags)         
SELECT o.osm_id, o.geom, 
      a.ar_num, o.tags
FROM 
(SELECT osm_id, ST_Transform(way, 32631) As geom, tags FROM planet_osm_point) AS o 
  INNER JOIN ch03.arrondissements AS A ON (ST_Intersects(o.geom, a.geom));  

-- Crear su tabla

  CREATE TABLE ch03.paris_points(gid SERIAL PRIMARY KEY, osm_id integer, ar_num integer, feature_name varchar(200), feature_type varchar(50)); 

  SELECT AddGeometryColumn('ch03', 'paris_points', 'geom', 32631,'POINT', 2); 

-- o mejor simplemente

CREATE TABLE ch03.paris_points(gid SERIAL PRIMARY KEY, osm_id integer, ar_num integer, feature_name varchar(200), feature_type varchar(50),geom geometry(Point,32631)); 

-- Llena tu mesa

INSERT INTO ch03.paris_points(osm_id, ar_num, geom, feature_name,feature_type)

SELECT osm_id, ar_num, geom, tags->'name' As feature_name,

COALESCE(tags->'tourism', tags->'railway','other')::varchar(50) As feature_type

FROM ch03.paris_hetero

WHERE ST_GeometryType(geom) = 'ST_Point'; 

-- Comprobar si los puntos están insertados:

select * from ch03.paris_points;

enter image description here

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