3liz / QgisCadastrePlugin

A QGIS plugin which helps users to import the french land registry ('cadastre') data into a database. It is meant to ease the use of the data in QGIS by providing search tools and appropriate layer symbology.
GNU General Public License v2.0
61 stars 41 forks source link

Erreur lors de la création d'une base de données avec spatialite 4.0 #30

Closed landryb closed 10 years ago

landryb commented 10 years ago

Sur une tentative d'import de données MAJIC+EDIGEO sur 2 communes du 63 (63083 et 63470) dans une base spatialite vide, l'import des données EDIGEO échoue:

630PUY-DE-DOME D426042013

Log de la fenetre dans le plugin: INITIALISATION

QGIS affiche une popup avec une traceback python:

An error has occured while executing Python code:

Traceback (most recent call last): File "/home/landry/.qgis2/python/plugins/cadastre/cadastre_dialogs.py", line 1026, in processImport qi.importEdigeo() File "/home/landry/.qgis2/python/plugins/cadastre/cadastre_import.py", line 601, in importEdigeo self.executeSqlScript(scriptPath, item.has_key('divide'), item.has_key('constraints')) File "/home/landry/.qgis2/python/plugins/cadastre/cadastre_import.py", line 891, in executeSqlScript self.executeSqlQuery(sql, ignoreError) File "/home/landry/.qgis2/python/plugins/cadastre/cadastre_import.py", line 935, in executeSqlQuery c.executescript(sql) OperationalError: no such column: geom

Une fois sorti des 2 popups (celle d'erreur, puis celle d'import), qgis affiche toujours un curseur comme quoi il est en train de travailler, mais il n'a plus l'air de faire grand chose.. C'est avec QGIS 2.2 sur OpenBSD, plugin cadastre 0.9.7. GDAL est bien compilé avec le support spatialite (libspatialite 4.0.0).

Ma collegue a fait le test avec les données d'une autre commune (63325) avec QGIS 2.0 sur windows, l'import se passe bien mais il n'y a aucun objet spatial a priori..

mdouchin commented 10 years ago

Bonjour

Pourrais-je avoir la base de données spatialite résultante de l'import manqué des 2 communes ? Email : mdouchin sur 3liz.com

landryb commented 10 years ago

Si j'essaie de charger uniquement les fichiers majic (deja il se plaint que le champ departement ne doit pas etre vide alors qu'il est dans la section edigeo..)

INITIALISATION

puis une traceback python:

An error has occured while executing Python code:

Traceback (most recent call last): File "/home/landry/.qgis2/python/plugins/cadastre/cadastre_dialogs.py", line 1018, in processImport qi.installOpencadastreStructure() File "/home/landry/.qgis2/python/plugins/cadastre/cadastre_import.py", line 163, in installOpencadastreStructure replaceDict['2154'] = self.targetSrid RuntimeError: super-class init() of type cadastreImport was never called

landryb commented 10 years ago

Si je decommente le logging du sql dans le code du plugin, l'erreur de l'import EDIGEO se fait sur cette requete:

-- geo_commune: utilisation de max et non distinct on pour compatibilite sqlite INSERT INTO geo_commune ( geo_commune, annee, object_rid, idu, tex2, creat_date, update_dat, geom, lot) SELECT '2013'||SUBSTR(idu,1,3), '2013', object_rid, idu, tex2, date(substr(CAST(creat_date AS TEXT), 1, 4) || '-' || substr(CAST(creat_date AS TEXT), 5, 2) || '-' || substr(CAST(creat_date AS TEXT), 7, 2)), date(substr(CAST(update_date AS TEXT), 1, 4) || '-' || substr(CAST(update_date AS TEXT), 5, 2) || '-' || substr(CAST(update_date AS TEXT), 7, 2)), ST_Multi(geom), '63083' FROM commune_id JOIN (SELECT idu as t_idu, MAX(update_date) AS t_update_date, MAX(creat_date) AS t_creat_date FROM commune_id GROUP BY idu, tex2) t2 ON idu = t2.t_idu AND update_date = t2.t_update_date AND creat_date = t2.t_creat_date GROUP BY tex2, idu, update_date, creat_date, geom, object_rid ORDER BY tex2, idu, update_date DESC, creat_date DESC

L'erreur est bien:

Error: no such column: geom

il n'y a pas cette colonne dans la table:

sqlite> .schema commune_id CREATE TABLE commune_id ( ogc_fid INTEGER PRIMARY KEY AUTOINCREMENT, object_rid character varying, idu character varying, tex2 character varying, creat_date integer, update_date integer

Je suppose que la table commune_id vient de la feuille cadastrale edigeo. Si je regarde mes edigeo et que je les ouvre directement dans qgis, toutes les tables commune_id ont bien un element..

mdouchin commented 10 years ago

Il semble que la base de données n'est pas le support Spatialite. Si elle a été créée via le plugin, bien vérifier que pyspatialite est bien présent et utilisable dans python. Une base de données spatialite vide, mais avec les fonctions et types géométriques (+ les projections) fait environ 4 Mo

landryb commented 10 years ago

Sur mon qgis 2.2/OpenBSD, je n'ai effectivement pas pyspatialite installé sur le systeme (ie dans les libs de python), mais il semble présent dans QGIS:

share/qgis/python/pyspatialite/ share/qgis/python/pyspatialite/init.py share/qgis/python/pyspatialite/_spatialite.so share/qgis/python/pyspatialite/dbapi2.py share/qgis/python/pyspatialite/dump.py

Si j'ouvre la console python dans QGIS, je peux faire 'import pyspatialite' sans erreur.

Est-ce différent de https://github.com/lokkju/pyspatialite ?

Pour le qgis 2.0/windows, c'est la configuration/installation par défaut, donc je suppose que pyspatialite est inclus..

landryb commented 10 years ago

spatialite en soi doit bien marcher, car je peux creer une nouvelle couche vectorielle spatialite a partir de rien, et elle fait bien environ 4 mo. Les 4/5 tests que j'ai tenté de faire via le plugin cadastre produisaient bien des fichiers sqlite d'une taille supérieure, mais aucun ne s'ouvre/importe comme une couche spatialite dans qgis. Je peux les ouvrir dans spatialite_gui ou la ligne de commande spatialite et Les tables ont bien l'air d'etre la, mais vides. Les fonctions spatiales sont bien dans le fichier aussi, la table geometry_columns est bien remplie...

landryb commented 10 years ago

Je viens de refaire le meme test avec la version 0.9.9 du plugin, et j'ai toujours le meme souci. L'import majic a l'air de bien se passer, mais l'import edigeo echoue a 37% de l'import des relation (.vec). La BDD resultante fait 67Mo pour une commune, mais si j'essaie de m'y connecter avec qgis j'ai un message d'erreur: 'Unexpected error when working with: /home/landry/datas/test-plugin-cadastre-qgis/63470.sqlite' Je peux m'y connecter avec la ligne de commande spatialite et spatialitegui par contre.. toutes les tables non nommées geo* ont bien des données, et certaines des tables cartographiques ont des données, mais pas d'objet geometrique.

landryb commented 10 years ago

L'import majic se passe bien, et edigeo s'arrete a 36% 'import des relations'

EDIGEO
Type de base : spatialite, Connexion: 63470.sqlite, Schéma: 
* Copie du répertoire /home/landry/datas/test-plugin-cadastre-qgis/src/63470
11 s
* Décompression des fichiers
14 s
Suppression des contraintes
  - SUPPRESSION DES CONTRAINTES D'INTEGRITEES : DEBUT
  - suppression clefs étrangères
  - suppression clefs primaires
  - suppression not null sur clefs primaires
  - SUPPRESSION DES CONTRAINTES D'INTEGRITEES : FIN
14 s
* Import des fichiers EDIGEO dans la base
  - Import des fichiers via ogr2ogr
  - Import des relations (*.vec)

spatialite_tool ne trouve pas de geometrie:

$spatialite_tool -d 63470.sqlite -e -shp section -t geo_section -g geom --type POLYGON -c CP1252
SQLite version: 3.8.4.3
SpatiaLite version: 4.0.0
dump shapefile MetaData error: <no such table: geometry_columns>
Exported 0 rows into 'section.shp' from 'geo_section'
spatialite> .schema geo_section
CREATE TABLE geo_section
(
  geo_section character varying(12) NOT NULL,
  annee character varying(4) NOT NULL,
  object_rid character varying(80),
  idu character varying(8),
  tex character varying,
  geo_commune character varying(7) NOT NULL,
  creat_date date,
  update_dat date,
  lot character varying,
  ogc_fid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
);

et donc pas de table geometry_columns. Quelle est la partie sensée créer les tables geometry_columns et spatial_ref_sys? est-ce que je dois les précharger a la main depuis postgis ?

rldhont commented 10 years ago

Bonjour,

Avez-vous essayé d'ouvrir les fichiers *.vec (edigeo) directement avec QGIS ? QGIS via OGR devrait vous proposer de charger plusieurs couches vectorielles. Si tout se passe bien, le plugin devrait pouvoir charger vos données cadastrales EDIGEO. Si ce n'est pas le cas, il y a un problème dans vos données.

landryb commented 10 years ago

je n'ai aucun soucis pour ouvrir les .vec/.thf/etc, par contre je pense avoir trouvé une des sources du pbm - en tout cas avec QGIS 2.4. J'arrive a créer une BDD 'valide' spatialite en utilisant le plugin qspatialite (la bdd a bien les tables geometry_columns/etc, et fait bien ~4.5mo sans données), et a partir de la le plugin cadastre arrive bien a importer des edigeo/majic dans cette base précréée, je peux naviguer dans le PCI, requeter les proprietaires, etc.. l'export PDF ne marche pas, mais deja un grand pas en avant a été fait. Reste a comprendre pourquoi le plugin cadastre n'initialise pas correctement la bdd spatialite lors de sa création, alors que le plugin qspatialite n'a aucun soucis.

landryb commented 10 years ago

Et finalement, la cause possible du probleme, initspatialmetadata() ne s'attend pas a recevoir un entier, mais plutot une chaine de caracteres avec ma version de spatialite (4.0)

$cat foo.py
from pyspatialite import dbapi2 as db
conn=db.connect(unicode('test.spatialite'))
c=conn.cursor()
sql = "select initspatialmetadata(1)"
c.execute(sql)
$PYTHONPATH=/usr/local/share/qgis/python/ python2.7 foo.py  
InitSpatialMetaData() error: argument 1 [mode] is not of the String type
$ls -l test.spatialite
-rw-r--r--  1 landry  wheel  0 Jul 30 16:17 test.spatialite

cf http://hub.qgis.org/issues/8340, http://lists.osgeo.org/pipermail/gdal-dev/2013-October/037248.html, et https://groups.google.com/forum/#!msg/spatialite-users/La8BUrVKX_g/lGJKxnQzp1sJ le fait de passer un 1 devrait dépendre de la version de spatialite trouvée.. ca a été corrigé de cette facon dans gdal: http://trac.osgeo.org/gdal/changeset/26532

Si dans ma version de cadastre_dialogs.py je fait 'select initspatialmetadata()' sans le 1, la création d'une bdd spatialite vide se fait bien dans le plugin, ainsi que l'import de données.

landryb commented 10 years ago

A noter qu'une autre possibilité est de faire initspatialmetadata('1'), ce qui passe effectivement une string a la fonction - je ne sais pas ce qui est sensé etre le plus compatible entre les différentes versions de spatialite.

rldhont commented 10 years ago

Merci d'avoir trouvé la raison du bug.

@mdouchin devrait pouvoir corriger ça rapidement.

mdouchin commented 10 years ago

Correctif appliqué dans le commit lié cc395de35c685cb530f2088beedc0cee3c01fba4 . Merci de tester :)

landryb commented 10 years ago

Bug bien fixé par ce commit, merci!