Importer des tables dans une base de données SpatiaLite avec QGis 2.8

Nous avons vu dans l’article précédent (Créer une base de données SpatiaLite avec QGis 2.8 ) comment importer un fichier shape dans une base SpatiaLite. La méthode est la même pour les autres types de données spatiales (kml,gml,…). Nous verrons maintenant comment importer des données non spatialisées (Excel, txt,csv,…) et surtout celles contenant des attributs de localisation (XY, Lat/Lon,…) tout en créant leur géométries. Nous verrons aussi comment exporter les tables SpatiaLite sous forme de fichiers shape.

Importation de tables dans SpatiaLite

Pour importer un fichier de table dans une base de données de SpatiaLite, procédez comme suit :
1. Ouvrez le gestionnaire de base de données en cliquant sur Gestionnaire de base de données sous le menu Base de données. Développez SpatiaLite et sélectionnez la base de données où vous voulez importer vos données tabulaires dans l’arborescence.(ici BaseTest)
2. Cliquez sur le menu Table | Importer un fichier ou une couche pour ouvrir la boîte de dialogue Importer une couche vecteur.
3. cliquez sur le bouton […] affiché à droite de la liste déroulante Saisie et sélectionnez le fichier Excel (ici hotels.xls) à charger dans la base.
4. cliquez sur le bouton options de mise à jour pour charger le reste de la boîte de dialogue.
Le Nom de la table de sortie sera rempli avec le nom du fichier d’entrée. Notez que toutes les options liées aux types de données spatiales ne sont pas modifiables et sont grisées (tel qu’illustré dans la capture d’écran suivante).

paramétrage du chargement d'une table excel dans spatialite

C’est parce que SpatiaLite traite l’entrée sous forme de tableau non spatial, même s’il possède des coordonnées enregistrées dans la table. Nous allons ajouter la composante spatiale à la table dans une étape ultérieure.
5. cliquez sur le bouton OK pour importer le fichier.
6. après quelques instants, vous serez avisé que l’importation est terminée.

Pour afficher le nouveau tableau, vous devrez actualiser l’arborescence en sélectionnant BaseTest.sqlite dans l’arborescence puis cliquez sur Actualiser sous Base de données ou appuyez sur la touche F5 de votre clavier. La table des Hôtels  devrait maintenant apparaître avec l’icône de table à côté d’elle.

résultat du chargement de la table excel dans spatialite

Remarquez les champs Google_Longitude et Google_Latitude. Ces champs contiennent les coordonnées des hôtels (EPSG 4326). Cliquez sur l’onglet  Table sur le panneau d’informations pour afficher les entrées de la table. Notez que l’onglet Aperçu n’est pas disponible, car la table sélectionnée n’a pas de géométrie.

Mise à jour 1/6/2017

Attention au type de données affecté à vos champs de coordonnées (ici Google_Longitude et Google_Latitude). Selon un algorithme qui m’a toujours échappé, le passage du format de cellule Excel à type de donnée en base de données a des résultats bizarres. Il se peut que vous vous retrouviez avec des champs de coordonnées de type texte. En dans ce cas, il n’y aura pas d’erreurs affichées par la suite, sauf que vos géométries seront nulles et vous n’aurez aucun point à l’affichage. C’est donc à ce stade qu’il faut corriger le tir, après ce sera trop tard et il faudra tout recommencer à zéro.

Si vos champs X et Y son en texte, ouvrez  un fenêtre SQL dans le gestionnaire de base de données (deuxième bouton des quatre) puis rentrez une par une les requêtes SQL suivantes pour créer un nouveau champ numérique et le renseigner avec le contenu du champ texte:

ALTER TABLE votre_table ADD Xm double precision
UPDATE votre_table SET Xm=X
ALTER TABLE votre_table ADD Ym double precision
UPDATE votre_table SET Ym=Y

où X et Y sont vos champs texte.

 

À ce stade, l’importation de la table est terminée. Toutefois, comme les coordonnées sont présentes dans la table, on peut créer une colonne geometry de type point et l’ajouter à la table. Ceci transformera le tableau en une couche de points.

Ajout d’une colonne geometry

1. avec la table hotels sélectionnée dans l’arborescence, cliquez sur  Table | Éditer la Table pour ouvrir la fenêtre Propriétés de la table.

fenêtre propriétés de la table
2. cliquez sur le bouton  ajouter une colonne géométrique. Dans la nouvelle fenêtre, définissez les options suivantes pour créer le champ de la géométrie :

  • Nom :le nom du champ qui contiendra les informations de géométrie
  • Type : le type de géométrie, ici POINT
  • Dimensions : le nombre de dimensions (valeurs) pour la géométrie (2 pour XY, 3 pour XYZ)
  • SRID : le système de coordonnées du champ géométrie

paramétrage de l'ajout d'un champ géometrie dans spatialite

aperçu de la couche de points créée3. Fermez les propriétés de la table. Pour afficher la table nouvellement éditée, vous devrez actualiser l’arborescence en sélectionnant BaseTest.sqlite dans l’arborescence et en cliquant sur Actualiser sous Base de données ou appuyer sur la touche F5 de votre clavier.
La table hotels devrait maintenant apparaître avec l’icône de point à côté de lui.

table avec la géometrie

Maintenant que la table hotels possède un champ de géométrie, nous devons le remplir avec les coordonnées disponibles de chaque enregistrement. Nous ferons ceci en avec une requête de mise à jour SQL et en utilisant la fonction SpatiaLite MakePoint :

1. Ouvrez la fenêtre SQL en cliquant sur le menu Base de données -> Fenêtre SQL.

ouverture de la fenêtre sql du gestionnaire de base de données
2. Entrez la requête suivante dans la zone de texte de requête SQL :

UPDATE hotels
SET geom = MakePoint(Google_Longitude,Google_Latitude,4326) ;

requête sql pour ajouter les coordonnées à la géométrie d'une table spatialite

MakePoint est une fonction de SpatiaLite qui crée un nouvel objet point.

3. cliquez sur le bouton Execute (F5) pour exécuter la requête. La requête ne retournera aucun résultat mais indiquera le nombre de lignes modifiées.
4. dans la fenêtre SQL, cliquez sur le bouton Fermer pour fermer la fenêtre.

5. pour afficher les modifications apportées à la table hotels, vous devrez actualiser l’arborescence.
avertissement d'absence d'index spatial
6. Sous la section SpatiaLite de l’onglet information, notez qu’un avertissement s’affiche indiquant qu’aucun index spatial n’a été défini. Pour améliorer la vitesse d’accès, il est préférable qu’un index spatial soit créé. Cliquez sur créer.

7. Pour afficher un aperçu de la géométrie, cliquez sur l’onglet Aperçu.
aperçu de la couche de points créée

Export de tables à partir de SpatiaLite sous forme de shapefile

Pour exporter une table sous forme de shapefile, effectuez les opérations suivantes :
1. Ouvrez le gestionnaire de base de données en cliquant sur Gestionnaire de base de données sous Base de données. Développez SpatiaLite, puis sélectionnez la base de données dont vous souhaitez exporter une table dans le panneau de l’arborescence.
2. dans l’arborescence, sélectionnez la table que vous souhaitez exporter.
3.Cliquez sur Table | Exporter vers fichier pour ouvrir la boîte de dialogue Exporter un fichier vecteur.
4. cliquez sur le bouton […] à droite de la zone fichier en sortie et donnez un nom du fichier de sortie. Notez que vous ne pouvez exporter qu’au format shapefile en utilisant cet outil.
5. Définissez les options de codage, de SRC Source et de SRC cible, ou bien vous pouvez les laisser désélectionnées afin d’utiliser les valeurs par défaut. Sélectionnez Ecraser l’existant si vous souhaitez remplacer un fichier existant.
La capture d’écran suivante montre l’exportation vers un shapefile de la table hotels.
export d'une table spatialite vers un fichier shape

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

39 thoughts on “Importer des tables dans une base de données SpatiaLite avec QGis 2.8

  1. Bonjour,

    Je suis en train de travailler votre tutoriel car ça m’intéresserai de pouvoir gérer sous QGIS une base de données naturaliste (qui contient plusieurs tables) avec SpatiaLite.

    Problème, j’échoue au niveau de la requête SQL :

    UPDATE piafs_48
    SET geom = MakePoint(X_LAMBERT93,Y_LAMBERT93,2154) ;

    Message d’erreur :
    piafs_48.GEOM violates Geometry constraint [geom-type or SRID not allowed]

    Pourquoi le RGF93 (EPSG:2154) serait « not allowed »???

    NB : j’ai bien entré en paramètre, lors de l’ajout de la colonne géométrique, 2154 comme SRID.

    Je ne comprend pas l’échec de cette requête qui est la copie fidèle de celle du tutoriel.

      1. Un des problèmes récurrents (mais pas forcément le votre) vient tout bêtement du nom du champ géométrie. Surtout ne mettez pas de majuscules (par ex. Geometry) au moment de la création de la colonne.
        Si ce n’est pas ça, on cherchera ailleurs…

        1. (re) Bonjour,

          Oui, c’était bien ça, j’avais tout mis en majuscule, avec « GEOM ». Avec « geom » tout en minuscule, tout fonctionne comme dans le tutoriel.

          J’ai un autre problème, l’utilisation de SpatiaLite me fait systématiquement planter QGIS, avec des plantages « dumpés » (message d’erreur contenant : « minidump déposé dans C »), QGIS ferme subitement mais je ne perd aucune donnée.

          Jamais eu ce problème avant de tester SpatiaLite, mais ça dissuade de se servir de ce SGBD intégré à QGIS si ça ferme le programme de manière intempestive.

          1. De mon côté je n’ai jamais de plantage. Mais aujourd’hui il y a tellement de configurations matérielles et logicielles différentes qu’il est impossible de garantir la communication entre deux logiciels partout. Dans ce cas précis, il ya en plus le problème de version QGIS. QGis propose deux types de versions: les versions courantes (la 2.12 en est une) où l’on trouve des bugs à corriger, et des version LTR (LTR: Long Term Release, actuellement c’est la 2.8.3).
            Si vous travaillez dans un environnement de production où la stabilité prime sur la nouveauté, ou si vous rencontrez des problèmes tels que le votre, il vaut mieux utiliser une LTR où la majorité des bugs ont été corrigés.

  2. J’ai fais quelques recherches et le problème des « plantages dumpés » n’a pas l’air lié à SpatiaLite et n’a pas l’air facile à cerner, certains parlent du fait que Windows laisse des « morceaux » trainer à chaque mise à jour… Si c’est ça le problème, il sera bientôt résolu pour moi car je compte passer mon portable sous Linux dans quelques semaines… Mais c’est un autre sujet !

    Je n’ai perdu aucune donnée c’est l’essentiel. Le but pour moi est de traiter en local des données personnelles entrées dans une BDD naturaliste participative en ligne.

    1. Sous Linux ou sous Windows, un bon conseil, travaillez avec la dernière LTR. Rappelez-vous que vous pouvez installer deux versions différentes de QGis en même temps. Chacune d’elles s’installe dans un répertoire séparé. Vous pouvez utiliser la dernière version disponible pour tout ce qui n’est pas important, et utiliser la LTR quand vous travaillez sur votre projet.

  3. Bonjour et un grand merci pour ce tuto qui m’a beaucoup aidé dans mon travail !

    J’ai pu réaliser toutes les étapes excepté le fait que quand j’importe mon fichier CSV et que je vais sur l’onglet aperçu, rien ne s’affiche.
    Pourtant je n’ai aucun message d’erreur, j’ai bien créé mon champ « geom ».

    Et quand j’ajoute la couche aucun point ne s’affiche non plus.
    C’est un fichier qui fonctionnait parfaitement lorsque je l’importais en faisant « ajouter une couche de texte délimité » depuis QGIS (2.14.1).

    La seule chose anormale c’est l’apparition de 8 déclencheurs qui contiennent entre autre:
    ‘Bretagne.geom violates Geometry constraint [geom-type or SRID not allowed]’

    Si vous auriez une idée d’où ça peut venir ça m’aiderai beaucoup !

    Bonne journée !

    1. Sans voir les données c’est compliqué de trouver le problème, mais la première chose à vérifier est le système de coordonnées de vos données et de la table créée. Dans l’article les données sont en coordonnées géographiques (latitude/longitude) et donc le SRID entré est le 4326. Est-ce que vos données sont en géographique ou en système projeté (Lambert 93, …)? Si c’est le cas vous devez rentrer le code EPSG de votre système à la place du 4326.
      Les valeurs de X et Y dans votre CSV sont entre 0 et 100 ou de plusieurs milliers? Dans le premier cas c’est du géographique, dans le deuxième un système projeté.

      1. Mes données sont en coordonnées géographiques et j’utilise effectivement le SRID 4326.
        Mon tableau ressemble à ça:

        Latitude ; Longitude ; Type d’installation
        48 ; -3 ; installation

        La table s’importe bien, je n’ai juste aucun point ni dans l’aperçu, ni sur ma couche qui s’affichent (ma couche détecte bien toutes les entités disponibles).

  4. Comment fait-on pour suivre ce tutoriel sans les données hotels.xls?

    PS : Veuillez m’excuser par avance si celles ci sont évidemment téléchargeables mais je ne les ai pas trouvées?

    1. N’importe quel fichier excel contenant des latitudes et longitudes fait l’affaire. Dans l’exemple j’utilise une table « hotels » mais c’est juste une illustration. Vous pouvez créer une table excel avec quelques lignes et des latitudes et longitudes quelconques pour suivre la démarche.

  5. Bonjour,

    Tout d’abord merci pour votre tutoriel qui permet de bien comprendre le fonctionnement de SpatiaLite. Je dois créer des polygones sous Qgis mais j’aimerais les tracer « automatiquement » à partir des coordonnées de chaque sommet du polygone à créer plutôt que de les tracer manuellement. Dans votre tuto vous prenez l’exemple des hôtels (points) et dans mon cas j’ai des multipolygones, ma table Excel comprend un champ « geometrie » qui reprend pour chaque entité les coordonnées de chaque sommet du polygone (X1, Y1, X2, Y2, X3, Y3, etc.). Je ne vois pas la marche à suivre ensuite pour créer ces polygones.

    Si vous pouvez m’aider cela me rendrait un grand service !

    Bonne journée,
    Emilie

    1. le champ geometrie doit être en WKT: « POLYGON((10 10,20 20,20 30,10 10)) » Vous devrez donc reformater le contenu de ce champ.
      Une fois fait vous pouvez utiliser la commande « Créer une couche depuis un fichier à texte délimité (CSV) » en utilisant l’option « Well Known Text(WKT) » à la place de « point » dans « Définition de la géométrie »

      1. Tout d’abord je vous remercie de me répondre si rapidement, j’avais en effet vu sur plusieurs sites internet que la géométrie devait être en WKT, seulement je ne vois pas comment passer de mes coordonnées en Lambert 93 à ce format ? Cela se fait dans le fichier Excel ?
        J’aurais une autre question sûrement stupide, mon polygone sera toujours géoréférencé ? Il se superposera sans problème sur une couche projetée en Lambert 93 ?

        1. Il s’agît de traitement de texte. Pouvez-vous me fournir le contenu du champ geometrie pour un enregistrement? Ce sera plus simple pour vous indiquer comment faire (si j’arrive à trouver!)
          Et, oui, les polygones seront géoréférencés.

          1. D’accord. Voilà pour un enregistrement (c’est un test sur un petit polygone) X1 Y1, X2, Y2 etc. :
            « POLYGON((1840137.26773 4236864.8587, 1840105.3101 4236864.06, 1840116.56402 4236866.48231, 1840167.21 423677.46, 1839834.73 4236834.43 1840137.26773 4236864.8587, 1840105.3101 4236864.06, 1840116.56402, 4236866.48231, 1840167.21 4236774.46, 1839834.73 4236834,43)) »

            Super !

  6. Ce sera peut être plus évident si je vous explique mon objectif : je dois pouvoir mettre à jour la cartographie des Zones à vocation économiques en fonction des zonages établis par les Plans Locaux d’Urbanisme en me basant sur le cadastre. Pour cela j’aimerai pouvoir automatiser la création de ces zones plutôt que de tracer les polygones à la main dans Qgis et donc créer une réelle base de données (remplaçant l’actuelle table attributaire). Pensez-vous qu’il serait plus judicieux de réaliser une application métier et/ou de de développer un plugin Qgis ou il serait possible de rentrer les numéros de parcelles concernées par la ZAE, le nom de celle-ci etc. ?

    1. Ah non je disais super pour le fait qu’ils étaient géoréférencés mais je ne parviens toujours pas à formater le champ, Qgis m’ouvre un message d’erreur lorsque j’essaye d’importer le CSV.

      1. Votre formatage est bon. Il y a une erreur à la fin où il y a une virgule à la place d’un point. Si vous corrigez ça, le champ WKT est bien formaté.
        A part ça, comme vous avez des virgules dans le champ wkt, vous devez utiliser les ; comme séparateurs de champ dans le fichier csv
        J’ai fait un test avec comme paramètres dans la fenêtre de création de couche à partir du csvc:
        format du fichier: délimiteurs personnalisés -> point-virgule
        et ça a bien marché.
        Pour la question plus globale de votre démarche tout dépend du volume de données et de vos compétences informatiques. Voyez aussi du côté du modeleur graphique si ça peut répondre à vos besoins.

        1. Merci beaucoup je vais modifier l’erreur et l’intégrer dans Qgis.
          Le volume de données n’est pas énorme mais elles portent tout de même sur 6 communautés de communes. Je suis encore étudiante à l’université et nous avons eu des cours de développement, je ne suis pas une experte mais j’ai quelques mois pour y parvenir. Je vais regarder le modeleur graphique aussi alors. Sinon sur le fond cette application métier est réalisable ?

  7. Je ne comprends pas même en modifiant l’erreur de la virgule à la fin Qgis me sort le même message d’erreur :

    1 enregistrements écartés pour cause d’invalidité de la géométrie
    Les lignes suivantes n’ont pu être chargées dans QGIS à cause d’erreurs :
    WKT invalide à la ligne 2

    Pourtant j’ai bien utilisés les ; comme délimiteurs personnalisés..

      1. Eh ben la ligne 1 correspondrait aux noms de champs et la ligne 2 au polygone avec les coordonnées mentionnées plus haut, je n’en ait qu’un dans cette table, c’est juste un test.

        1. j’ai fait un fichier csv avec:
          Id;WKT
          1;POLYGON((1840137.26773 4236864.8587, 1840105.3101 4236864.06, 1840116.56402 4236866.48231, 1840167.21 423677.46, 1839834.73 4236834.43 1840137.26773 4236864.8587, 1840105.3101 4236864.06, 1840116.56402, 4236866.48231, 1840167.21 4236774.46, 1839834.73 4236834.43))
          et je n’ai pas eu de message d’erreur en le chargeant dans QGis
          J’ai indiqué comme SRC RGF93/Lambert93

        1. Pour insérer le CSV dans Qgis vous utilisez bien l’option créer une couche depuis un fichier à texte délimité (CSV) : la petite virgule bleue à gauche dans Qgis ? Oui en-têtes en 1ère ligne est coché mais je ne peux pas indiquer de SRC à cette étape. J’ai beau réessayer de recréer un csv ça ne fonctionne toujours pas…

  8. Bonjour,
    merci pour ce tutoriel.
    J’ai essayé avec mon fichier excel qui contient un champ avec les longitudes et latitude (concaténées). J’ai créée deux champs séparés our avoir un champ longitude et un champ latitude. Le format de ces deux champs est du style 49.072200 et 1.622906. Je suis en 4326.
    J’ai suivi le tutoriel et tout va bien jusqu’à l’étape 6.
    Aucun point ne s’affichent dans l’aperçu.

    Je suis débutante. J’aurais vraiment besoin d’un coup de main.

    Merci.

    Carol

    1. Il y a mille raisons possibles, mais déjà est-ce que vous avez fait ce qui est indiqué juste après: » Pour afficher le nouveau tableau, vous devrez actualiser l’arborescence en sélectionnant BaseTest.sqlite dans l’arborescence puis cliquez sur Actualiser sous Base de données ou appuyez sur la touche F5 de votre clavier. La table des Hôtels devrait maintenant apparaître avec l’icône de table à côté d’elle. »?

      1. Oui, j’ai fait l’actualisation. La table apparaît avec une icone de points (comme la table Hotels) mais l’aperçu est désespérément vide.
        auriez-vous une autre piste?
        Cordialement,

        Carol

        1. Bonjour,
          merci pour votre aide. Mon problème venait d’un plantage de Qgis. Maintenant je vois bien mes points.
          Mais Qgis tend à planter régulièrement. Je suis sous Windows 10, 64 bits.
          Cordialement,
          Carol

  9. Bonjour, et merci pour ce tutoriel.
    Je dispose d’un bdd spatialite avec une arborescence et des tables déjà construites mais vides. Je souhaiterais les remplir avec des données xls ou csv. Lorsque j’utilise la méthode décrite dans le tuto je parviens simplement à ajouter une nouvelle table dans mon arborescence mais pas à renseigner les tables vides déjà existantes. Auriez-vous une méthode pour faire cela ?
    Merci beaucoup !
    Martin

    1. Il faudrait que je fasse un article sur le sujet, mais pour vous répondre à la volée: avec le DB Manager de qgis, quand vous optez pour importer un fichier (shape) vous avez dans la fenêtre de paramétrage une option à cocher « ajouter à une table existante »

      1. Bonjour François, merci pour votre réponse. Il y a bien une option à cocher « remplace la table de destination (si existante) » mais pas de « ajouter à une table existante ». Etes-vous certain qu’il y a cette option ? et oui ce serait vraiment bien un article complet sur le sujet !!
        Merci beaucoup
        Martin

          1. Ok je comprends. Un grand merci pour votre réactivité et pour bien vouloir vulgariser un peu ces outils ! je reste donc attentif aux publications sur le site.

  10. Bonjour,

    J’arrive parfaitement à réaliser votre tuto, seulement je souhaiterai maintenant automatiser cela, avez vous des pistes, un forum, j’ai déjà effectuer quelques recherches mais je ne trouve rien de concluant.

    Merci d’avance

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *