Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#1 Fri 07 August 2020 10:18
- chanteclair
- Participant assidu
- Lieu: Pau
- Date d'inscription: 3 Jan 2007
- Messages: 726
QGIS: Questions QField/PGSQL/PostGIS
Bonjour à tous,
Je réalise actuellement des tests avec QField pour permettre à des collègues de faire des relevés terrain sur divers domaines (localisation d'espèces envahissantes, ouvrages d'art, décharges sauvages...). Je l'utilise en mode hors-ligne car les zones blanches sont encore nombreuses sur notre secteur (sinon, en mode connecté, nous passons par Lizmap).
J'ai donc installé hier la version de QField disponible sur le PlayStore sur une tablette Samsung Galaxy Tab S3.
Pour le PC, c'est Windows 10 Pro, QGIS 3.4.5, QField Sync 3.2.1, serveur PGSQL 9.6, PostGIS 2.3.3
J'ai préparé un projet avec quelques couches issues de PGSQL dont une seule est modifiable via QField. Les couches vectorielles sont paramétrées, pour ce qui est de la colonne "Action" du plugin QField en "édition hors ligne".
Je récupère le dossier créé, le transfère sur la tablette et ouvre le projet dans QField. Tout fonctionne correctement, je peux ajouter de nouveaux objets et faire la saisie attributaire.
Un point me gêne cependant : mes couches PGSQL ont toutes des id de type SERIAL mais dans QField, je ne retrouve pas cette auto-incrémentation. Pour pouvoir valider la saisie d'un objet, il faut avoir pris au préalable soin de noter le n° du dernier id pour saisir manuellement le suivant.
De retour au bureau, je rapatrie mon dossier et resynchronise mes données via le plugin.
J'ai d'abord un message d'erreur :
Code:
2020-08-06T15:37:00 WARNING Traceback (most recent call last): File "C:/Users/xxxxxx/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\qfieldsync\core\offline_converter.py", line 263, in on_offline_editing_next_layer msg = self.trUtf8('Packaging layer {layer_name}…').format(layer_name=self.__offline_layers[layer_index - 1].name()) RuntimeError: wrapped C/C++ object of type QgsVectorLayer has been deleted
mais au final, les données saisies sur le terrain sont bien réintégrées dans la couche PGSQL.
Voici donc les questions que je me pose :
Est-il normal que l'auto-incrémentation ne se poursuive pas sur QField ? Ai-je loupé une étape/un paramétrage qui empêche l'auto-incrémentation de l'id dans QField ?
Cela risque de poser des problèmes de réintégration à terme dans PGSQL surtout si plusieurs personnes saisissent sur la même couche sur le terrain ? Du coup, faut-il continuer ainsi ou passer par des fichiers shp pour QField et faire du copier/coller d'objets dans la couche PGSQL de retour au bureau (pour le coup, les nouveaux objets seront renumérotés à l'enregistrement de la couche PGSQL) ?
Si la prise de photos sur le terrain se passe bien, le chemin stocké, du type DCIM/fichier.jpg, n'est plus opérationnel une fois les objets resynchronisés dans PGSQL. Hormis passer par la calculatrice de champs, est-il possible d'éviter cette manipulation (j'ai lu sur ce forum que les photos pouvaient être stockées dans un répertoire propre à la couche mais je n'ai rien trouvé de tel dans le plugin).
Merci par avance de votre aide.
Hors ligne
#2 Fri 07 August 2020 13:18
- sylvainSIG
- Participant assidu
- Lieu: Moissac
- Date d'inscription: 29 Nov 2018
- Messages: 265
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour,
J’ai travaillé récemment sur un projet similaire au tien. Pour les couches postgresql/postgis je me suis résigné à faire des shapefiles que j importe dans la tablette en même temps que le projet (avec l’extension qfieldsync), n ayant pas internet partout sur le terrain.
Pour l auto incrémentation, je sais pas trop. qfieldsync ne suffit pas pour importer un projet vers qfield. Il te faut passer par format de champ (?) dans les propriétés de la couche pour donner un nom, une contrainte (nb de caractère) ou le type de saisie. Peut être la solution peut venir de la.
Pour les photos, j avais créé un répertoire sur la tablette, et un autre sur l ordi avec le même nom. C’est la l importance clé être en chemin relatif plutôt qu’en absolu.
J espère que ça t aidera
Bien à toi
Sylvain
Hors ligne
#3 Fri 07 August 2020 14:57
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour,
Vérifiez mais je suppose que QFieldSync transforme les couches postgres en geopackage.
Si cela ne fonctionne pas correctement passez par le plugin d'édition hors connexion prévu pour cela qui est installé par défaut mais pas activé.
Pour l'installer allez dans les extensions puis Installer et activer les extensions.
Ensuite cela se passe dans l'onglet Base de données > Edition Hors connexion > Convertir en projet hors connexion
Sélectionnez uniquement les couches distantes
Une fois, le projet transféré avec les couches dans qfield et l'édition faite sur terrain, ouvrez de nouveau le projet.
Base de données > Edition hors connexion puis synchroniser.
Je n'ai jamais eu de probleme concernant l'id automatique.
Cordialement,
Hors ligne
#4 Sat 08 August 2020 09:03
- geomoes
- Juste Inscrit !
- Date d'inscription: 7 Aug 2020
- Messages: 1
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonsoir,
je travaille régulièrement avec QfieldSync / Qfield et des bases de données Postgis. Si vous choisissez 'offline editable' dans la configuration de Qfieldsync pour la couche Postgis, Qfieldsync cré un fichier geopackage data.gpkg qui contient toutes les couches à éditer. Toutes les changements sont enrégistrés dans ce fichier. Lors de la synchronisation des données collectées dehors Qfieldsync utilise ce fichier pour mettre à jour la couche PostGis. Il faut pas se tracasser la tête avec les id (type SERIAL). Vaut pas la peine d'utiliser des shape-files.
Have fun collecting data in the field.
Hors ligne
#5 Mon 10 August 2020 08:59
- chanteclair
- Participant assidu
- Lieu: Pau
- Date d'inscription: 3 Jan 2007
- Messages: 726
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour à tous,
Merci pour vos retours.
@sylvainSIG : je note l'astuce des 2 répertoires pour les photos.
@JD : je pensais que le menu "Paquet pour QField" du plugin QField Sync faisait ce travail de passage hors connexion mais je testerai cela dès demain, quand j'aurai la tablette.
@geomoes : je fais bien la procédure que vous décrivez mais comme l'ID ne peut être nul, je suis obligé d'en saisir un sur la tablette. Si le n° est déjà existant, il est refusé (logique) mais du coup, il faut y aller à tâtons pour en saisir un qui passe (ou alors aller dans des numérotations extrêmes pour être "tranquille").
Et j'ai constaté que l'ID saisi est rapatrié tel quel dans la BDD PGSQL, ce qui me gêne un peu pour le fonctionnement de la table plus tard.
Par ex, si je pars avec une tablette contenant 10 objets avec ID de 1 à 10. J'en saisis un sur le terrain, numéroté 15 (car je n'ai pas contrôlé la numérotation en cours avant de partir) et je rapatrie mes données au bureau. J'aurai bien 11 objets numérotés de 1 à 10, puis 15. La séquence de la table PGSQL elle sera passée au mieux à 12 en valeur à venir mais pas à 16.
Par ailleurs, quelqu'un a-t-il eu ou une idée du message d'erreur rencontré à la synchronisation via le plugin QField Sync ?
Hors ligne
#6 Wed 09 June 2021 09:16
- Al3+
- Participant actif
- Lieu: Fécamp
- Date d'inscription: 5 Sep 2005
- Messages: 60
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour,
Je paramètre un projet pour Qfield depuis quelques jours et j'ai réussi à contourner quelques difficultés (gestion des pères/fils, photos, processus export/saisie/import, ...)
Tout me semblait correct : je pouvais créer des éléments, afficher des formulaires "conditionnels" (en fonction d'une valeur de champ), remplissage automatique de champs, gestion des clés primaires (passage par des UUID) mais finalement, j'ai découvert un gros souci : à la synchronisation vers PostGres, les mises à jour ne sont pas réalisées. Cela signifie que l'on peut créer sans problème de nouvelles données mais on ne peut pas mettre à jour la base de données existante.
Avez-vous déjà rencontré ce problème et si oui, comment avez-vous pu le résoudre ?
Contexte :
- Qfield 1.9.6
- QGis 3.16.1
- QfieldSync 3.4.3
Pour info, j'ai également testé la V4.0.5bêta de QFieldSync mais dans ce cas, il ne se passe rien du tout lors de l'import de données (synchronisation retour). Même pas un message d'erreur.
Je vous remercie par avance de toute aide.
Hors ligne
#7 Wed 09 June 2021 09:32
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour,
Nous travaillons sur un projet similaire et nous avons rencontré les mêmes difficultés que vous concernant les mises à jour, voire suppressions.
Les UUID ne sont pas bien gérés dans le journal lors de la resynchro de même que le type bigint. Nous avons dû générer un id maison en int à base de la date en format epoch + un compteur afin de nous en sortir.
Si qqun a une solution plus simple, je suis preneur.
Toujours est-il que maintenant tout fonctionne bien : insert, update et delete avec cascade sur les tables filles.
Bon courage à vous.
Hors ligne
#8 Fri 11 June 2021 16:59
- Al3+
- Participant actif
- Lieu: Fécamp
- Date d'inscription: 5 Sep 2005
- Messages: 60
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour Ben22,
Merci pour votre retour.
Je viens seulement de retenter votre manipulation qui semble correspondre à mon problème mais je n'ai malheureusement pas réussi à m'en sortir. J'ai utilisé un nouveau champ rempli par défaut avec epoch(now()).
Voici mes essais :
- champ GID en INTEGER : pas possible car epoch(now()) génère un nombre à 13 chiffres qui dépasse les limites d'un INT
- champ GID en BIGINT : ne fonctionne pas non plus ce qui peut être lié à ce point de votre réponse :
Les UUID ne sont pas bien gérés dans le journal lors de la resynchro de même que le type bigint.
- champ GID en BIGSERIAL : ne fonctionne toujours pas...
Nous avons dû générer un id maison en int à base de la date en format epoch + un compteur afin de nous en sortir.
--> Pouvez-vous préciser quel type de champ vous avez utilisé exactement ? INTEGER, NUMERIC, ...?
--> a quoi ressemble votre "id maison" SVP ? date en format epoch + compteur ? Pourquoi un compteur en plus ? Epoch ne suffit pas ?
Je vous remercie par avance pour votre retour.
Bon weekend.
Hors ligne
#9 Tue 15 June 2021 12:08
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour ,
Nous avons arrondi le format epoch à la seconde pour que cela passe en INT4 :
Code:
left(epoch(now()), 9)
Et nous avons ajouté un compteur dans le cas ou plusieurs enregistrements seraient créés dans la même seconde :
left(epoch(now()), 9) + $id
Bien à vous.
Hors ligne
#10 Thu 17 June 2021 17:02
- Al3+
- Participant actif
- Lieu: Fécamp
- Date d'inscription: 5 Sep 2005
- Messages: 60
Re: QGIS: Questions QField/PGSQL/PostGIS
Un très grand MERCI à vous Ben22, cette solution est fonctionnelle !
Pour info, j'ai fait un left(epoch(now()),10) au lieu de 9 :
--> ça rentre bien dans les limites de Integer codé sur 4 bytes
--> sauf erreur de ma part la valeur change toutes les secondes et non toutes les 10 secondes
Hors ligne
#11 Thu 28 April 2022 16:27
- Sielnes
- Juste Inscrit !
- Date d'inscription: 4 Mar 2022
- Messages: 7
Re: QGIS: Questions QField/PGSQL/PostGIS
Bonjour à tous,
Je suis face au même problème que vous mais il semblerait que je ne maitrise en revanche pas aussi bien le logiciel que vous...
J'aurais voulu savoir s'il était possible d'avoir une méthode pas à pas pour la réalisation de ces manipulations ?
Cordialement.
Etienne.
Hors ligne