La valeur `null` est comprises comme une chaîne de caractères dans les propriétés d'une donnée source au format GeoJSON.
J'ai tenté une exécution d'intégration de donnée vecteur à partir du fichier GeoJSON suivant : detection.geojson
Ce fichier, généré par ogr2ogr
(GDAL 3.4.1) à partir d'une table postgresql-14;postgis-3.4
, contient des propriétés vides/nulles. Conformément au standard JSON, ces propriétés sont alors décrites par la valeur null
(et pas "null"
).
Lors de l'intégration en BDD sur la Géoplateforme, donc en utilisant l'exécutable issu de ce dépôt de code, l'insertion de telles valeurs dans des colonnes numériques a échoué. L'erreur mentionnée dans les journaux d'exécution est la suivante :
"\"nb_construction\" is of type integer but expression is of type character varying"
Visiblement, la valeur JSON null
est interprétée par vector_to_db
comme une chaîne de caractère, au lieu d'être comprise comme un type nul.
(Logs complets de l'exécution en erreur : logs_erreur_execution.json)
Je n'ai pas reproduit ce comportement localement. J'ai testé l'exécutable ogr2ogr et des commandes en shell python depuis un conteneur généré à partir des fichiers dockerfile et docker-compose suivants :
- main.Dockerfile (inspiré du fichier Dockerfile de ce dépôt)
- docker-compose.yaml
La BDD était initialisée à partir de ces commandes : creation_tables_vues.sql La commande ogr2ogr utilisée pour charger le fichier dans la BDD était :
ogr2ogr -append -preserve_fid -a_srs "EPSG:2154" "PG:host=${PGHOST} port=${PGPORT} dbname=${PGDATABASE} user=${PGUSER} password=${PGPASSWORD} SCHEMAS=parcs_photovoltaiques TABLES=detection" ./detection.geojson
Les instructions python étaient :
import os
from osgeo import ogr, osr
ogr.UseExceptions()
osr.UseExceptions()
ogr_in_ds = ogr.Open('/user/app/bind/detection.geojson')
ogr_in_lay = ogr_in_ds.GetLayerByIndex(0)
pg_string = f"PG:host={os.environ['PGHOST']} port={os.environ['PGPORT']} dbname={os.environ['PGDATABASE']} user={os.environ['PGUSER']} password={os.environ['PGPASSWORD']} SCHEMAS=parcs_photovoltaiques"
ogr_out_ds = ogr.Open(pg_string, 1)
ogr_out_lay = ogr_out_ds.GetLayerByName('detection')
for in_feature in ogr_in_lay:
ogr_out_lay.CreateFeature(in_feature)
Ces deux tests ont correctement intégré les données du fichier GeoJSON dans la base cible. Le problème d'intéerprétation ne semble donc pas venir du comportement par défaut d'OGR.