Suite

Charger des fichiers de formes dans une base de données PostGIS distante à l'aide de la ligne de commande ?


Pouvons-nous importer un Shapefile d'un système sur lequel PostgreSQL n'est pas installé (machine cliente) dans un système sur lequel PostGIS est installé ?

J'ai un problème avec 'shp2pgsql' et 'psql' car les deux ne sont pas reconnus sur la machine cliente.

J'essaye ceci en utilisant la console.


Ce n'est pas une solution en ligne de commande, mais puisque vous avez tagué la question QGIS :

Je recommande d'utiliser le plugin QGIS PostGIS Manager qui est une interface graphique pour shp2pgsql qui vous permet de télécharger des fichiers de formes dans une base de données distante.


Je pense que si vous avez installé qgis, vous aurez également ogr2ogr (il est fourni avec le package gdal-bin). Avec la commande suivante, vous allez créer une table appelée yousahpefile dans votre base de données :

ogr2ogr -f PostgreSQL PG:"host=server_ip user=username dbname=dbname password=password" yourshapefile.shp;

Il existe des solutions de contournement si vous rencontrez des problèmes avec l'encodage.


Vous devrez installer shp2psql sur la machine cliente ou copier le fichier de formes sur une machine sur laquelle il est installé.


Je pense que vous avez juste besoin de copier les fichiers pertinents. Je l'ai fait sur ewindows. Je n'ai pas essayé sous Linux. Pour Windows, je copie les fichiers shp2pgsql.exe, libpq.dll, libiconv-2.dll, comerr32.dll, msvcr71.dll , quelques autres mais ce sont les principaux - ils sont situés dans le dossier bin PostgreSQL

Ceux de Linux seraient différents mais libpq et shp2pgsql sont définitivement requis


Vous pouvez soit utiliser shp2pgsql sur votre copie locale de la base de données, créer un dump de la nouvelle base de données et la télécharger,… ou installer shp2pgsql sur la machine distante, scp le fichier de formes et shp2pgsql à partir de là (comme le recommande iant).

AFAIK, il n'y a aucun moyen de le faire à distance en une seule étape. En effet, même si vous avez accès à la base de données distante depuis l'endroit où vous vous trouvez, les fonctions que vous utilisez (telles que shp2pgsql) sont celles installées sur le serveur, indépendamment de ce qui se trouve sur votre machine locale.


Je développe une application cartographique Web qui utilise géoserveur + express en tant que serveur et postgreSQL + postGIS comme sa base de données. Dans une partie, je voulais ajouter des fonctionnalités permettant aux utilisateurs de télécharger leurs fichiers .shp à distance. Après avoir passé des jours, j'ai découvert qu'il était possible d'exécuter des commandes shell en utilisant simplement l'exécutif fonction que les deux php et Express fournit pour nous. Donc à cause de psql et shp2pgsql sont des commandes qui peuvent être exécutées dans la ligne de commande du système d'exploitation, l'exécutif la fonction est une solution.

Bien que j'utilise javascript sur le client et le serveur, dans ce qui suit, j'ai donné un simple morceau de code pour les deux php et Express selon votre besoin :

1) PHP

C'est une partie de votre code php que votre formulaire html est soumis.

$username = 'votre_nom d'utilisateur'; $password = 'votre_mot_de_passe'; $dbname = 'target_databasename'; $tbname = 'target_tablename'; $srsname = 'reference_system'; $fileName = 'shapefile_name'; $répertoire = '
épertoire' .$fileName. '.shp'; $shellCommand = "shp2pgsql -I -s " .$srsname. " " .$répertoire. " Publique." .$tbnom. " | psql -U " .$nom d'utilisateur. " -d " .$dbname.""; $shapfileLoader = exec($shellCommand,$stdOut,$stdErr); if (!$stdErr) { echo $stdOut; } else { echo $stdErr; }

2) Exprimez

Après avoir défini un chemin dans votre serveur express, ajoutez simplement ce code js :

var express = require('express'); var router = express.Router(); var { exec } = require('child_process'); router.post("/", function (_req, _res, _next) { const postGISdb = 'db_name'; const user = 'your_username'; exec('psql -U ${user} -d ${postGISdb}', ( err, stdOut, stdErr) => { console.log(stdOut) }) }); module.exports = routeur ;

1) N'oubliez pas de remplacer les informations de configuration de la base de données par les vôtres.

2) Vous n'avez plus besoin de QGIS.

3) En utilisant la fonction exec, vous devez entrer le mot de passe postgreSQL. Vous devez donc créer un fichier .pgpass pour définir le mot de passe de manière non interactive et automatique. Pour plus d'informations, consultez ce lien.


Voir la vidéo: Import the shape file .shp to PostgreSQL using PostGIS, and perform the query (Octobre 2021).