Suite

L'insertion PostGIS a échoué sans générer d'erreur


J'apprends PostGIS à travers un livre "PostGIS en action".

Le code SQL écrit dans le livre a beaucoup de problèmes et j'ai compris la plupart d'entre eux sauf celui-ci :

Copié du chapitre du livre :

CREATE TABLE ch03.paris_points(gid SERIAL PRIMARY KEY, osm_id entier, ar_num entier, 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'; "

Le ch03.paris_hetero contient toutes les colonnes nécessaires. La requête n'a renvoyé aucune erreur mais elle n'a tout simplement pas été insérée, rien n'a été ajouté dans la table ch03.paris_points.

Après avoir brièvement examiné le code, je ne peux vraiment rien dire qui s'est mal passé.


En règle générale, lorsqu'un INSERT ne fait que générer aucune erreur, c'est parce que vous essayez d'insérer un ensemble vide. Une autre règle de base si vous avez un ensemble vide est de rechercher d'abord la clause WHERE.

Aussi un petit conseil de débogage supplémentaire pour une telle situation. Lorsque vous écrivez INSERT sur la base d'une clause SELECT, essayez d'exécuter la partie SELECT seule pour voir si le résultat correspond à vos attentes, puis écrivez la clause INSERT par dessus.

ÉDITER: Suppression d'une partie de la réponse qui a mélangé ST_GeometryType() et GeometryType() comme l'a souligné LR1234567.


Si vous exécutez l'instruction suivante, vous verrez probablement que votre table ne contient aucun point :

Sélectionnez * FROM ch03.paris_hetero WHERE ST_GeometryType(geom) = 'ST_Point';

Vous pouvez lister les Geometrytypes que votre table contient comme ceci :

Sélectionnez Distinct ST_GeometryType(geom) FROM ch03.paris_hetero ;

Je suppose que vous avez manqué quelques étapes du workflow PostGIS-In-Action du chapitre 3:

-- Créez l'extension hstore à partir du fichier sql ou dans des versions plus récentes simplement

Créer une extension hstore ;

-- -- exécutez planet_osm_line.sql à partir du sous-dossier "raw_data_files"

-- puis marquage de la région et découpage des données dans un arrondissement spécifique

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 FROM (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));

-- -- exécutez run planet_osm_point.sql à partir du sous-dossier "raw_data_files"

-- -- exécutez run planet_osm_polygon.sql à partir du sous-dossier "raw_data_files"

-- répéter pour planet_osm_polygon, planet_osm_point -- NON AFFICHÉ DANS LE LIVRE

INSÉRER DANS 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) Comme geom, tags FROM planet_osm_polygon) AS o INNER JOIN ch03.arrondissements AS A ON (ST_Intersects(o.geom, a.geom)); INSÉRER DANS 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));

-- Créez votre tableau

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);

-- ou mieux juste

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

-- Remplissez votre tableau

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';

-- Vérifiez si des points sont insérés :

sélectionnez * à partir de ch03.paris_points ;