Suite

Comment importer plusieurs fichiers de formes sans aucun dbf dans une base de données PostGIS ?

Comment importer plusieurs fichiers de formes sans aucun dbf dans une base de données PostGIS ?


J'ai un fichier de formes polyligne (.shp et .shx) sans .dbf. Je voudrais importer le shp dans PostGIS.

Pour ce faire, j'ai créé le .dbf correspondant à l'aide du code r fourni par mdsumner dans cet article.

Le .dbf se compose d'une seule ligne, tandis que le .shp correspond à une polyligne.

Maintenant, si je charge le shp dans QGIS, la table attributaire répertorie les identifiants des entités de la polyligne en mode lecture seule.
Je sais que je pourrais enregistrer le fichier chargé dans QGIS, puis je pourrais l'importer dans PostGIS.

Cependant, j'ai des milliers de fichiers de formes similaires et j'aimerais tous les importer dans PostGIS. Je suppose que ce n'est pas possible car le .dbf est en lecture seule car j'ai eu ce message : "le fichier dbf (.dbf) ne peut pas être ouvert".

J'ai lu dans un autre post, que c'est le fichier shx ​​qui connecte le shp au dbf mais cela ne m'a pas aidé.

Excusez-moi si la question n'est pas pertinente ou si ce n'est pas la bonne façon de procéder.


Le fichier de formes que vous avez fourni semble être valide et la projection dans les fichiers prj indique (si je ne me trompe pas) que vos coordonnées de chaque sommet sont liées à WGS84 (EPSG:4326)

En utilisant le pilote ogr2ogr PGDump, vous pouvez traduire votre fichier de formes en une requête SQL qui peut être utilisée pour insérer des données dans la base de données :

Si vous êtes sous Windows, vous pouvez ouvrir la console avecShell MSYS. Il doit être installé par défaut si vous avez utilisé l'outil osgeo4w pour installer qgis.

Ouvrez votremsysencore etCDdans votre répertoire de données, puis pour un fichier exécutez :

ogr2ogr.exe -f PGDump -lco schema=vectors -nln name -lco geometry_name=geom -lco fid=gid -lco srid=4326 temp.sql time_1057.shp
  • le schéma peut être ce que vous voulez.
  • -nln est le nom de la table postgis qui sera créée.
  • le geometry_name et le fid ont été choisis pour des raisons de compatibilité.
  • le srid a été extrait de votre fichier prj.

vous pouvez utiliserdirigerpour examiner l'en-tête du fichier nouvellement généré pour vérifier ce qui va se passer.

tête temp.sql

Dans l'en-tête, vous pouvez trouver des informations sur ce qui se passe lorsque vous exécutez la requête. par exemple comment il va créer les tables, si un index va être créé et etc… le reste du fichier concerne les données réelles qui vont être insérées dans la table.

après tu peux utiliserpsqlpour exécuter le fichier sql dans votre base de données. par exemple:

psql -h IP -U NOM D'UTILISATEUR -f temp.sql

Notez que je n'ai pas eu besoin de fichiers de base de données accompagnés. La table créée contiendra des données concernant l'identifiant (nom du champgidque nous choisissons auparavant) et les informations de géométrie de la forme (nom du champgéom). C'est à vous de créer et de remplir plus de champs de champs.

Maintenant que vous avez mentionné que vous avez des milliers de fichiers de formes, c'est une bonne idée de les importer par lots. Utilisez à nouveau votre Msys etCDdans votre dossier de données et utilisez quelque chose comme ce qui suit :

pour f dans $(ls *.shp); do ogr2ogr.exe -f PGDump -lco schema=vectors -nln $(basename $f .shp) -lco geometry_name=geom -lco fid=gid -lco srid=4326 temp.sql $f; psql -h IP -U NOM D'UTILISATEUR -f temp.sql

Une fois l'opération terminée, vous devriez avoir un schéma appelé vecteurs et à l'intérieur une table pour chaque fichier de formes que vous aviez

NB1 : N'oubliez pas deVIDEensuite pour construire des statistiques de table pour que les index fonctionnent.

NB2: Il existe un moyen d'insérer directement vos données dans le postgis, mais je trouve que si vous utilisez un fichier intermédiaire pour le faire, il est plus facile de comprendre ce qui se passe.


Chapitre 4. Utilisation de PostGIS : gestion des données et requêtes

Les objets SIG pris en charge par PostGIS sont tous les types de vecteurs définis dans le standard "Simple Features for SQL 1.2.1" défini par l'OpenGIS Consortium (OGC), et le document ISO "SQL/MM Part 3: Spatial". De plus, PostGIS prend en charge un type raster (aucune norme n'existe à suivre) et un modèle de topologie (suivant un premier projet de norme ISO pour la topologie qui n'a pas encore été publié).

Les normes OGC et ISO définissent des variantes 2D (x/y), 3D (x/y/z, x/y/m) et 4D (x/y/z/m) de points, lignes, polygones, entités courbes, polyèdres , et TINS.

4.1.1. Représentations en binaire bien connu (WKB) et en texte bien connu (WKT)

Les spécifications OGC et ISO définissent à la fois des représentations textuelles et binaires pour les objets géométriques, WKT et WKB. Les deux représentations incluent des informations sur le type de l'objet et les coordonnées qui forment l'objet.

Voici des exemples de représentations textuelles (WKT) des objets spatiaux des entités :

POLYGONE((0 0,4 0,4 ​​4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))

CHAÎNE MULTILIGNE((0 0,1 1,1 2),(2 3,3 2,5 4))

MULTIPOLYGONE(((0 0,4 0,4 ​​4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2, -2 -2,-2 -1,-1 -1)))

GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))

La spécification OpenGIS exige également que le format de stockage interne des objets spatiaux inclue un identifiant de système de référencement spatial (SRID). Le SRID est requis lors de la création d'objets spatiaux à insérer dans la base de données.

Les entrées/sorties de ces formats sont disponibles via les interfaces suivantes :

Par exemple, une instruction d'insertion valide pour créer et insérer un objet géographique OGC serait :

4.1.2. PostGIS EWKB, EWKT et formulaires canoniques

Les formats OGC ne prennent en charge que les géométries 2D et le SRID associé n'est *jamais* intégré dans les représentations d'entrée/sortie.

Les formats étendus PostGIS sont actuellement un sur-ensemble d'OGC un (chaque WKB/WKT valide est un EWKB/EWKT valide), mais cela pourrait varier à l'avenir, en particulier si OGC sort un nouveau format en conflit avec nos extensions. Ainsi, vous NE DEVRIEZ PAS vous fier à cette fonctionnalité !

PostGIS EWKB/EWKT ajoute la prise en charge des coordonnées 3dm, 3dz, 4d et les informations SRID intégrées.

Des exemples de représentations textuelles (EWKT) des objets spatiaux étendus des entités sont les suivants. Les * sont nouveaux dans cette version de PostGIS :

SRID=32632POINT(0 0) -- XY avec SRID

SRID=4326MULTIPOINTM(0 0 0,1 2 1) -- XYM avec SRID

CHAÎNE MULTILIGNE((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))

POLYGONE((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))

MULTIPOLYGONE(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),(( -1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))

GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )

MULTICOURBE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )

SURFACE POLYÉDRALE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), (( 0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )

NIF( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )

Les entrées/sorties de ces formats sont disponibles via les interfaces suivantes :

Par exemple, une instruction d'insertion valide pour créer et insérer un objet spatial PostGIS serait :

Les "formes canoniques" d'un type PostgreSQL sont les représentations que vous obtenez avec une simple requête (sans aucun appel de fonction) et celle qui est garantie d'être acceptée avec une simple insertion, mise à jour ou copie. Pour le type "géométrie" postgis, il s'agit de :

Par exemple, cette instruction lit EWKT et renvoie HEXEWKB dans le processus d'entrée/sortie ascii canonique :

4.1.3. SQL-MM Partie 3

La spécification spatiale SQL Multimedia Applications étend les fonctionnalités simples de la spécification SQL en définissant un certain nombre de courbes interpolées de manière circulaire.

Les définitions SQL-MM incluent les coordonnées 3dm, 3dz et 4d, mais ne permettent pas l'intégration d'informations SRID.

Les extensions de texte bien connues ne sont pas encore entièrement prises en charge. Des exemples de quelques géométries courbes simples sont présentés ci-dessous :

CHAÎNE CIRCULAIRE(0 0, 1 1, 1 0)

CHAÎNE CIRCULAIRE(0 0, 4 0, 4 4, 0 4, 0 0)

Le CIRCULARSTRING est le type de courbe de base, similaire à un LINESTRING dans le monde linéaire. Un seul segment nécessitait trois points, les points de début et de fin (premier et troisième) et tout autre point de l'arc. L'exception à cette règle est pour un cercle fermé, où les points de début et de fin sont les mêmes. Dans ce cas, le deuxième point DOIT être le centre de l'arc, c'est-à-dire le côté opposé du cercle. Pour enchaîner des arcs ensemble, le dernier point de l'arc précédent devient le premier point de l'arc suivant, tout comme dans LINESTRING. Cela signifie qu'une chaîne circulaire valide doit avoir un nombre impair de points supérieur à 1.

COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0), (1 0, 0 1))

Une courbe composée est une courbe continue unique qui comporte à la fois des segments incurvés (circulaires) et des segments linéaires. Cela signifie qu'en plus d'avoir des composants bien formés, le point final de chaque composant (sauf le dernier) doit coïncider avec le point de départ du composant suivant.

CURVEPOLYGONE(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1))

Exemple de courbe composée dans un polygone courbe : CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1,4 0,4, 1,6 0,4, 1,6 0,5, 1,7 1) )

Un CURVEPOLYGON est comme un polygone, avec un anneau extérieur et zéro ou plusieurs anneaux intérieurs. La différence est qu'un anneau peut prendre la forme d'une chaîne circulaire, d'une chaîne linéaire ou d'une chaîne composée.

Depuis PostGIS 1.4, PostGIS prend en charge les courbes composées dans un polygone de courbe.

MULTICOURBE((0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4))

Le MULTICURVE est une collection de courbes, qui peuvent inclure des chaînes linéaires, des chaînes circulaires ou des chaînes composées.

MULTISURFACE(CURVEPOLYGONE(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10 ),(11 11, 11,5 11, 11 11,5, 11 11)))

Il s'agit d'un ensemble de surfaces, qui peuvent être des polygones (linéaires) ou des polygones courbes.

PostGIS antérieur à 1.4 ne prend pas en charge les courbes composées dans un polygone de courbe, mais PostGIS 1.4 et versions ultérieures prennent en charge l'utilisation de courbes composées dans un polygone de courbe.

Toutes les comparaisons à virgule flottante dans l'implémentation SQL-MM sont effectuées avec une tolérance spécifiée, actuellement 1E-8.


Postgis

A présent, vous devriez avoir acquis une certaine expérience de travail avec OpenStreetMap et Quantum GIS. Vous avez découvert certaines des différentes manières de stocker des données cartographiques. Les fichiers ouverts et enregistrés dans JOSM ont une extension .osm. Ces fichiers stockent les données cartographiques au format XML, qui est un excellent format pour transmettre des informations sur Internet. Dans QGIS, nous enregistrons souvent les données cartographiques sous forme de fichiers de formes, avec une extension .shp. Ces types de fichiers offrent un accès plus rapide et sont couramment utilisés pour l'analyse.

Ce que nous n'avons pas encore abordé, ce sont les bases de données, qui sont un moyen très rapide et utile de stocker des données cartographiques. La configuration d'une base de données n'est pas quelque chose que vous devrez faire si vous envisagez simplement de modifier OpenStreetMap ou d'effectuer des tâches simples avec QGIS. Mais pour ceux d'entre vous qui veulent aller plus loin, une base de données permettra un accès beaucoup plus performant à un ensemble de données. Par exemple, le serveur OpenStreetMap utilise une base de données pour stocker ses données cartographiques. Il utilise la base de données pour recevoir les modifications des mappeurs, pour envoyer de petits morceaux de la carte au format XML aux utilisateurs et pour afficher la carte sous forme de tuiles d'images sur le site Web principal - openstreetmap.org .

PostGIS fait fonctionner notre base de données spatialement

La base de données que nous utiliserons est PostgreSQL, une base de données relationnelle couramment utilisée. PostgreSQL est excellent pour stocker et interroger des données, mais il ne peut pas effectuer de tâches spatiales complexes. Afin de conserver les données géographiques et de les traiter, nous devons ajouter des extensions PostGIS. La combinaison de PostgreSQL et de PostGIS permet l'indexation spatiale des données, ce qui permet essentiellement à la base de données de calculer des requêtes de géodonnées, par exemple si une ligne coupe un polygone ou quel point se trouve à l'intersection de deux lignes. Dans ce chapitre, nous apprendrons comment configurer PostgreSQL sur Windows, comment créer une base de données et comment importer des fichiers de formes et des données OpenStreetMap dans notre base de données :

Installation de PostgreSQL et PostGIS

Créer et utiliser une base de données avec QGIS

Importer des données OSM dans votre base de données

Dans cette section, nous allons installer PostgreSQL, puis ajouter les extensions spatiales PostGIS. Ceci est assez facile à configurer à l'aide du programme d'installation en un clic.

Accédez au site Web de postgresql dans votre navigateur Web et recherchez la page de téléchargement ici : http://www.postgresql.org/download/

De là, vous pouvez trouver des instructions d'installation pour différents systèmes d'exploitation. Cliquez sur le lien "Windows".

Cette page explique ce que fera le programme d'installation en un clic. Il installera trois composants différents :

Serveur PostgreSQL : Le logiciel de base de données, le composant central

pgAdmin III : L'interface graphique pour gérer vos bases de données

StackBuilder : Un outil pour ajouter des applications supplémentaires que nous utiliserons

ceci pour ajouter les extensions PostGIS

Cliquez sur Télécharger.

Vous aurez plusieurs options d'installation différentes pour différentes versions du logiciel PostgreSQL. Le programme d'installation de la version 9.2.1 ne vous permet pas d'ajouter PostGIS via l'utilitaire StackBuilder, nous vous recommandons donc de télécharger le programme d'installation de la version 9.1.6. Cliquez sur le bouton qui dit Win x86-32. Il s'agit du programme d'installation de la version 32 bits de Windows.

Une fois le téléchargement terminé, exécutez le programme d'installation en un clic.

Cliquez sur "Suivant" pour naviguer dans l'assistant d'installation. Les options par défaut devraient convenir. Vous devrez fournir un mot de passe pour le premier utilisateur de la base de données (l'utilisateur est postgres). Cet utilisateur a des privilèges de superutilisateur, ce qui signifie qu'il peut faire ce qu'il veut, alors n'oubliez pas le mot de passe que vous utilisez !

Vous pouvez créer autant de bases de données que vous le souhaitez en utilisant Postgresql. Vous voudrez peut-être une base de données pour vos données géographiques et des bases de données distinctes pour les autres projets sur lesquels vous travaillez. Et vous voudrez peut-être que différentes personnes aient différents types d'accès à ces bases de données. À cette fin, chaque base de données que vous créez utilise le concept d'utilisateurs et de rôles. Une base de données doit toujours appartenir à un utilisateur, et cet utilisateur aura généralement besoin d'un mot de passe pour apporter des modifications à la base de données. Des utilisateurs supplémentaires peuvent être autorisés à accéder à une base de données et certains rôles peuvent leur être attribués. Par exemple, vous pouvez souhaiter qu'un utilisateur de base de données puisse uniquement lire les informations de la base de données, mais ne puisse pas les modifier. Ou vous voudrez peut-être un utilisateur qui peut ajouter des données, mais n'a pas l'autorisation de les supprimer. Avec les utilisateurs et les rôles, c'est possible. Pour l'instant, nous ne nous inquiéterons pas trop à ce sujet, rappelez-vous simplement que votre base de données appartient à un utilisateur, et pour accéder à la base de données, vous aurez besoin du nom et du mot de passe de l'utilisateur. Le premier utilisateur que nous créons (nommé postgres) est un superutilisateur, ce qui signifie qu'il a la permission de tout faire avec les bases de données.

Après avoir cliqué sur l'assistant et accepté les options de configuration par défaut, l'assistant installera tout pour vous. Cela peut prendre quelques minutes.

Une fois l'installation terminée, l'assistant vous demandera si vous souhaitez lancer StackBuilder, qui est l'utilitaire qui nous permettra d'installer PostGIS. Assurez-vous que la case est cochée avant de cliquer sur « Terminer ».

Nous avons maintenant installé avec succès PostgreSQL et nous devons ajouter les extensions PostGIS. Lorsque l'assistant StackBuilder s'ouvre, sélectionnez votre installation PostgresSQL dans le menu déroulant et cliquez sur Suivant. Ce sera quelque chose comme PostgreSQL 9.1 sur le port 5432.

Ouvrez l'onglet "Extensions spatiales" et cochez la case en regard de PostGIS 1.5 pour PostgreSQL 9.1. Encore une fois, nous utilisons PostGIS 1.5 car l'utilitaire que nous utiliserons pour importer les données OSM ne fonctionne pas toujours parfaitement avec la version 2.0.

Cliquez sur Suivant pour télécharger les extensions et les installer. Lorsque vous y êtes invité, cliquez sur « J'accepte » pour accepter les termes et conditions.

Le programme d'installation de PostGIS posera plus de questions, mais généralement les options par défaut conviennent. Vous pouvez lui dire de créer automatiquement la première base de données, mais nous apprendrons comment le faire nous-mêmes dans la section suivante.

Pour commencer l'installation de PostGIS, vous devrez fournir le mot de passe postgres que vous avez créé lors de l'installation de PostgreSQL.

Si vous êtes invité à installer le plug-in de chargement graphique shp2pgsql, cliquez sur « Oui ».

PostGIS sera installé. Une fois terminé, cliquez sur "Fermer" puis sur "Terminer".

Maintenant que nous avons installé tous les logiciels nécessaires, nous allons créer une base de données, puis l'utiliser comme source de données dans QGIS. Nous utiliserons pgAdmin III, qui est un client de base de données graphique utile pour interroger et modifier les bases de données.

PgAdmin III est le client officiel de PostgreSQL et vous permet d'utiliser le langage SQL pour manipuler vos tables de données. Il est également possible de créer et de manipuler des bases de données à partir de la ligne de commande, mais pour l'instant, pgAdmin III est un moyen simple de démarrer.

Ouvrez pgAdmin III. Il devrait être dans le menu Démarrer sous Tous les programmes -> PostgreSQL 9.1 -> pgAdmin III.

Dans le panneau de gauche sous Serveurs, faites un clic droit là où il est écrit PostgreSQL et cliquez sur « Se connecter ».

Saisissez le mot de passe utilisateur postgres que vous avez créé lors de l'installation du logiciel. N'oubliez pas que le nom d'utilisateur et le mot de passe sont requis pour que vous puissiez créer et accéder à une base de données.

Cliquez avec le bouton droit sur Bases de données et sélectionnez Nouvelle base de données.

Vous devez saisir quelques informations pour créer la nouvelle base de données : nom et propriétaire. Dans l'onglet Propriétés, donnez un nom à la nouvelle base de données. Dans cet exemple, nous nommons notre base de données gisdb. Nous devrions également donner à notre base de données un propriétaire. Puisque nous n'avons qu'un seul utilisateur pour le moment, donnons à notre base de données le propriétaire postgres. (Remarque : pour des raisons de sécurité, c'est généralement une bonne idée de créer des utilisateurs sans autorisation de superutilisateur, mais pour l'instant, nous ne nous en soucierons pas.)

Sous l'onglet Définition, conservez les valeurs par défaut, mais à côté de Modèle, sélectionnez template_postgis. Cela créera notre base de données avec les colonnes spatiales appropriées.

Cliquez sur OK pour créer la base de données. Vous verrez maintenant votre base de données répertoriée sous "Bases de données". Chargeons quelques exemples de données dans la base de données afin que nous puissions apprendre comment y accéder à partir de QGIS. Pour ce faire, nous allons utiliser un utilitaire qui convertit les fichiers de formes et les charge dans la base de données.

Assurez-vous que votre nouvelle base de données est sélectionnée et accédez à Plugins -> PostGIS Shapefile et DBF loader 1.5

Cliquez sur "Ajouter un fichier" et recherchez un fichier de formes sur votre système de fichiers. N'hésitez pas à utiliser les exemples de données fournis dans le manuel QGIS ( begin-qgis-samples.zip ).

Une fois que vous avez sélectionné un fichier, cliquez sur « Importer ». Si tout se passe bien, la sortie indiquera « Importation du fichier de forme terminée ».

Génial, nous avons donc créé une base de données et nous avons importé un fichier de formes comme exemple. Ouvrons maintenant QGIS et voyons comment accéder à notre base de données.

Ouvrez QGIS et cliquez sur le bouton "Ajouter des couches PostGIS".

Sous "Connexions" en haut, cliquez sur "Nouveau".

Donnez un nom à la nouvelle connexion. Sous la base de données, tapez gisdb (ou quel que soit le nom que vous avez donné à votre base de données). Entrez le nom d'utilisateur postgres et votre mot de passe ci-dessous.

Cliquez sur OK pour enregistrer les paramètres de connexion. Cliquez ensuite sur « Connecter » pour vous connecter à votre serveur PostgreSQL. Vous devrez peut-être saisir à nouveau votre nom d'utilisateur et votre mot de passe.

Si tout se passe bien, vous verrez la couche de fichier de formes que vous avez chargée dans la base de données disponible ici. Sélectionnez-le et cliquez sur « Ajouter » pour l'ajouter à votre carte.

Lorsque vous ajoutez la couche, vous devrez sélectionner un système de coordonnées dans lequel afficher les données. Vous souhaiterez probablement sélectionner WGS 84, qui est le système de coordonnées utilisé par OpenStreetMap.

Notez que la couche se comporte de la même manière que si vous aviez chargé un fichier directement dans QGIS. La seule différence est que si vous modifiez la couche, les modifications seront enregistrées dans votre base de données.

Maintenant que vous comprenez comment créer et accéder à une base de données à partir de QGIS, voyons comment nous pouvons charger des données OpenStreetMap dans notre base de données. Le chargement de données OSM est très utile car il est si complexe et il y a tellement de données à traiter qu'une base de données est bien plus efficace que de travailler avec des fichiers XML ou des fichiers de formes. Il est également utile de conserver nos données OSM dans une base de données pour les chapitres suivants de ce guide.

Pour importer des données OpenStreetMap dans notre base de données, nous allons installer quelques outils. L'outil principal s'appelle osm2pgsql, qui est un utilitaire qui charge les données XML OpenStreetMap dans un format que nous pouvons stocker dans la base de données. L'utilitaire est facile à configurer, nous devons simplement télécharger le programme, puis nous devons ajouter son emplacement à notre chemin système.

Pour télécharger la version Windows d'osm2pgsql, accédez à votre navigateur Web sur : http://wiki.openstreetmap.org/wiki/Osm2pgsql#Windows

Téléchargez le fichier nommé osm2pgsql.zip

Décompressez le fichier sur votre système. Si vous le souhaitez, déplacez le dossier dans un endroit qui restera inchangé, car nous devons ajouter son emplacement au chemin du système.

Dans le répertoire osm2pgsql que vous avez décompressé se trouve un fichier appelé osm2pgsql.exe. Il s'agit d'un programme que nous exécuterons pour importer les données, mais pour que le système les trouve, nous devons ajouter son emplacement au chemin du système. Cliquez sur le menu Démarrer et tapez "chemin système". Vous devriez voir une option nommée "Modifier les variables d'environnement système". Clique dessus.

Cliquez sur le bouton nommé "Variables d'environnement".

En bas, recherchez la variable nommée « Chemin » et cliquez sur « Modifier. "

Vous devez maintenant ajouter le répertoire où se trouve osm2pgsql.exe à la variable Path.

Ajoutez un point-virgule à la fin du répertoire précédent, puis saisissez le chemin complet du répertoire osm2pgsql.exe. Par exemple, si vous l'avez laissé dans le répertoire Téléchargements, cela peut être quelque chose comme C:UsersAdministratorDownloadsosm2pgsqlosm2pgsql

Phew! C'était la partie difficile. Il ne nous reste plus qu'à installer un plugin dans QGIS et nous pouvons facilement importer des données OSM dans notre base de données.

Ouvrez QGIS et accédez à Plugins -> Fetch Python Plugins.

Nous devons ajouter un nouveau référentiel de plugins. Cliquez sur l'onglet « Référentiels ».

À côté du nom : saisissez « dbsgeo.com »

A côté de l'URL des plugins : tapez « http://qgis.dbsgeo.com »

Cliquez de nouveau sur l'onglet "Plugins" et recherchez le plug-in nommé "OSM Tools". Vous pouvez le taper dans le champ de recherche pour le trouver facilement.

Sélectionnez le plugin et cliquez sur « Installer le plugin ».

Le plugin s'installera et devrait vous donner un message indiquant que le "Plugin a été installé avec succès".

Fermez les menus. Vous devriez voir un nouveau menu dans votre barre de menu supérieure nommé "Outils OSM".

Génial! Nous pouvons maintenant utiliser le plugin OSM Tools pour importer facilement des données dans notre base de données. Au cas où vous vous poseriez des questions sur osm2pgsql, tant que nous utiliserons le plugin, nous n'aurons jamais besoin de le traiter directement. Le plugin OSM Tools utilise osm2pgsql dans les coulisses.

Utilisons le plugin pour importer les données OpenStreetMap dans notre base de données. Si vous n'avez pas encore de fichier .osm que vous pouvez utiliser, essayez de télécharger un fichier à partir de http://metro.teczno.com/ . Ce site héberge de nombreux extraits OSM pour différentes villes. Trouvez une ville à importer et téléchargez le fichier BZ2 correspondant. Les fichiers BZ2 sont des versions compressées des fichiers .osm normaux. Les fichiers PBF sont encore plus petits, mais notre version Windows d'osm2pgsql ne fonctionnera pas avec ce type de fichier. Si ce site Web n'a pas de ville qui vous intéresse, vous pouvez obtenir des extraits plus volumineux à l'échelle du pays à partir de http://download.geofabrik.de/osm/ , ou télécharger une zone spécifique à partir de http://hot-export. geofabrik.de .

Lorsque vous disposez d'un fichier OSM que vous pouvez utiliser, accédez au menu Outils OSM dans QGIS et sélectionnez « Importer dans PostGIS (osm2pgsql) ».

Cela ouvrira un nouvel onglet sur le côté droit de QGIS.

Il ne nous reste plus qu'à spécifier le fichier d'entrée (le fichier OSM) et la base de données dans laquelle nous voulons le charger.

Cliquez sur le bouton "Entrée" et localisez le fichier OSM que vous souhaitez charger. N'oubliez pas que ce fichier doit se terminer par .osm ou .osm.bz2.

Ne vous inquiétez pas pour le "Style".

Sélectionnez « Ma première base de données » sous « Base de données ».

Notez que cette liste n'affichera que les bases de données que vous avez enregistrées dans QGIS, comme nous l'avons fait à la fin de la section 2.

Vous devrez peut-être saisir le mot de passe de votre base de données et appuyer sur Entrée, si vous voyez quelque chose comme ceci au bas du panneau :

L'importation peut prendre un certain temps, selon la taille du fichier d'importation. Il peut également arriver que osm2pgsql manque de mémoire pendant qu'il essaie d'importer le fichier OSM. Si vous obtenez un message d'erreur tel que « Erreur d'allocation des nœuds », cochez la case « Réduire la mémoire (plus lent) » et réessayez.

La sortie devrait vous indiquer que l'importation est terminée.

Revenez maintenant à « Ajouter une couche PostGIS ».

Lorsque vous vous reconnecterez à votre base de données, vous verrez quatre nouvelles tables.

Ce sont les tables créées par osm2pgsql dans votre base de données. Il y a une couche pour chaque type de données différent - lignes, points et polygones, et une couche supplémentaire qui contient les routes principales. Essayez de les ajouter pour voir vos données affichées dans QGIS !

Jusqu'à présent, nous avons vu comment installer le logiciel pour que notre base de données soit opérationnelle, comment importer des fichiers de formes dans une base de données et comment importer des données OpenStreetMap. Nous avons également appris comment nous connecter à notre base de données à partir de QGIS en utilisant notre nom et notre mot de passe, et travailler directement avec les données. Examinons maintenant quelques questions courantes sur les bases de données géospatiales.

Puis-je avoir plus d'une base de données sur mon ordinateur ?

Oui, vous pouvez avoir autant de bases de données que vous le souhaitez. Vous ne voulez probablement pas conserver les données de projets complètement différents dans la même base de données, simplement pour des raisons d'organisation. Mais il est logique de stocker les données d'un projet dans une seule base de données.

Pourquoi ai-je besoin d'utilisateurs ? Ne devrait-il pas suffire d'avoir des noms de bases de données différents ?

Si vous ne gérez que des bases de données pour un usage personnel, vous n'avez probablement pas à vous soucier des différents utilisateurs et rôles. Mais si vous êtes un utilisateur avancé et que vous souhaitez permettre aux personnes d'accéder à vos bases de données à distance, vous souhaiterez probablement configurer des utilisateurs avec des autorisations limitées.

Dans la base de données que nous avons créée, chacune des « couches » est stockée dans une table. Une table est une partie d'une base de données qui stocke un certain type d'informations, et une base de données peut contenir de nombreuses tables différentes. Lorsque nous avons importé les données OSM, le programme a créé quatre tables - la première table stocke les données de polygone, la deuxième les données de point, et ainsi de suite. Étant donné que ces types d'informations ont des types de données intrinsèquement différents, ils sont stockés dans des tables distinctes.

Comment mettre à jour ma base de données lorsque les données OSM ont changé ?

Il existe des moyens assez complexes de le faire automatiquement, mais le moyen le plus simple est de supprimer les tables créées par osm2pgsql, de télécharger un fichier d'extrait à jour et de l'importer dans votre base de données.

Nous avons fait beaucoup dans ce chapitre, vous devriez donc être fier. Nous avons appris à installer PostgreSQL et à ajouter des extensions PostGIS sous Windows. Nous avons ensuite vu comment créer une base de données géospatiale et y charger des fichiers de formes. Nous avons appris à accéder à notre base de données depuis QGIS. Enfin, nous avons installé osm2pgsql et le plugin OSM Tools afin de pouvoir charger les données OpenStreetMap directement dans notre base de données. Bien fait!

Pour ceux d'entre vous qui sont intéressés, nous avons fourni une annexe qui décrit les étapes de configuration de PostgreSQL sur Ubuntu Linux. Nous n'irons pas pas à pas dans les détails du système d'exploitation, mais si vous avez déjà de l'expérience avec Linux, vous devriez pouvoir suivre.

Installer PostgreSQL et PostGIS

Pour installer PostgreSQL et PostGIS sur Ubuntu 11.04 (Natty Narwhal), exécutez cette commande :

Si vous installez sur Ubuntu version 11.10 ou supérieure, exécutez :

Notez la version de Postgresql que vous avez installée ici. (8.4 ou 9.1)

Créer une base de données

Avant de configurer une base de données, nous devons modifier les paramètres PostgreSQL. Ouvrez le fichier de configuration avec nano en exécutant :

Si votre version de Postgresql est 9.1, ce fichier sera dans /etc/postgresql/9.1/main/pg_hba.conf.

Allez au bas du fichier. Il y a quatre lignes ici et nous devons modifier les autorisations d'accès local pour qu'elles soient « de confiance ». Cela nous permettra d'accéder à la base de données depuis la même machine sans mot de passe. La configuration ressemblera à ceci :

Enregistrez les modifications avec Ctrl-O et Entrée, terminez puis quittez nano avec Ctrl-X.

Nous devons maintenant redémarrer PostgreSQL pour que les nouvelles modifications prennent effet.

Nous pouvons maintenant créer notre base de données avec les commandes suivantes :

psql est un utilitaire pour interagir avec PostgreSQL. Nous l'exécutons ici pour créer une base de données nommée osm en utilisant l'utilisateur postgres. Nous avons fait la même chose dans le chapitre sur la création d'une base de données sous Windows, mais ici nous le faisons en utilisant la ligne de commande.

Installer Osm2pgsql

Nous allons maintenant utiliser l'utilitaire osm2pgsql pour importer les données OpenStreetMap dans notre base de données. Commençons par l'installer.

Si vous n'avez pas installé add-apt-repository, ajoutez-le avec :

Ajoutez le référentiel contenant les packages :

Mettez à jour la liste des packages locaux pour récupérer le nouveau dépôt :

Installer le paquet osm2pgsql

Si vous êtes invité à créer une base de données, répondez « Non ». Il vous demandera de toute façon le nom de la base de données à cause d'une erreur dans le programme d'installation, alors appuyez simplement sur Entrée pour accepter les valeurs par défaut.

Importer des données

Nous pouvons maintenant importer des données OpenStreetMap dans notre base de données. Vous aurez besoin d'un fichier de données, que vous pouvez facilement télécharger sur le site Web de GeoFabrik. Pour télécharger un extrait OSM, recherchez le lien vers le fichier et utilisez wget pour télécharger le fichier sur votre système Ubuntu. Par exemple:

Selon la taille de l'extrait, le téléchargement peut prendre quelques minutes.

Chargez les données dans la base de données en exécutant :

Vous devrez peut-être fournir certains indicateurs pour osm2pgsql si votre système manque de mémoire. Si vous obtenez une erreur telle que "Mémoire insuffisante pour le cache de nœud dense, réduisez --cache size", essayez de l'exécuter avec ces options :

En suivant cet exemple, la commande serait :

Cette commande prendra un certain temps à s'exécuter, selon la taille de l'importation. Vous verrez une sortie qui ressemble à ceci :

Vous devrez peut-être ajuster -C 16000 pour qu'il corresponde à votre RAM si vous avez moins de 16 Go de RAM. Les résultats les plus rapides sont obtenus lors de l'utilisation d'un fichier .pbf.


1 réponse 1

De quel type de base de données SQL disposez-vous ? PostGIS, une extension de PostgreSQL, est probablement la meilleure solution si vous partez de zéro. PostgreSQL fournit déjà un type de champ géométrique, et PostGIS ajoute la prise en charge de la projection, le traitement spatial et inclut un utilitaire pour importer des fichiers de formes.

Si vous souhaitez une base de données basée sur des fichiers, vous pouvez utiliser à la place Spatialite, une extension de SQLite. Si vous utilisez déjà une base de données différente, il existe des fonctionnalités spatiales dans MySQL, Microsoft SQL Server et Oracle. Si vous n'avez pas besoin de prise en charge du traitement spatial et de la projection, vous pouvez convertir en texte bien connu à l'aide du logiciel gratuit QGIS (basé sur l'interface graphique) ou GDAL (par programmation) et le stocker dans un champ de texte dans n'importe quelle base de données. J'aurais besoin de plus d'informations sur votre projet pour vous donner une meilleure réponse.


Le format DBF a été développé il y a plus de 30 ans, lorsque le PC typique disposait de 640 Ko de RAM. Il est très facile à lire, à l'époque où j'ai écrit un pilote de base de données Autocad pour cela (oui, je suis vieux). Fondamentalement, tout ce que vous avez à faire est de créer quelques structures C et de les charger/vider depuis/vers le disque.

Il existe une bibliothèque Python pour lire les fichiers DBF, je l'utilise de temps en temps car Shapefiles (un format de données SIG populaire) contient souvent un fichier DBF.

Peut-être que vous voulez jeter un oeil à ce projet : http://sourceforge.net/projects/dbfconverter/

Lorsque vous dites que vous utilisez dBase, je suppose que vous avez accès à l'invite de point (.).

À l'invite de points, convertissez le fichier .dbf en un fichier texte délimité.

Reconvertissez le fichier texte délimité en un fichier de données MySql avec la commande nécessaire dans MySql. Je ne connais pas la commande réelle pour cela. Tous les SGBD auront des commandes pour faire ce travail.

Pour éliminer les doublons, vous devrez le faire au moment de remplir les données dans le fichier .dbf via un programme écrit en dBase.


4.5. Construire des index

Les index permettent d'utiliser une base de données spatiale pour de grands ensembles de données. Sans indexation, toute recherche d'une caractéristique nécessiterait une « analyse séquentielle » de chaque enregistrement de la base de données. L'indexation accélère la recherche en organisant les données dans un arbre de recherche qui peut être rapidement parcouru pour trouver un enregistrement particulier. PostgreSQL prend en charge trois types d'index par défaut : les index B-Tree, les index R-Tree et les index GiST.

Les B-Trees sont utilisés pour les données qui peuvent être triées le long d'un axe, par exemple des nombres, des lettres, des dates. Les données SIG ne peuvent pas être triées rationnellement le long d'un axe (qui est le plus grand, (0,0) ou (0,1) ou (1,0) ?), donc l'indexation B-Tree ne nous est d'aucune utilité.

Les R-Trees divisent les données en rectangles, et sous-rectangles, et sous-sous-rectangles, etc. Les R-Trees sont utilisés par certaines bases de données spatiales pour indexer les données SIG, mais l'implémentation PostgreSQL R-Tree n'est pas aussi robuste que la GiST la mise en oeuvre.

Les index GiST (Generalized Search Trees) divisent les données en "choses d'un côté", "choses qui se chevauchent", "choses qui sont à l'intérieur" et peuvent être utilisés sur un large éventail de types de données, y compris les données SIG. PostGIS utilise un index R-Tree implémenté au-dessus de GiST pour indexer les données SIG.

4.5.1. Index GiST

GiST signifie "Generalized Search Tree" et est une forme générique d'indexation. En plus de l'indexation SIG, GiST est utilisé pour accélérer les recherches sur toutes sortes de structures de données irrégulières (tableaux d'entiers, données spectrales, etc.) qui ne se prêtent pas à l'indexation B-Tree normale.

Une fois qu'une table de données SIG dépasse quelques milliers de lignes, vous souhaiterez créer un index pour accélérer les recherches spatiales des données (à moins que toutes vos recherches soient basées sur des attributs, auquel cas vous souhaiterez créer un index normal sur le champs d'attribut).

La syntaxe pour construire un index GiST sur une colonne "géométrie" est la suivante :

La construction d'un index spatial est un exercice intensif en calcul : sur des tables d'environ 1 million de lignes, sur une machine Solaris à 300 MHz, nous avons constaté que la construction d'un index GiST prend environ 1 heure. Après avoir construit un index, il est important de forcer PostgreSQL à collecter des statistiques de table, qui sont utilisées pour optimiser les plans de requête :

Les index GiST ont deux avantages par rapport aux index R-Tree dans PostgreSQL. Premièrement, les index GiST sont "null safe", ce qui signifie qu'ils peuvent indexer des colonnes qui incluent des valeurs nulles. Deuxièmement, les index GiST prennent en charge le concept de "perte" qui est important lorsqu'il s'agit d'objets SIG plus grands que la taille de page PostgreSQL 8K. La perte permet à PostgreSQL de ne stocker que la partie "importante" d'un objet dans un index -- dans le cas des objets SIG, juste le cadre de délimitation. Les objets SIG de plus de 8 Ko entraîneront l'échec des index R-Tree lors du processus de création.

4.5.2. Utiliser les index

Normalement, les index accélèrent de manière invisible l'accès aux données : une fois l'index créé, le planificateur de requêtes décide de manière transparente quand utiliser les informations d'index pour accélérer un plan de requête. Malheureusement, le planificateur de requêtes PostgreSQL n'optimise pas bien l'utilisation des index GiST, donc parfois, les recherches qui devraient utiliser un index spatial à la place utilisent par défaut un balayage de séquence de la table entière.

Si vous constatez que vos index spatiaux ne sont pas utilisés (ou vos index d'attributs, d'ailleurs), vous pouvez faire plusieurs choses :

Tout d'abord, assurez-vous que des statistiques sont collectées sur le nombre et la distribution des valeurs dans une table, afin de fournir au planificateur de requêtes de meilleures informations pour prendre des décisions concernant l'utilisation de l'index. Pour les installations PostgreSQL 7.4 et ci-dessous, cela se fait en exécutant update_geometry_stats([table_name, column_name]) (répartition des calculs) et ANALYSE DU VIDE [nom_table] [nom_colonne] (calculer le nombre de valeurs). Démarrer avec PostgreSQL 8.0 en cours d'exécution ANALYSE DU VIDE fera les deux opérations. Vous devriez de toute façon nettoyer régulièrement vos bases de données - de nombreux DBA PostgreSQL ont VIDE exécuter régulièrement une tâche cron en dehors des heures de pointe.

Si l'aspiration ne fonctionne pas, vous pouvez forcer le planificateur à utiliser les informations d'index en utilisant le SET ENABLE_SEQSCAN=OFF commander. Vous ne devez utiliser cette commande qu'avec parcimonie, et uniquement sur les requêtes indexées spatialement : en général, le planificateur sait mieux que vous quand utiliser les index B-Tree normaux. Une fois que vous avez exécuté votre requête, vous devez envisager de réactiver ENABLE_SEQSCAN, afin que les autres requêtes utilisent le planificateur normalement.

A partir de la version 0.6, il ne devrait plus être nécessaire de forcer le planificateur à utiliser l'index avec ENABLE_SEQSCAN .

Si vous trouvez que le planificateur se trompe sur le coût des analyses séquentielles vs index, essayez de réduire la valeur de random_page_cost dans postgresql.conf ou utilisez SET random_page_cost=#. La valeur par défaut du paramètre est 4, essayez de la définir sur 1 ou 2. La décrémentation de la valeur rend le planificateur plus enclin à utiliser les analyses d'index.


Données vectorielles¶

De nombreuses fonctionnalités disponibles dans QGIS fonctionnent de la même manière, quelle que soit la source de données vectorielles. Cependant, en raison des différences de spécifications de formats (fichiers de formes ESRI, formats de fichiers MapInfo et MicroStation, bases de données AutoCAD DXF, PostGIS, SpatiaLite, DB2, Oracle Spatial et MSSQL Spatial, et bien d'autres), QGIS peut gérer différemment certaines de leurs propriétés. Cette section décrit comment travailler avec ces spécificités.

QGIS prend en charge les types d'entités (multi)points, (multi)lignes, (multi)polygones, CircularString, CompoundCurve, CurvePolygon, MultiCurve, MultiSurface, tous avec des valeurs Z et/ou M.

Vous devez également noter que certains pilotes ne prennent pas en charge certains de ces types de fonctionnalités, tels que CircularString, CompoundCurve, CurvePolygon, MultiCurve, MultiSurface. QGIS les convertira en fonction (multi)polygonale.

ESRI Shapefiles¶

Le shapefile ESRI est toujours l'un des formats de fichiers vectoriels les plus utilisés dans QGIS.Cependant, ce format de fichier a certaines limitations que certains autres formats de fichier n'ont pas (comme Geopackage, spatialite). Le support est fourni par la bibliothèque de fonctionnalités simples OGR.

Un shapefile se compose en fait de plusieurs fichiers. Les trois suivants sont obligatoires :

  1. .shp fichier contenant les géométries des entités
  2. .dbf fichier contenant les attributs au format dBase
  3. .shx fichier d'index

Les fichiers de formes peuvent également inclure un fichier avec un .prj suffixe, qui contient les informations de projection. S'il est très utile d'avoir un fichier de projection, ce n'est pas obligatoire. Un jeu de données de fichier de formes peut contenir des fichiers supplémentaires. Pour plus de détails, consultez les spécifications techniques d'ESRI à l'adresse http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf.

Améliorer les performances des fichiers de formes

Pour améliorer les performances de dessin d'un fichier de formes, vous pouvez créer un index spatial. Un index spatial améliorera la vitesse du zoom et du panoramique. Les index spatiaux utilisés par QGIS ont un .qix extension.

Utilisez ces étapes pour créer l'index :

  • Chargez un fichier de formes (voir Le panneau du navigateur)
  • Ouvrez le Propriétés de la couche dialogue en double-cliquant sur le nom du fichier de formes dans la légende ou en cliquant avec le bouton droit et en choisissant Propriétés depuis le menu contextuel.
  • Dans le Général onglet, cliquez sur le [Créer un index spatial] bouton.

Problème de chargement d'un fichier shape .prj

Si vous chargez un fichier de formes avec un .prj et QGIS n'est pas en mesure de lire le système de référence de coordonnées à partir de ce fichier, vous devrez définir la projection appropriée manuellement dans le Général onglet du Propriétés de la couche dialogue de la couche en cliquant sur le [Spécifier. ] bouton. Ceci est dû au fait que .prj Les fichiers ne fournissent souvent pas les paramètres de projection complets tels qu'utilisés dans QGIS et répertoriés dans le SCR dialogue.

Pour la même raison, si vous créez un nouveau shapefile avec QGIS, deux fichiers de projection différents sont créés : un .prj fichier avec des paramètres de projection limités, compatible avec le logiciel ESRI, et un .qpj fichier, fournissant les paramètres complets du SIR utilisé. Chaque fois que QGIS trouve un .qpj fichier, il sera utilisé à la place du .prj .

Fichiers texte délimités¶

Les données tabulaires sont un format très courant et largement utilisé en raison de leur simplicité et de leur lisibilité. Les données peuvent être visualisées et modifiées même dans un éditeur de texte brut. Un fichier texte délimité est une table attributaire avec chaque colonne séparée par un caractère défini et chaque ligne séparée par un saut de ligne. La première ligne contient généralement les noms de colonnes. Un type courant de fichier texte délimité est un fichier CSV (valeurs séparées par des virgules), chaque colonne étant séparée par une virgule.

Ces fichiers de données peuvent également contenir des informations de position sous deux formes principales :

  • En tant que coordonnées de point dans des colonnes séparées
  • En tant que représentation textuelle bien connue (WKT) de la géométrie

QGIS vous permet de charger un fichier texte délimité sous forme de couche ou de table ordinale. Mais vérifiez d'abord que le fichier répond aux exigences suivantes :

  1. Le fichier doit avoir une ligne d'en-tête délimitée de noms de champs. Cela doit être la première ligne du fichier texte.
  2. La ligne d'en-tête doit contenir des champs avec une définition de géométrie. Ces champs peuvent avoir n'importe quel nom.
  3. Les coordonnées X et Y (si la géométrie est définie par des coordonnées) doivent être spécifiées sous forme de nombres. Le système de coordonnées n'est pas important.
  4. Si vous avez des données qui ne sont pas une chaîne (texte) et que le fichier est un fichier CSV, vous devez avoir un fichier CSVT (voir la section Fichiers CSVT).

Comme exemple de fichier texte valide, nous importons le fichier de données de point d'élévation elevp.csv fourni avec l'exemple de jeu de données QGIS (voir la section Exemple de données):

Quelques éléments à noter sur le fichier texte :

  1. L'exemple de fichier texte utilise (point virgule) comme délimiteur. N'importe quel caractère peut être utilisé pour délimiter les champs.
  2. La première ligne est la ligne d'en-tête. Il contient les champs X , Oui et ELEV .
  3. Pas de citations ( " ) sont utilisés pour délimiter les champs de texte.
  4. Les coordonnées X sont contenues dans le X domaine.
  5. Les coordonnées Y sont contenues dans le Oui domaine.

Fichiers CSVT¶

Lors du chargement de fichiers CSV, le pilote OGR suppose que tous les champs sont des chaînes (c'est-à-dire du texte) sauf indication contraire. Vous pouvez créer un fichier CSVT pour indiquer à OGR (et QGIS) le type de données des différentes colonnes :

Taper Nom Exemple
Nombre entier Entier 4
Nombre décimal Réel 3.456
Date Date (AAAA-MM-JJ) 2016-07-28
Temps Heure (HH:MM:SS+nn) 18:33:12+00
Date et heure DateHeure (AAAA-MM-JJ HH:MM:SS+nn) 2016-07-28 18:33:12+00

Le fichier CSVT est un Une ligne fichier texte brut avec les types de données entre guillemets et séparés par des virgules, par exemple :

Vous pouvez même spécifier la largeur et la précision de chaque colonne, par exemple :

Ce fichier est enregistré dans le même dossier que le .csv fichier, avec le même nom, mais .csvt comme rallonge.

Vous pouvez trouver plus d'informations sur Pilote GDAL CSV.

D'autres informations précieuses pour les utilisateurs avancés¶

Les entités avec des géométries courbes (CircularString, CurvePolygon et CompoundCurve) sont prises en charge. Voici trois exemples de ces types de géométrie sous forme de texte délimité avec des géométries WKT :

Le texte délimité prend également en charge les coordonnées Z et M dans les géométries :

Couches PostGIS¶

Les couches PostGIS sont stockées dans une base de données PostgreSQL. Les avantages de PostGIS sont ses capacités d'indexation spatiale, de filtrage et d'interrogation qu'il offre. En utilisant PostGIS, les fonctions vectorielles telles que la sélection et l'identification fonctionnent plus précisément qu'avec les couches OGR dans QGIS.

Couches PostGIS

Normalement, une couche PostGIS est définie par une entrée dans la table geometry_columns. QGIS peut charger des couches qui n'ont pas d'entrée dans la table geometry_columns. Cela inclut à la fois les tables et les vues. La définition d'une vue spatiale fournit un moyen puissant de visualiser vos données. Reportez-vous à votre manuel PostgreSQL pour plus d'informations sur la création de vues.

Cette section contient quelques détails sur la façon dont QGIS accède aux couches PostgreSQL. La plupart du temps, QGIS devrait simplement vous fournir une liste de tables de bases de données qui peuvent être chargées, et il les chargera sur demande. Cependant, si vous rencontrez des difficultés pour charger une table PostgreSQL dans QGIS, les informations ci-dessous peuvent vous aider à comprendre les messages QGIS et vous indiquer comment modifier la définition de la table ou de la vue PostgreSQL pour permettre à QGIS de la charger.

Clé primaire¶

QGIS requiert que les couches PostgreSQL contiennent une colonne pouvant être utilisée comme clé unique pour la couche. Pour les tables, cela signifie généralement que la table a besoin d'une clé primaire ou d'une colonne avec une contrainte unique. Dans QGIS, cette colonne doit être de type int4 (un entier de taille 4 octets). Alternativement, la colonne ctid peut être utilisée comme clé primaire. Si une table manque de ces éléments, la colonne oid sera utilisée à la place. Les performances seront améliorées si la colonne est indexée (notez que les clés primaires sont automatiquement indexées dans PostgreSQL).

QGIS propose une case à cocher Sélectionnez à l'identifiant qui est activé par défaut. Cette option obtient les identifiants sans les attributs, ce qui est plus rapide dans la plupart des cas.

Si la couche PostgreSQL est une vue, la même exigence existe, mais les vues n'ont pas toujours des clés primaires ou des colonnes avec des contraintes uniques sur elles. Vous devez définir un champ de clé primaire (doit être un entier) dans la boîte de dialogue QGIS avant de pouvoir charger la vue. Si une colonne appropriée n'existe pas dans la vue, QGIS ne chargera pas la couche. Si cela se produit, la solution consiste à modifier la vue afin qu'elle inclue une colonne appropriée (un type d'entier et soit une clé primaire soit avec une contrainte unique, de préférence indexée).

Quant au tableau, une case à cocher Sélectionnez à l'identifiant est activé par défaut (voir ci-dessus pour la signification de la case à cocher). Il peut être judicieux de désactiver cette option lorsque vous utilisez des vues coûteuses.

Table QGIS layer_style et sauvegarde de la base de données¶

Si vous souhaitez effectuer une sauvegarde de votre base de données PostGIS en utilisant le pg_dump et pg_restore commandes et que les styles de calque par défaut enregistrés par QGIS ne parviennent pas à être restaurés par la suite, vous devez définir l'option XML sur DOCUMENT et la restauration fonctionnera.

Filtrer côté base de données¶

QGIS permet de filtrer les fonctionnalités déjà côté serveur. Vérifier la Paramètres ‣ Options ‣ Sources de données ‣ Exécuter des expressions côté serveur postgres si possible case à cocher pour le faire. Seules les expressions prises en charge seront envoyées à la base de données. Les expressions utilisant des opérateurs ou des fonctions non pris en charge se replieront gracieusement sur l'évaluation locale.

Prise en charge des types de données PostgreSQL¶

La plupart des types de données courants sont pris en charge par le fournisseur PostgreSQL : entier, flottant, varchar, géométrie et horodatage.

Les types de données de tableau ne sont pas pris en charge.

Importer des données dans PostgreSQL¶

Les données peuvent être importées dans PostgreSQL/PostGIS à l'aide de plusieurs outils, notamment le plug-in DB Manager et les outils de ligne de commande shp2pgsql et ogr2ogr.

Gestionnaire de base de données¶

QGIS est livré avec un plugin de base nommé DB Manager . Il peut être utilisé pour charger des fichiers de formes et d'autres formats de données, et il inclut la prise en charge des schémas. Voir section Plugin du gestionnaire de base de données pour plus d'informations.

Shp2pgsql¶

PostGIS inclut un utilitaire appelé shp2pgsql qui peut être utilisé pour importer des fichiers de formes dans une base de données compatible PostGIS. Par exemple, pour importer un fichier de formes nommé lacs.shp dans une base de données PostgreSQL nommée gis_data , utilisez la commande suivante :

Cela crée un nouveau calque nommé lacs_nouveau dans le gis_data base de données. La nouvelle couche aura un identifiant de référence spatiale (SRID) de 2964. Voir la section Arbeiten mit Projektionen pour plus d'informations sur les systèmes de référence spatiale et les projections.

Exporter des jeux de données depuis PostGIS

Comme l'outil d'importation shp2pgsql, il existe également un outil pour exporter les jeux de données PostGIS sous forme de fichiers de formes : pgsql2shp. Ceci est expédié dans votre distribution PostGIS.

Ogr2ogr¶

outre shp2pgsql et Gestionnaire de bases de données, il existe un autre outil pour alimenter les géodonnées dans PostGIS : ogr2ogr. Cela fait partie de votre installation GDAL.

Pour importer un fichier de formes dans PostGIS, procédez comme suit :

Cela importera le fichier de formes alaska.shp dans la base de données PostGIS postgis en utilisant l'utilisateur postgres avec le mot de passe Top secret sur le serveur hôte myhost.de.

Notez qu'OGR doit être construit avec PostgreSQL pour prendre en charge PostGIS. Vous pouvez le vérifier en tapant (dans )

Si vous préférez utiliser PostgreSQL’s COPIE commande au lieu de la valeur par défaut INSÉRER DANS méthode, vous pouvez exporter la variable d'environnement suivante (au moins disponible sur et ):

ogr2ogr ne crée pas d'index spatiaux comme shp2pgsl Est-ce que. Vous devez les créer manuellement, en utilisant la commande SQL normale CRÉER UN INDEX ensuite comme étape supplémentaire (comme décrit dans la section suivante Améliorer les performances).

Améliorer les performances¶

La récupération des fonctionnalités d'une base de données PostgreSQL peut prendre beaucoup de temps, en particulier sur un réseau. Vous pouvez améliorer les performances de dessin des couches PostgreSQL en vous assurant qu'un index spatial PostGIS existe sur chaque couche de la base de données. PostGIS prend en charge la création d'un index GiST (Generalized Search Tree) pour accélérer les recherches spatiales des données (les informations de l'index GiST sont extraites de la documentation PostGIS disponible sur http://postgis.net).

Vous pouvez utiliser le DBManager pour créer un index sur votre couche. Vous devez d'abord sélectionner le calque et cliquer sur Tableau ‣ Modifier le tableau, aller à Index onglet et cliquez sur [Ajouter un index spatial].

La syntaxe pour créer un index GiST est :

Notez que pour les grandes tables, la création de l'index peut prendre beaucoup de temps. Une fois l'index créé, vous devez effectuer un ANALYSE DU VIDE . Voir la documentation PostGIS (POSTGIS-PROJECT Literatur und Internetreferenzen) pour plus d'informations.

Voici un exemple de création d'un index GiST :

Couches vectorielles traversant 180° de longitude¶

De nombreux packages SIG n'enveloppent pas les cartes vectorielles avec un système de référence géographique (lat/lon) traversant la ligne de longitude 180 degrés (http://postgis.refractions.net/documentation/manual-2.0/ST_Shift_Longitude.html). En conséquence, si nous ouvrons une telle carte dans QGIS, nous verrons deux emplacements éloignés et distincts, qui devraient apparaître l'un près de l'autre. Dans Figure_vector_crossing, le petit point à l'extrême gauche du canevas de la carte (Îles Chatham) doit se trouver dans la grille, à droite des îles principales de Nouvelle-Zélande.

Carte en lat/lon traversant la ligne de longitude 180°

Une solution de contournement consiste à transformer les valeurs de longitude à l'aide de PostGIS et du ST_Shift_Longitude une fonction. Cette fonction lit chaque point/sommet dans chaque composant de chaque entité d'une géométrie, et si la coordonnée de longitude est < 0°, elle y ajoute 360°. Le résultat est une version 0° - 360° des données à tracer sur une carte centrée à 180°.

Traversée de 180° de longitude en appliquant la ST_Shift_Longitude une fonction

Usage¶

  • Importer des données dans PostGIS (Importation de données dans PostgreSQL) en utilisant, par exemple, le plugin DB Manager.
  • Utilisez l'interface de ligne de commande PostGIS pour exécuter la commande suivante (dans cet exemple, “TABLE” est le nom réel de votre table PostGIS) : gis_data=# update TABLE set the_geom=ST_Shift_Longitude(the_geom)
  • Si tout s'est bien passé, vous devriez recevoir une confirmation du nombre de fonctionnalités mises à jour. Ensuite, vous pourrez charger la carte et voir la différence (Figure_vector_crossing_map).

Couches SpatiaLite¶

Si vous souhaitez enregistrer une couche vectorielle au format SpatiaLite, vous pouvez le faire en cliquant avec le bouton droit sur la couche dans la légende. Ensuite, cliquez sur Enregistrer sous. , définissez le nom du fichier de sortie et sélectionnez ‘SpatiaLite’ comme format et le CRS. En outre, vous pouvez sélectionner ‘SQLite’ comme format, puis ajouter SPATIALITE=OUI dans le champ d'option de création de source de données OGR. Cela indique à OGR de créer une base de données SpatiaLite. Voir aussi http://www.gdal.org/ogr/drv_sqlite.html.

QGIS prend également en charge les vues modifiables dans SpatiaLite.

Si vous souhaitez créer une nouvelle couche SpatiaLite, veuillez vous référer à la section Création d'une nouvelle couche SpatiaLite.

Plugins de gestion de données SpatiaLite

Pour la gestion des données SpatiaLite, vous pouvez également utiliser plusieurs plugins Python : QSpatiaLite, SpatiaLite Manager ou Gestionnaire de bases de données (plugin de base, recommandé). Si nécessaire, ils peuvent être téléchargés et installés avec le Plugin Installer.

Couches spatiales DB2¶

Les produits IBM DB2 pour Linux, Unix et Windows (DB2 LUW), IBM DB2 pour z/OS (mainframe) et IBM DashDB permettent aux utilisateurs de stocker et d'analyser des données spatiales dans des colonnes de table relationnelle. Le fournisseur DB2 pour QGIS prend en charge la gamme complète de visualisation, d'analyse et de manipulation des données spatiales dans ces bases de données.

La documentation utilisateur sur ces fonctionnalités est disponible dans le centre de connaissances DB2 z/OS, le centre de connaissances DB2 LUW et le centre de connaissances DB2 DashDB.

Pour plus d'informations sur l'utilisation des fonctionnalités spatiales DB2, consultez le didacticiel DB2 Spatial sur IBM DeveloperWorks.

Le fournisseur DB2 ne prend actuellement en charge que l'environnement Windows via le pilote ODBC Windows.

Le client exécutant QGIS doit avoir l'un des éléments suivants installé :

Si vous accédez à une base de données DB2 LUW sur la même machine ou si vous utilisez DB2 LUW en tant que client, les exécutables DB2 et les fichiers de prise en charge doivent être inclus dans le chemin Windows. Cela peut être fait en créant un fichier batch comme le suivant avec le nom db2.bat et l'inclure dans le répertoire %OSGEO4W_ROOT%/etc/ini.


Données vectorielles¶

De nombreuses fonctionnalités disponibles dans QGIS fonctionnent de la même manière, quelle que soit la source de données vectorielles. Cependant, en raison des différences de spécifications de formats (fichiers de formes ESRI, formats de fichiers MapInfo et MicroStation, bases de données AutoCAD DXF, PostGIS, SpatiaLite, DB2, Oracle Spatial et MSSQL Spatial, et bien d'autres), QGIS peut gérer différemment certaines de leurs propriétés. Cette section décrit comment travailler avec ces spécificités.

QGIS prend en charge les types d'entités (multi)points, (multi)lignes, (multi)polygones, CircularString, CompoundCurve, CurvePolygon, MultiCurve, MultiSurface, tous avec des valeurs Z et/ou M.

Vous devez également noter que certains pilotes ne prennent pas en charge certains de ces types de fonctionnalités, tels que CircularString, CompoundCurve, CurvePolygon, MultiCurve, MultiSurface. QGIS les convertira en fonction (multi)polygonale.

ESRI Shapefiles¶

Le shapefile ESRI est toujours l'un des formats de fichiers vectoriels les plus utilisés dans QGIS. Cependant, ce format de fichier a certaines limitations que certains autres formats de fichier n'ont pas (comme Geopackage, spatialite). Le support est fourni par la bibliothèque de fonctionnalités simples OGR.

Un shapefile se compose en fait de plusieurs fichiers. Les trois suivants sont obligatoires :

  1. .shp fichier contenant les géométries des entités
  2. .dbf fichier contenant les attributs au format dBase
  3. .shx fichier d'index

Les fichiers de formes peuvent également inclure un fichier avec un .prj suffixe, qui contient les informations de projection. S'il est très utile d'avoir un fichier de projection, ce n'est pas obligatoire. Un jeu de données de fichier de formes peut contenir des fichiers supplémentaires. Pour plus de détails, consultez les spécifications techniques d'ESRI à l'adresse http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf.

Améliorer les performances des fichiers de formes

Pour améliorer les performances de dessin d'un fichier de formes, vous pouvez créer un index spatial. Un index spatial améliorera la vitesse du zoom et du panoramique. Les index spatiaux utilisés par QGIS ont un .qix extension.

Utilisez ces étapes pour créer l'index :

  • Chargez un fichier de formes (voir Le panneau du navigateur)
  • Ouvrez le Propriétés de la couche dialogue en double-cliquant sur le nom du fichier de formes dans la légende ou en cliquant avec le bouton droit et en choisissant Propriétés depuis le menu contextuel.
  • Dans le Général onglet, cliquez sur le [Créer un index spatial] bouton.

Problème de chargement d'un fichier shape .prj

Si vous chargez un fichier de formes avec un .prj et QGIS n'est pas en mesure de lire le système de référence de coordonnées à partir de ce fichier, vous devrez définir la projection appropriée manuellement dans le Général onglet du Propriétés de la couche dialogue de la couche en cliquant sur le [Spécifier. ] bouton. Ceci est dû au fait que .prj Les fichiers ne fournissent souvent pas les paramètres de projection complets tels qu'utilisés dans QGIS et répertoriés dans le SCR dialogue.

Pour la même raison, si vous créez un nouveau shapefile avec QGIS, deux fichiers de projection différents sont créés : un .prj fichier avec des paramètres de projection limités, compatible avec le logiciel ESRI, et un .qpj fichier, fournissant les paramètres complets du SIR utilisé. Chaque fois que QGIS trouve un .qpj fichier, il sera utilisé à la place du .prj .

Fichiers texte délimités¶

Les données tabulaires sont un format très courant et largement utilisé en raison de leur simplicité et de leur lisibilité. Les données peuvent être visualisées et modifiées même dans un éditeur de texte brut. Un fichier texte délimité est une table attributaire avec chaque colonne séparée par un caractère défini et chaque ligne séparée par un saut de ligne. La première ligne contient généralement les noms de colonnes. Un type courant de fichier texte délimité est un fichier CSV (valeurs séparées par des virgules), chaque colonne étant séparée par une virgule.

Ces fichiers de données peuvent également contenir des informations de position sous deux formes principales :

  • En tant que coordonnées de point dans des colonnes séparées
  • En tant que représentation textuelle bien connue (WKT) de la géométrie

QGIS vous permet de charger un fichier texte délimité sous forme de couche ou de table ordinale. Mais vérifiez d'abord que le fichier répond aux exigences suivantes :

  1. Le fichier doit avoir une ligne d'en-tête délimitée de noms de champs. Cela doit être la première ligne du fichier texte.
  2. La ligne d'en-tête doit contenir des champs avec une définition de géométrie. Ces champs peuvent avoir n'importe quel nom.
  3. Les coordonnées X et Y (si la géométrie est définie par des coordonnées) doivent être spécifiées sous forme de nombres. Le système de coordonnées n'est pas important.
  4. Si vous avez des données qui ne sont pas une chaîne (texte) et que le fichier est un fichier CSV, vous devez avoir un fichier CSVT (voir la section Fichiers CSVT).

Comme exemple de fichier texte valide, nous importons le fichier de données de point d'élévation elevp.csv fourni avec l'exemple de jeu de données QGIS (voir la section Exemple de données):

Quelques éléments à noter sur le fichier texte :

  1. L'exemple de fichier texte utilise (point virgule) comme délimiteur. N'importe quel caractère peut être utilisé pour délimiter les champs.
  2. La première ligne est la ligne d'en-tête. Il contient les champs X , Oui et ELEV .
  3. Pas de citations ( " ) sont utilisés pour délimiter les champs de texte.
  4. Les coordonnées X sont contenues dans le X domaine.
  5. Les coordonnées Y sont contenues dans le Oui domaine.

Fichiers CSVT¶

Lors du chargement de fichiers CSV, le pilote OGR suppose que tous les champs sont des chaînes (c'est-à-dire du texte) sauf indication contraire. Vous pouvez créer un fichier CSVT pour indiquer à OGR (et QGIS) le type de données des différentes colonnes :

Taper Nom Exemple
Nombre entier Entier 4
Nombre décimal Réel 3.456
Date Date (AAAA-MM-JJ) 2016-07-28
Temps Heure (HH:MM:SS+nn) 18:33:12+00
Date et heure DateHeure (AAAA-MM-JJ HH:MM:SS+nn) 2016-07-28 18:33:12+00

Le fichier CSVT est un Une ligne fichier texte brut avec les types de données entre guillemets et séparés par des virgules, par exemple :

Vous pouvez même spécifier la largeur et la précision de chaque colonne, par exemple :

Ce fichier est enregistré dans le même dossier que le .csv fichier, avec le même nom, mais .csvt comme rallonge.

Vous pouvez trouver plus d'informations sur Pilote GDAL CSV.

D'autres informations précieuses pour les utilisateurs avancés¶

Les entités avec des géométries courbes (CircularString, CurvePolygon et CompoundCurve) sont prises en charge. Voici trois exemples de ces types de géométrie sous forme de texte délimité avec des géométries WKT :

Le texte délimité prend également en charge les coordonnées Z et M dans les géométries :

Couches PostGIS¶

Les couches PostGIS sont stockées dans une base de données PostgreSQL. Les avantages de PostGIS sont ses capacités d'indexation spatiale, de filtrage et d'interrogation qu'il offre. En utilisant PostGIS, les fonctions vectorielles telles que la sélection et l'identification fonctionnent plus précisément qu'avec les couches OGR dans QGIS.

Couches PostGIS

Normalement, une couche PostGIS est définie par une entrée dans la table geometry_columns. QGIS peut charger des couches qui n'ont pas d'entrée dans la table geometry_columns. Cela inclut à la fois les tables et les vues. La définition d'une vue spatiale fournit un moyen puissant de visualiser vos données. Reportez-vous à votre manuel PostgreSQL pour plus d'informations sur la création de vues.

Cette section contient quelques détails sur la façon dont QGIS accède aux couches PostgreSQL. La plupart du temps, QGIS devrait simplement vous fournir une liste de tables de bases de données qui peuvent être chargées, et il les chargera sur demande. Cependant, si vous rencontrez des difficultés pour charger une table PostgreSQL dans QGIS, les informations ci-dessous peuvent vous aider à comprendre les messages QGIS et vous indiquer comment modifier la définition de la table ou de la vue PostgreSQL pour permettre à QGIS de la charger.

Clé primaire¶

QGIS requiert que les couches PostgreSQL contiennent une colonne pouvant être utilisée comme clé unique pour la couche. Pour les tables, cela signifie généralement que la table a besoin d'une clé primaire ou d'une colonne avec une contrainte unique. Dans QGIS, cette colonne doit être de type int4 (un entier de taille 4 octets). Alternativement, la colonne ctid peut être utilisée comme clé primaire. Si une table manque de ces éléments, la colonne oid sera utilisée à la place. Les performances seront améliorées si la colonne est indexée (notez que les clés primaires sont automatiquement indexées dans PostgreSQL).

QGIS propose une case à cocher Sélectionnez à l'identifiant qui est activé par défaut. Cette option obtient les identifiants sans les attributs, ce qui est plus rapide dans la plupart des cas.

Si la couche PostgreSQL est une vue, la même exigence existe, mais les vues n'ont pas toujours des clés primaires ou des colonnes avec des contraintes uniques sur elles. Vous devez définir un champ de clé primaire (doit être un entier) dans la boîte de dialogue QGIS avant de pouvoir charger la vue. Si une colonne appropriée n'existe pas dans la vue, QGIS ne chargera pas la couche. Si cela se produit, la solution consiste à modifier la vue afin qu'elle inclue une colonne appropriée (un type d'entier et soit une clé primaire soit avec une contrainte unique, de préférence indexée).

Quant au tableau, une case à cocher Sélectionnez à l'identifiant est activé par défaut (voir ci-dessus pour la signification de la case à cocher). Il peut être judicieux de désactiver cette option lorsque vous utilisez des vues coûteuses.

Table QGIS layer_style et sauvegarde de la base de données¶

Si vous souhaitez effectuer une sauvegarde de votre base de données PostGIS en utilisant le pg_dump et pg_restore commandes et que les styles de calque par défaut enregistrés par QGIS ne parviennent pas à être restaurés par la suite, vous devez définir l'option XML sur DOCUMENT et la restauration fonctionnera.

Filtrer côté base de données¶

QGIS permet de filtrer les fonctionnalités déjà côté serveur. Vérifier la Paramètres ‣ Options ‣ Sources de données ‣ Exécuter des expressions côté serveur postgres si possible case à cocher pour le faire. Seules les expressions prises en charge seront envoyées à la base de données. Les expressions utilisant des opérateurs ou des fonctions non pris en charge se replieront gracieusement sur l'évaluation locale.

Prise en charge des types de données PostgreSQL¶

La plupart des types de données courants sont pris en charge par le fournisseur PostgreSQL : entier, flottant, varchar, géométrie et horodatage.

Les types de données de tableau ne sont pas pris en charge.

Importer des données dans PostgreSQL¶

Les données peuvent être importées dans PostgreSQL/PostGIS à l'aide de plusieurs outils, notamment le plug-in DB Manager et les outils de ligne de commande shp2pgsql et ogr2ogr.

Gestionnaire de base de données¶

QGIS est livré avec un plugin de base nommé DB Manager . Il peut être utilisé pour charger des fichiers de formes et d'autres formats de données, et il inclut la prise en charge des schémas. Voir section Plugin du gestionnaire de base de données pour plus d'informations.

Shp2pgsql¶

PostGIS inclut un utilitaire appelé shp2pgsql qui peut être utilisé pour importer des fichiers de formes dans une base de données compatible PostGIS. Par exemple, pour importer un fichier de formes nommé lacs.shp dans une base de données PostgreSQL nommée gis_data , utilisez la commande suivante :

Cela crée un nouveau calque nommé lacs_nouveau dans le gis_data base de données. La nouvelle couche aura un identifiant de référence spatiale (SRID) de 2964. Voir la section Travailler avec des projections pour plus d'informations sur les systèmes de référence spatiale et les projections.

Exporter des jeux de données depuis PostGIS

Comme l'outil d'importation shp2pgsql, il existe également un outil pour exporter les jeux de données PostGIS sous forme de fichiers de formes : pgsql2shp. Ceci est expédié dans votre distribution PostGIS.

Ogr2ogr¶

outre shp2pgsql et Gestionnaire de bases de données, il existe un autre outil pour alimenter les géodonnées dans PostGIS : ogr2ogr. Cela fait partie de votre installation GDAL.

Pour importer un fichier de formes dans PostGIS, procédez comme suit :

Cela importera le fichier de formes alaska.shp dans la base de données PostGIS postgis en utilisant l'utilisateur postgres avec le mot de passe Top secret sur le serveur hôte myhost.de.

Notez qu'OGR doit être construit avec PostgreSQL pour prendre en charge PostGIS. Vous pouvez le vérifier en tapant (dans )

Si vous préférez utiliser PostgreSQL’s COPIE commande au lieu de la valeur par défaut INSÉRER DANS méthode, vous pouvez exporter la variable d'environnement suivante (au moins disponible sur et ):

ogr2ogr ne crée pas d'index spatiaux comme shp2pgsl Est-ce que. Vous devez les créer manuellement, en utilisant la commande SQL normale CRÉER UN INDEX ensuite comme étape supplémentaire (comme décrit dans la section suivante Améliorer les performances).

Améliorer les performances¶

La récupération des fonctionnalités d'une base de données PostgreSQL peut prendre beaucoup de temps, en particulier sur un réseau. Vous pouvez améliorer les performances de dessin des couches PostgreSQL en vous assurant qu'un index spatial PostGIS existe sur chaque couche de la base de données. PostGIS prend en charge la création d'un index GiST (Generalized Search Tree) pour accélérer les recherches spatiales des données (les informations de l'index GiST sont extraites de la documentation PostGIS disponible sur http://postgis.net).

Vous pouvez utiliser le DBManager pour créer un index sur votre couche. Vous devez d'abord sélectionner le calque et cliquer sur Tableau ‣ Modifier le tableau, aller à Index onglet et cliquez sur [Ajouter un index spatial].

La syntaxe pour créer un index GiST est :

Notez que pour les grandes tables, la création de l'index peut prendre beaucoup de temps. Une fois l'index créé, vous devez effectuer un ANALYSE DU VIDE . Voir la documentation PostGIS (POSTGIS-PROJECT Littérature et références Web) pour plus d'informations.

Voici un exemple de création d'un index GiST :

Couches vectorielles traversant 180° de longitude¶

De nombreux packages SIG n'enveloppent pas les cartes vectorielles avec un système de référence géographique (lat/lon) traversant la ligne de longitude 180 degrés (http://postgis.refractions.net/documentation/manual-2.0/ST_Shift_Longitude.html). En conséquence, si nous ouvrons une telle carte dans QGIS, nous verrons deux emplacements éloignés et distincts, qui devraient apparaître l'un près de l'autre. Dans Figure_vector_crossing, le petit point à l'extrême gauche du canevas de la carte (Îles Chatham) doit se trouver dans la grille, à droite des îles principales de Nouvelle-Zélande.

Carte en lat/lon traversant la ligne de longitude 180°

Une solution de contournement consiste à transformer les valeurs de longitude à l'aide de PostGIS et du ST_Shift_Longitude une fonction. Cette fonction lit chaque point/sommet dans chaque composant de chaque entité d'une géométrie, et si la coordonnée de longitude est < 0°, elle y ajoute 360°. Le résultat est une version 0° - 360° des données à tracer sur une carte centrée à 180°.

Traversée de 180° de longitude en appliquant la ST_Shift_Longitude une fonction

Usage¶

  • Importer des données dans PostGIS (Importation de données dans PostgreSQL) en utilisant, par exemple, le plugin DB Manager.
  • Utilisez l'interface de ligne de commande PostGIS pour exécuter la commande suivante (dans cet exemple, “TABLE” est le nom réel de votre table PostGIS) : gis_data=# update TABLE set the_geom=ST_Shift_Longitude(the_geom)
  • Si tout s'est bien passé, vous devriez recevoir une confirmation du nombre de fonctionnalités mises à jour. Ensuite, vous pourrez charger la carte et voir la différence (Figure_vector_crossing_map).

Couches SpatiaLite¶

Si vous souhaitez enregistrer une couche vectorielle au format SpatiaLite, vous pouvez le faire en cliquant avec le bouton droit sur la couche dans la légende. Ensuite, cliquez sur Enregistrer sous. , définissez le nom du fichier de sortie et sélectionnez ‘SpatiaLite’ comme format et le CRS. En outre, vous pouvez sélectionner ‘SQLite’ comme format, puis ajouter SPATIALITE=OUI dans le champ d'option de création de source de données OGR. Cela indique à OGR de créer une base de données SpatiaLite. Voir aussi http://www.gdal.org/ogr/drv_sqlite.html.

QGIS prend également en charge les vues modifiables dans SpatiaLite.

Si vous souhaitez créer une nouvelle couche SpatiaLite, veuillez vous référer à la section Création d'une nouvelle couche SpatiaLite.

Plugins de gestion de données SpatiaLite

Pour la gestion des données SpatiaLite, vous pouvez également utiliser plusieurs plugins Python : QSpatiaLite, SpatiaLite Manager ou Gestionnaire de bases de données (plugin de base, recommandé). Si nécessaire, ils peuvent être téléchargés et installés avec le Plugin Installer.

Couches spatiales DB2¶

Les produits IBM DB2 pour Linux, Unix et Windows (DB2 LUW), IBM DB2 pour z/OS (mainframe) et IBM DashDB permettent aux utilisateurs de stocker et d'analyser des données spatiales dans des colonnes de table relationnelle. Le fournisseur DB2 pour QGIS prend en charge la gamme complète de visualisation, d'analyse et de manipulation des données spatiales dans ces bases de données.

La documentation utilisateur sur ces fonctionnalités est disponible dans le centre de connaissances DB2 z/OS, le centre de connaissances DB2 LUW et le centre de connaissances DB2 DashDB.

Pour plus d'informations sur l'utilisation des fonctionnalités spatiales DB2, consultez le didacticiel DB2 Spatial sur IBM DeveloperWorks.

Le fournisseur DB2 ne prend actuellement en charge que l'environnement Windows via le pilote ODBC Windows.

Le client exécutant QGIS doit avoir l'un des éléments suivants installé :

Si vous accédez à une base de données DB2 LUW sur la même machine ou si vous utilisez DB2 LUW en tant que client, les exécutables DB2 et les fichiers de prise en charge doivent être inclus dans le chemin Windows. Cela peut être fait en créant un fichier batch comme le suivant avec le nom db2.bat et l'inclure dans le répertoire %OSGEO4W_ROOT%/etc/ini.


Comment importer plusieurs fichiers de formes sans aucun dbf dans une base de données PostGIS ? - Systèmes d'information géographique

La bibliothèque Python Shapefile (pyshp) lit et écrit les fichiers ESRI Shapefile en Python pur.

La bibliothèque Python Shapefile (pyshp) fournit une prise en charge en lecture et en écriture du format Esri Shapefile. Le format Shapefile est un format de données vectorielles populaire du système d'information géographique créé par Esri. Pour plus d'informations sur ce format, veuillez lire la "Description technique ESRI Shapefile - Juillet 1998" bien rédigée située à l'adresse http://www.esri.com/library/whitepapers/p dfs/shapefile.pdf . Le document Esri décrit les formats de fichier shp et shx. Cependant, un troisième format de fichier appelé dbf est également requis. Ce format est documenté sur le Web sous le nom de "XBase File Format Description" et est un simple format de base de données basé sur des fichiers créé dans les années 1960. Pour plus d'informations sur cette spécification, consultez : [http://www.clicketyclick.dk/databases/xbase/format/index.html](http://www.clicketyclick.d k/databases/xbase/format/index.html)

Les formats de fichier Esri et XBase sont tous deux très simples dans leur conception et économes en mémoire, ce qui explique en partie pourquoi le format shapefile reste populaire malgré les nombreuses façons de stocker et d'échanger des données SIG disponibles aujourd'hui.

Pyshp est compatible avec Python 2.4-3.x.

Ce document fournit des exemples d'utilisation de pyshp pour lire et écrire des fichiers de formes. Cependant, de nombreux autres exemples sont continuellement ajoutés au wiki pyshp sur GitHub, au blog http://GeospatialPython.com, et en recherchant pyshp sur https://gis.stackexchange.com.

Actuellement, l'exemple de fichier de formes de groupe de blocs de recensement référencé dans les exemples est disponible sur le site du projet GitHub à l'adresse https://github.com/GeospatialPython/pyshp. Ces exemples sont simples et vous pouvez également les exécuter facilement sur vos propres fichiers de formes avec une modification minimale.

Important : si vous débutez en SIG, vous devriez vous renseigner sur les projections cartographiques. Veuillez visiter : https://github.com/GeospatialPython/pyshp/wiki/Map-Projections

J'espère sincèrement que cette bibliothèque élimine la distraction banale de la simple lecture et écriture de données, et vous permet de vous concentrer sur la partie stimulante et AMUSANTE de votre projet géospatial.

Avant de faire quoi que ce soit, vous devez importer la bibliothèque.

Les exemples ci-dessous utiliseront un fichier de formes créé à partir de l'ensemble de données Blockgroups du U.S. Census Bureau près de San Francisco, Californie et disponible dans le référentiel git du site pyshp GitHub.

Pour lire un fichier de formes, créez un nouvel objet "Reader" et transmettez-lui le nom d'un fichier de formes existant. Le format shapefile est en fait une collection de trois fichiers. Vous spécifiez le nom de fichier de base du fichier de formes ou le nom de fichier complet de l'un des fichiers de composants du fichier de formes.

OU l'un des 5+ autres formats qui font potentiellement partie d'un fichier de formes. La bibliothèque ne se soucie pas des extensions de fichiers.

Lecture de fichiers de formes à partir d'objets de type fichier

Vous pouvez également charger des fichiers de formes à partir de n'importe quel objet de type fichier Python en utilisant des arguments de mot-clé pour spécifier l'un des trois fichiers. Cette fonctionnalité est très puissante et vous permet de charger des shapefiles à partir d'une URL, d'un fichier zip, d'un objet sérialisé ou dans certains cas d'une base de données.

Notez que dans les exemples ci-dessus, le fichier shx ​​n'est jamais utilisé. Le fichier shx ​​est un index d'enregistrements fixes très simple pour les enregistrements de longueur variable dans le fichier shp. Ce fichier est facultatif pour la lecture. S'il est disponible, pyshp utilisera le fichier shx ​​pour accéder aux enregistrements de forme un peu plus rapidement, mais s'en passera très bien.

La géométrie d'un fichier de formes est l'ensemble de points ou de formes constitués de sommets et d'arcs implicites représentant des emplacements physiques. Tous les types de fichiers de formes ne stockent que des points. Les métadonnées sur les points déterminent comment ils sont gérés par le logiciel.

Vous pouvez obtenir la liste de la géométrie du fichier de formes en appelant la méthode shape().

La méthode shape renvoie une liste d'objets Shape décrivant la géométrie de chaque enregistrement de forme.

Vous pouvez parcourir la géométrie du fichier de formes en utilisant la méthode iterShapes().

Chaque enregistrement de forme contient les attributs suivants :

shapeType : un entier représentant le type de forme tel que défini par la spécification du fichier de formes.

bbox : si le type de forme contient plusieurs points, ce tuple décrit la coordonnée inférieure gauche (x, y) et la coordonnée du coin supérieur droit créant une boîte complète autour des points. Si le shapeType est un Null (shapeType == 0) alors une AttributeError est levée.

pièces : les pièces regroupent simplement des ensembles de points en formes. Si l'enregistrement de forme comporte plusieurs parties, cet attribut contient l'index du premier point de chaque partie. S'il n'y a qu'une partie, une liste contenant 0 est renvoyée.

points : l'attribut points contient une liste de tuples contenant une coordonnée (x,y) pour chaque point de la forme.

Pour lire une seule forme en appelant son index, utilisez la méthode shape(). L'index est le nombre de formes à partir de 0. Donc, pour lire le 8ème enregistrement de forme, vous utiliseriez son index qui est 7.

Un enregistrement dans un fichier de formes contient les attributs de chaque forme de la collection de géométrie. Les enregistrements sont stockés dans le fichier dbf. Le lien entre la géométrie et les attributs est le fondement de tous les systèmes d'information géographique. Ce lien critique est impliqué par l'ordre des formes et des enregistrements correspondants dans le fichier de géométrie shp et le fichier d'attributs dbf.

Les noms de champs d'un shapefile sont disponibles dès que vous lisez un shapefile. Vous pouvez appeler l'attribut "fields" du shapefile en tant que liste Python. Chaque champ est une liste Python contenant les informations suivantes :

  • Nom de champ : le nom décrivant les données à cet index de colonne.
  • Type de champ : le type de données à cet index de colonne. Les types peuvent être : Caractère, Nombres, Longs, Dates ou Mémo. Le type "Mémo" n'a aucune signification dans un SIG et fait plutôt partie de la spécification xbase.
  • Longueur du champ : la longueur des données trouvées à cet index de colonne. Les anciens logiciels SIG peuvent tronquer cette longueur à 8 ou 11 caractères pour les champs "Caractère".
  • Longueur décimale : le nombre de décimales trouvées dans les champs "Nombre".

Pour voir les champs de l'objet Reader ci-dessus (sf), appelez l'attribut "fields":

Vous pouvez obtenir une liste des enregistrements du shapefile en appelant la méthode records() :

Semblable aux méthodes de géométrie, vous pouvez parcourir les enregistrements dbf à l'aide de la méthode iterRecords().

Chaque enregistrement est une liste contenant un attribut correspondant à chaque champ de la liste des champs.

Par exemple, dans le 4e enregistrement du fichier de formes des groupes de blocs, les 2e et 3e champs sont l'identifiant du groupe de blocs et le nombre de population de 1990 de ce groupe de blocs de San Francisco :

Pour lire un seul enregistrement, appelez la méthode record() avec l'index de l'enregistrement :

Lecture simultanée de la géométrie et des enregistrements

Vous souhaiterez peut-être examiner à la fois la géométrie et les attributs d'un enregistrement en même temps. Les méthodes shapeRecord() et shapeRecords() vous permettent de faire exactement cela.

L'appel de la méthode shapeRecords() renverra la géométrie et les attributs de toutes les formes sous forme de liste d'objets ShapeRecord. Chaque instance de ShapeRecord a un attribut "shape" et "record". L'attribut shape est un objet ShapeRecord comme expliqué dans la première section "Lecture de la géométrie". L'attribut d'enregistrement est une liste de valeurs de champ comme illustré dans la section « Lecture d'enregistrements ».

Lisons la clé du groupe de blocs et la population pour le 4e groupe de blocs :

Lisons maintenant les deux premiers points de ce même enregistrement :

La méthode shapeRecord() lit une seule paire forme/enregistrement à l'index spécifié. Pour obtenir le 4e enregistrement de forme à partir du fichier de formes des groupes de blocs, utilisez le troisième index :

La clé du groupe de blocs et le nombre de population :

Il existe également une méthode iterShapeRecords() pour parcourir des fichiers volumineux :

PyShp essaie d'être aussi flexible que possible lors de l'écriture de fichiers de formes tout en maintenant un certain degré de validation automatique pour s'assurer que vous n'écrivez pas accidentellement un fichier invalide.

PyShp peut écrire un seul des fichiers de composants tels que le fichier shp ou dbf sans écrire les autres. Ainsi, en plus d'être une bibliothèque de fichiers de formes complète, il peut également être utilisé comme bibliothèque de base dbf (xbase). Les fichiers Dbf sont un format de base de données commun qui sont souvent utiles en tant que format de base de données simple autonome. Et même les fichiers shp ont parfois des utilisations en tant que format autonome. Certains systèmes SIG basés sur le Web utilisent un fichier shp téléchargé par l'utilisateur pour spécifier une zone d'intérêt. De nombreux pulvérisateurs de produits chimiques pour l'agriculture de précision utilisent également le format shp comme fichier de contrôle pour le système de pulvérisation (généralement en combinaison avec des formats de fichier de base de données personnalisés).

Pour créer un fichier de formes, vous ajoutez une géométrie et/ou des attributs à l'aide des méthodes de la classe Writer jusqu'à ce que vous soyez prêt à enregistrer le fichier.

Créez une instance de la classe Writer pour commencer à créer un fichier de formes :

Le type de forme définit le type de géométrie contenue dans le fichier de formes. Toutes les formes doivent correspondre au paramètre de type de forme.

Les types de formes sont représentés par des nombres compris entre 0 et 31, tels que définis par la spécification du fichier de formes. Il est important de noter que le système de numérotation a plusieurs numéros réservés qui n'ont pas encore été utilisés. Par conséquent, les numéros des types de formes existants ne sont pas séquentiels.

Il existe trois façons de définir le type de forme :

  • Définissez-le lors de la création de l'instance de classe.
  • Définissez-le en attribuant une valeur à une instance de classe existante.
  • Définissez-le automatiquement sur le type de la première forme non nulle en enregistrant le fichier de formes.

Pour définir manuellement le type de forme d'un objet Writer lors de la création du Writer :

OU vous pouvez le définir après la création du Writer :

Géométrie et équilibrage des enregistrements

Étant donné que chaque forme doit avoir un enregistrement correspondant, il est essentiel que le nombre d'enregistrements soit égal au nombre de formes pour créer un fichier de formes valide. Vous devez prendre soin d'ajouter des enregistrements et des formes dans le même ordre afin que les données d'enregistrement s'alignent avec les données de géométrie. Par exemple:

La géométrie est ajoutée à l'aide de l'une des trois méthodes suivantes : "null", "point" ou "poly". La méthode "null" est utilisée pour les formes nulles, "point" est utilisé pour les formes de points, "line" pour les lignes et "poly" est utilisé pour les polygones et tout le reste.

Ajout d'une forme de point

Les formes de points sont ajoutées à l'aide de la méthode "point". Un point est spécifié par une valeur x, y et facultative z (élévation) et m (mesure).

Ajout d'une forme de polygone

Les polygones Shapefile doivent avoir au moins 4 points et le dernier point doit être le même que le premier. PyShp applique automatiquement les polygones fermés.

Ajouter une forme de ligne

Une ligne doit avoir au moins deux points. En raison des similitudes entre les types de polygone et de ligne, il est possible de créer une forme de ligne en utilisant la méthode "ligne" ou "poly".

Ajout d'une forme Null

Étant donné que les types de forme Null (type de forme 0) n'ont pas de géométrie, la méthode "null" est appelée sans aucun argument. Ce type de shapefile est rarement utilisé mais il est valide.

La liste des formes de l'objet écrivain aura désormais une forme nulle :

La création d'attributs comporte deux étapes. L'étape 1 consiste à créer des champs pour contenir des valeurs d'attribut et l'étape 2 consiste à remplir les champs avec des valeurs pour chaque enregistrement de forme.

Il existe plusieurs types de champs différents, qui prennent tous en charge le stockage des valeurs Aucun en tant que NULL.

Les champs de texte sont créés à l'aide du type « C », et le troisième argument « taille » peut être personnalisé à la longueur attendue des valeurs de texte pour économiser de l'espace :

Les champs de date sont créés à l'aide du type « D » et peuvent être créés à l'aide d'objets de date, de listes ou d'une chaîne au format AAAAMMJJ. La longueur du champ ou les décimales n'ont aucun impact sur ce type :

Les champs numériques sont créés en utilisant le type 'N' (ou le type 'F', qui est exactement le même). Par défaut, le quatrième argument décimal est défini sur zéro, créant essentiellement un champ entier. Pour stocker des flottants, vous devez définir l'argument décimal avec la précision de votre choix. Pour stocker de très grands nombres, vous devez augmenter la longueur du champ jusqu'au nombre total de chiffres (comprenant la virgule et le moins).

Enfin, nous pouvons créer des champs booléens en définissant le type sur 'L'. Ce champ peut prendre des valeurs True ou False, ou 1 (True) ou 0 (False). Aucun n'est interprété comme manquant.

Vous pouvez également ajouter des attributs à l'aide d'arguments de mot-clé où les clés sont des noms de champ.

Les extensions de fichiers sont facultatives lors de la lecture ou de l'écriture de fichiers de formes. Si vous les spécifiez, PyShp les ignore de toute façon. Lorsque vous enregistrez des fichiers, vous pouvez spécifier un nom de fichier de base qui est utilisé pour les trois types de fichiers. Ou vous pouvez spécifier un nom pour un ou plusieurs types de fichiers. Dans ce cas, tous les types de fichiers non attribués ne seront pas enregistrés et seuls les types de fichiers avec des noms de fichiers seront enregistrés. Si vous ne spécifiez aucun nom de fichier (c'est-à-dire save()), un nom de fichier unique est généré avec le préfixe "shapefile_" suivi de caractères aléatoires qui sont utilisés pour les trois fichiers. Le nom de fichier unique est renvoyé sous forme de chaîne.

Enregistrement dans des objets de type fichier

Tout comme vous pouvez lire des fichiers de formes à partir d'objets de type fichier python, vous pouvez également les écrire.

La classe Editor tente de faciliter la modification des fichiers de formes existants en gérant les détails de lecture et d'écriture dans les coulisses. Cette classe est expérimentale, présente de nombreux problèmes et doit être évitée pour une utilisation en production. Vous pouvez faire la même chose en lisant un fichier de formes en mémoire, en modifiant les objets python et en écrivant un nouveau fichier de formes avec le même nom ou un nom différent.

Ajoutons des formes aux fichiers de formes existants :

Ajouter un point à un fichier de formes de points :

Ajoutez une nouvelle ligne à un fichier de formes de ligne :

Ajoutez un nouveau polygone à un fichier de formes de polygones :

Supprimez le premier point de chaque fichier de formes - pour un fichier de formes de points qui est la première forme et enregistrez :

Supprimez la dernière forme du fichier de formes de polygone :

Géométrie et équilibrage des enregistrements

Étant donné que chaque forme doit avoir un enregistrement correspondant, il est essentiel que le nombre d'enregistrements soit égal au nombre de formes pour créer un fichier de formes valide. Pour aider à éviter un désalignement accidentel, pyshp dispose d'une fonction "équilibrage automatique" pour s'assurer que lorsque vous ajoutez une forme ou un enregistrement, les deux côtés de l'équation s'alignent. Cette fonctionnalité n'est PAS activée par défaut. Pour l'activer, définissez l'attribut autoBalance sur 1 (True) :

Vous avez également la possibilité d'appeler manuellement la méthode balance() chaque fois que vous ajoutez une forme ou un enregistrement pour vous assurer que l'autre côté est à jour. Lorsque l'équilibrage est utilisé, des formes nulles sont créées du côté de la géométrie ou un enregistrement avec une valeur "NULL" pour chaque champ est créé du côté des attributs.

L'option d'équilibrage vous offre une flexibilité dans la façon dont vous créez le fichier de formes.

Sans équilibrage automatique, vous pouvez ajouter une géométrie ou des enregistrements à tout moment. Vous pouvez créer toutes les formes, puis créer tous les enregistrements ou vice versa. Vous pouvez utiliser la méthode d'équilibre après avoir créé une forme ou un enregistrement à chaque fois et effectuer des mises à jour ultérieurement. Si vous n'utilisez pas la méthode d'équilibrage et oubliez d'équilibrer manuellement la géométrie et les attributs, le fichier de formes sera considéré comme corrompu par la plupart des logiciels de fichiers de formes.

Avec l'équilibrage automatique, vous pouvez ajouter des formes ou une géométrie et mettre à jour les entrées vides de chaque côté selon vos besoins. Même si vous oubliez de mettre à jour une entrée, le fichier de formes sera toujours valide et géré correctement par la plupart des logiciels de fichiers de formes.


Lecture de fichiers de formes à partir d'une URL dans GeoPandas

Les fichiers de formes sont probablement le format de données géospatiales vectorielles le plus couramment utilisé. Cependant, comme un seul Shapefile se compose de plusieurs fichiers (au moins 3 et jusqu'à 15), ils sont souvent transférés en un seul fichier zip. Dans cet article, je montre comment lire un fichier de formes compressé d'un serveur dans un GeoPandas GeoDataFrame (avec les informations du système de référence de coordonnées), le tout en mémoire.

Ce n'est probablement pas le post le plus excitant - pas de visuels intéressants ou de données sympas avec lesquelles jouer - mais je l'ai trouvé très utile. En plus de disposer désormais d'un outil rapide pour lire des données géospatiales directement à partir du Web, cela m'a également aidé à mieux comprendre comment travailler entre et entre différents types de données géospatiales en Python.

En écrivant cette procédure, j'ai complété le code de cet article de blog qui montre comment lire un fichier Shapefile compressé dans un objet PyShp.

Je montre ensuite comment ce code peut être utilisé pour lire les limites géographiques des comtés américains à partir du site FTP du recensement.

Un cahier Jupyter de mon code peut être téléchargé depuis mon GitHub ici

La première étape consiste à utiliser PyShp pour lire dans notre Shapefile. Si nous lisions simplement un Shapefile à partir du disque, nous appellerions simplement :

Cependant, comme nous lisons notre Shapefile à partir d'un fichier zip, nous devrons spécifier les composants individuels de ce fichier. Malheureusement, nous ne pouvons pas lire le contenu d'un fichier zip directement dans Python à partir de l'URL. Bien que Python puisse télécharger le fichier sur le disque, puis le lire à partir de là, je souhaite montrer comment cela peut être fait en mémoire sans aucune activité sur le disque. Par conséquent, nous devons franchir une étape supplémentaire dans laquelle les données de l'URL sont lues dans un objet StringIO, qui est à son tour lu par Python en tant que fichier zip. L'objet StringIO n'est qu'un type de données intermédiaire entre les données lues à partir de l'URL et le fichier zip en Python. Cela se fait en une ligne de code ci-dessous :

Maintenant, cet objet zipfile peut être traité comme n'importe quel autre fichier zip qui a été lu à partir du disque. Ci-dessous, j'identifie les noms de fichiers des 4 composants nécessaires du Shapefile. Notez que le fichier prj n'est en fait pas nécessaire à 100%, mais qu'il contient les informations du système de référence de coordonnées qui sont vraiment agréables à avoir et qui seront utilisées ci-dessous.

Ensuite, je crée des variables pour ces 4 fichiers. Encore une fois, parce que je ne les lis pas sur le disque, j'ai besoin d'avoir ces fichiers en tant qu'objets StringIO afin qu'ils puissent être transmis au lecteur de fichiers de formes en mémoire. J'ai maintenant un objet lecteur PyShp qui a été lu directement à partir d'un serveur. Notez que les objets lecteurs PyShp ne stockent pas d'informations de référence de coordonnées, c'est pourquoi le fichier prj n'a pas encore été spécifié. Cependant, cela entrera en jeu plus tard.

L'objet lecteur PyShp stocke toutes les informations géographiques et les attributs du Shapefile. Ci-dessous, j'imprime le nombre d'enregistrements, montrant qu'il y a 3 233 comtés aux États-Unis.

Maintenant, je vais extraire toutes les données de l'objet lecteur PyShp et les mettre sous une forme lisible par GeoPandas. Pour la géométrie, ce sera une liste d'objets géométriques galbés, et pour les attributs, ce sera une liste de dictionnaires contenant des noms de champs et des valeurs de champs.

L'obtention des attributs de chaque enregistrement est simple, mais l'extraction de la géométrie est un peu plus compliquée et je dois à nouveau utiliser une structure de données intermédiaire. La géométrie de chaque enregistrement a une propriété __geo_interface__ qui n'est qu'un moyen standardisé d'interfaçage avec des données géographiques en Python. L'interface renvoie les données sous forme de GeoJSON, qui est compatible avec la plupart des autres bibliothèques, y compris shapely que j'utilise ci-dessous pour convertir le GeoJSON en un objet géométrique galbé. Ci-dessous, j'imprime un exemple du GeoJSON avant qu'il ne soit converti.

À ce stade, j'ai construit une liste d'attributs d'enregistrement et une liste de géométries d'enregistrement. Enfin, j'utiliserai le fichier prj du Shapefile pour obtenir le système de référence de coordonnées afin qu'il puisse être spécifié lors de la création du GeoDataFrame . Les fichiers PRJ sont simplement des fichiers texte qui contiennent une chaîne d'informations relatives au système de référence de coordonnées. Cependant, le contenu d'un fichier prj ne peut pas être lu directement dans GeoPandas. GeoPandas peut cependant lire dans les chaînes proj4, qui ne sont qu'un autre moyen de référencer ces informations.

Je peux facilement convertir le contenu du fichier prj en une chaîne proj4 en utilisant osr , ce que je fais ci-dessous.

Maintenant, j'ai tous les composants pour construire un GeoDataFrame. Je spécifie les attributs (une liste de dictionnaires), la géométrie (une liste de géométries harmonieuses) et le système de coordonnées de référence (une chaîne proj4).

Ci-dessous, j'extrait uniquement les comtés du New Jersey (mon état d'origine), les reprojette dans un système de référence de coordonnées spécifique au NJ et crée un tracé rapide.


Voir la vidéo: Postgis - QGIS Stintersects Stdistance