Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Sat 02 May 2020 16:12

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

[PostGreSQL] ExifTool To PostGreSQL

Re bonjour,
Suite à ce sujet qui ne concernait que la problématique des dates EXIF, je me permet de faire remonter mon appel à l'aide sur la communauté des utilisateurs de l'excellent programme ExifTool : https://exiftool.org
Cet outil permet de manipuler les métadonnées (EXIF, XMP, ...) des photos, pour les extraire, les mettre à jour, ...
Il m'a d'ors-et-déjà permis de générer une table de base de 120000 photos géolocalisées dans PostGre, et ceci en un temps tout à fait raisonnable (45 minutes de scan).

Cependant, je n'ai pour l'instant récupéré que quelques métadonnées de base (date, modèle d'appareil photo, chemin, coordonnées GPS, ...), via cette commande, qui pourra peut-être en intéresser certains :

Code:

exiftool -T -r -Directory -filename -DateTimeOriginal -model -GPSLatitude# -GPSLongitude# -ext jpg -charset FileName=Latin "M:\Photos" > "M:\Photos\dbphotos.txt"

Phil Harvey, le créateur d'Exiftool, m'a suggéré une méthode qui créé une base SQLite, mais ses scripts sont en Perl, et je n'aurai pas la compétence pour les adapter à mes besoins. Sa solution est en réponse à ma question sur ce fil.

Peut-être qu'un autre géomaticien photographe plus compétent que moi serait en mesure de créer un script pour récupérer toutes les métadonnées d'une photothèque dans une base PostGreSQL ?
C'est en tout cas le but de l'ouverture de ce fil !


Sylvain M.

Hors ligne

 

#2 Mon 04 May 2020 15:56

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: [PostGreSQL] ExifTool To PostGreSQL

Salut,

une fois intégrés les tags au format xml ou json à une table pg,
vous pourriez peut être utiliser les fonctions ciblant ces formats pour manipuler les données
et alimenter vos tables.

https://www.postgresql.org/docs/12/functions-xml.html

https://www.postgresql.org/docs/12/functions-json.html

Cela prendrait la forme d'un script bash qui
1) intégrerait les données brutes
2) créeraitles tables si elles n'existent pas
3) exécuterait des requêtes sql pour injecter les données dans les tables.

Hors ligne

 

#3 Mon 04 May 2020 18:46

GeoSignature
Participant occasionnel
Lieu: Saint-Pierre-des-Nids
Date d'inscription: 12 Nov 2019
Messages: 34

Re: [PostGreSQL] ExifTool To PostGreSQL

[erreur de compte : corrigé]
(message qui peut être supprimé)

Dernière modification par GeoSignature (Mon 04 May 2020 18:49)

Hors ligne

 

#4 Mon 04 May 2020 18:48

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

[pardon, j'ai répondu depuis mon compte pro par erreur, je corrige]

Merci Tumasgiu pour tes bons conseils.

J'ai déjà survolé les fonctions XML et JSON de PG, mais je dois avouer qu'il me reste encore du chemin à parcourir pour les mettre en pratique.

Code:

une fois intégrés les tags au format xml ou json à une table pg

Et à vrai dire, c'est justement c'est cette première étape qui va m'être compliquée (pour tout le reste, c'est du SQL, et ça, je "maîtrise").

J'arrive bien à exporter mes tags au format JSON (ou XML) via cette commande :

Code:

exiftool -j -r "M:\monchemin">"M:\dbphotos.json"

Je récupère ainsi un JSON qui contient tous les champs disponibles.
(et qui varient d'un fichier à l'autre, car selon les modèles d'appareils, marques, logiciels, les tags présents sont différents)

Je n'ai pas encore essayé sur la photothèque complète (> 120 000 photos : ça va prendre des heures, mais ça ça ne me dérange pas).
Voici un exemple d'export sur un seul dossier de 51 photos (et je n'ai laissé que la 1ere photo) :

Code:

[{
  "SourceFile": "M:/monchemin/DSC09324.JPG",
  "ExifToolVersion": 11.94,
  "FileName": "DSC09324.JPG",
  "Directory": "M:/monchemin",
  "FileSize": "12 MB",
  "FileModifyDate": "2020:04:21 10:53:08+02:00",
  "FileAccessDate": "2020:04:23 10:52:23+02:00",
  "FileCreateDate": "2020:04:21 10:53:08+02:00",
  "FilePermissions": "rw-rw-rw-",
  "FileType": "JPEG",
  "FileTypeExtension": "jpg",
  "MIMEType": "image/jpeg",
  "ExifByteOrder": "Little-endian (Intel, II)",
  "ImageDescription": "                               ",
  "Make": "SONY",
  "Model": "ILCA-77M2",
  "Orientation": "Horizontal (normal)",
  "XResolution": 350,
  "YResolution": 350,
  "ResolutionUnit": "inches",
  "Software": "ILCA-77M2 v2.00",
  "ModifyDate": "2020:04:21 10:53:08",
  "YCbCrPositioning": "Co-sited",
  "ExposureTime": "1/2000",
  "FNumber": 9.0,
  "ISO": 1000,
  "SensitivityType": "Recommended Exposure Index",
  "RecommendedExposureIndex": 1000,
  "ExifVersion": "0230",
  "DateTimeOriginal": "2020:04:21 10:53:08",
  "CreateDate": "2020:04:21 10:53:08",
  "ComponentsConfiguration": "Y, Cb, Cr, -",
  "CompressedBitsPerPixel": 4,
  "BrightnessValue": 9.38046875,
  "ExposureCompensation": 0,
  "MaxApertureValue": 2.8,
  "MeteringMode": "Multi-segment",
  "LightSource": "Cloudy",
  "Flash": "Off, Did not fire",
  "FocalLength": "105.0 mm",
  "Rating": 0,
  "Brightness": 0,
  "LongExposureNoiseReduction": "Off",
  "HighISONoiseReduction": "Normal",
  "HDR": "Off; Uncorrected image",
  "WBShiftAB_GM": "0 0",
  "FaceInfoOffset": 94,
  "SonyDateTime": "2020:04:21 10:53:08",
  "SonyImageWidth": 6000,
  "FacesDetected": 0,
  "FaceInfoLength": 37,
  "MetaVersion": "DC7303320222000",
  "CreativeStyle": "Standard",
  "ColorTemperature": "Auto",
  "ColorCompensationFilter": 0,
  "SceneMode": "Standard",
  "ZoneMatching": "ISO Setting Used",
  "DynamicRangeOptimizer": "Off",
  "ImageStabilization": "On",
  "ColorMode": "Standard",
  "FullImageSize": "6000x4000",
  "PreviewImageSize": "1616x1080",
  "FileFormat": "ARW 2.3.1",
  "Quality": "Extra Fine",
  "FlashExposureComp": 0,
  "WhiteBalanceFineTune": 0,
  "WhiteBalance": "Cloudy",
  "SonyModelID": "ILCA-77M2",
  "MultiFrameNoiseReduction": "Off",
  "PictureEffect": "Off",
  "SoftSkinEffect": "Off",
  "VignettingCorrection": "Auto",
  "LateralChromaticAberration": "Auto",
  "DistortionCorrectionSetting": "Off",
  "LensType": "Tamron or Sigma Lens (128)",
  "LensSpec": "105mm F2.8",
  "AutoPortraitFramed": "No",
  "FlashAction": "Did not fire",
  "ElectronicFrontCurtainShutter": "On",
  "FocusMode": "AF-A",
  "AFAreaModeSetting": "Expanded Flexible Spot",
  "AFPointSelected": "F6",
  "AFPointsUsed": "F6, G6",
  "AFTracking": "Off",
  "MultiFrameNREffect": "Normal",
  "FlashLevel": "Normal",
  "ReleaseMode": "Continuous",
  "SequenceNumber": 1,
  "Anti-Blur": "On (Shooting)",
  "ShotNumberSincePowerUp": 1,
  "SequenceImageNumber": 1,
  "SequenceFileNumber": 1,
  "SequenceLength": "Continuous",
  "CameraOrientation": "Horizontal (normal)",
  "Quality2": "JPEG",
  "SonyImageHeight": 4000,
  "ModelReleaseYear": 2014,
  "ISOSetting": 1000,
  "ISOAutoMin": 100,
  "ISOAutoMax": 3200,
  "ExposureProgram": "Aperture-priority AE",
  "IntelligentAuto": "Off",
  "FocusPosition2": 113,
  "SonyISO": 1010,
  "BaseISO": 100,
  "StopsAboveBaseISO": 3.3,
  "SonyExposureTime2": "1/1823",
  "SonyMaxApertureValue": 2.8,
  "SonyImageWidthMax": 6024,
  "SonyImageHeightMax": 4024,
  "PictureEffect2": "Off",
  "DistortionCorrection": "None",
  "DistortionCorrParams": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0",
  "VignettingCorrParams": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0",
  "ChromaticAberrationCorrParams": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0",
  "BatteryTemperature": "27.2 C",
  "BatteryLevel": "19%",
  "AFType": "79-point",
  "AFPoint": "F6",
  "AFPointInFocus": "F6",
  "AFPointAtShutterRelease": "(none)",
  "AFAreaMode": "Expanded Flexible Spot",
  "AFStatusActiveSensor": "Out of Focus",
  "AFMicroAdj": 0,
  "AFStatus_00_B4": "Out of Focus",
  "AFStatus_01_C4": "Out of Focus",
  "AFStatus_02_D4": "Out of Focus",
  "AFStatus_03_E4": "Out of Focus",
  "AFStatus_04_F4": "Out of Focus",
  "AFStatus_05_G4": "Out of Focus",
  "AFStatus_06_H4": "Out of Focus",
  "AFStatus_07_B3": "Out of Focus",
  "AFStatus_08_C3": "Out of Focus",
  "AFStatus_09_D3": "Out of Focus",
  "AFStatus_10_E3": "Out of Focus",
  "AFStatus_11_F3": "Out of Focus",
  "AFStatus_12_G3": "Out of Focus",
  "AFStatus_13_H3": "Out of Focus",
  "AFStatus_14_B2": "Out of Focus",
  "AFStatus_15_C2": "Out of Focus",
  "AFStatus_16_D2": "Out of Focus",
  "AFStatus_17_E2": "Out of Focus",
  "AFStatus_18_F2": "Out of Focus",
  "AFStatus_19_G2": "Out of Focus",
  "AFStatus_20_H2": "Out of Focus",
  "AFStatus_21_C1": "Out of Focus",
  "AFStatus_22_D1": "Out of Focus",
  "AFStatus_23_E1": "Out of Focus",
  "AFStatus_24_F1": "Out of Focus",
  "AFStatus_25_G1": "Out of Focus",
  "AFStatus_26_A7_Vertical": "Out of Focus",
  "AFStatus_27_A6_Vertical": "Out of Focus",
  "AFStatus_28_A5_Vertical": "Out of Focus",
  "AFStatus_29_C7_Vertical": "Out of Focus",
  "AFStatus_30_C6_Vertical": "Out of Focus",
  "AFStatus_31_C5_Vertical": "Out of Focus",
  "AFStatus_32_E7_Vertical": "Out of Focus",
  "AFStatus_33_E6_Center_Vertical": "Out of Focus",
  "AFStatus_34_E5_Vertical": "Out of Focus",
  "AFStatus_35_G7_Vertical": "Out of Focus",
  "AFStatus_36_G6_Vertical": "Out of Focus",
  "AFStatus_37_G5_Vertical": "Out of Focus",
  "AFStatus_38_I7_Vertical": "Back Focus (+963)",
  "AFStatus_39_I6_Vertical": "Back Focus (+1064)",
  "AFStatus_40_I5_Vertical": "Out of Focus",
  "AFStatus_41_A7": "Out of Focus",
  "AFStatus_42_B7": "Out of Focus",
  "AFStatus_43_C7": "Out of Focus",
  "AFStatus_44_D7": "Out of Focus",
  "AFStatus_45_E7": "Out of Focus",
  "AFStatus_46_F7": "Out of Focus",
  "AFStatus_47_G7": "Out of Focus",
  "AFStatus_48_H7": "Out of Focus",
  "AFStatus_49_I7": "Out of Focus",
  "AFStatus_50_A6": "Out of Focus",
  "AFStatus_51_B6": "Out of Focus",
  "AFStatus_52_C6": "Out of Focus",
  "AFStatus_53_D6": "Out of Focus",
  "AFStatus_54_E6_Center": "Out of Focus",
  "AFStatus_55_F6": "Out of Focus",
  "AFStatus_56_G6": "Out of Focus",
  "AFStatus_57_H6": "Out of Focus",
  "AFStatus_58_I6": "Out of Focus",
  "AFStatus_59_A5": "Out of Focus",
  "AFStatus_60_B5": "Out of Focus",
  "AFStatus_61_C5": "Out of Focus",
  "AFStatus_62_D5": "Out of Focus",
  "AFStatus_63_E5": "Back Focus (+672)",
  "AFStatus_64_F5": "Back Focus (+671)",
  "AFStatus_65_G5": "Back Focus (+652)",
  "AFStatus_66_H5": "Out of Focus",
  "AFStatus_67_I5": "Out of Focus",
  "AFStatus_68_C11": "Out of Focus",
  "AFStatus_69_D11": "Out of Focus",
  "AFStatus_70_E11": "Out of Focus",
  "AFStatus_71_F11": "Out of Focus",
  "AFStatus_72_G11": "Out of Focus",
  "AFStatus_73_B10": "Out of Focus",
  "AFStatus_74_C10": "Out of Focus",
  "AFStatus_75_D10": "Out of Focus",
  "AFStatus_76_E10": "Out of Focus",
  "AFStatus_77_F10": "Out of Focus",
  "AFStatus_78_G10": "Out of Focus",
  "AFStatus_79_H10": "Out of Focus",
  "AFStatus_80_B9": "Out of Focus",
  "AFStatus_81_C9": "Out of Focus",
  "AFStatus_82_D9": "Out of Focus",
  "AFStatus_83_E9": "Out of Focus",
  "AFStatus_84_F9": "Out of Focus",
  "AFStatus_85_G9": "Out of Focus",
  "AFStatus_86_H9": "Out of Focus",
  "AFStatus_87_B8": "Out of Focus",
  "AFStatus_88_C8": "Out of Focus",
  "AFStatus_89_D8": "Out of Focus",
  "AFStatus_90_E8": "Out of Focus",
  "AFStatus_91_F8": "Out of Focus",
  "AFStatus_92_G8": "Out of Focus",
  "AFStatus_93_H8": "Out of Focus",
  "AFStatus_94_E6_Center_F2-8": "Out of Focus",
  "ReleaseMode3": "Continuous",
  "SelfTimer": "Off",
  "FlashMode": "Fill-flash",
  "HDRSetting": "Off",
  "PictureProfile": "Gamma Still - Standard/Neutral (PP2)",
  "WB_RGBLevels": "669 256 442",
  "MinFocalLength": "105.0 mm",
  "MaxFocalLength": "105.0 mm",
  "DistortionCorrParamsNumber": "11 (APS-C)",
  "SonyMaxAperture": 2.8,
  "SonyMinAperture": 22,
  "Shutter": "Mechanical (2536 4182 5274)",
  "FlashStatus": "Built-in Flash present",
  "ShutterCount": 55797,
  "SonyExposureTime": "1/1823",
  "SonyFNumber": 9.0,
  "ReleaseMode2": "Continuous",
  "InternalSerialNumber": "0706a22367",
  "LensMount": "A-mount",
  "LensFormat": "Full-frame",
  "DistortionCorrParamsPresent": "No",
  "LensSpecFeatures": "",
  "ShutterCount3": 55797,
  "UserComment": "",
  "FlashpixVersion": "0100",
  "ColorSpace": "sRGB",
  "ExifImageWidth": 6000,
  "ExifImageHeight": 4000,
  "InteropIndex": "R98 - DCF basic file (sRGB)",
  "InteropVersion": "0100",
  "FileSource": "Digital Camera",
  "SceneType": "Directly photographed",
  "CustomRendered": "Normal",
  "ExposureMode": "Auto",
  "DigitalZoomRatio": 1,
  "FocalLengthIn35mmFormat": "157 mm",
  "SceneCaptureType": "Standard",
  "Contrast": "Normal",
  "Saturation": "Normal",
  "Sharpness": "Normal",
  "LensInfo": "105mm f/2.8",
  "LensModel": "105mm F2.8",
  "PrintIMVersion": "0300",
  "Compression": "JPEG (old-style)",
  "ThumbnailOffset": 38514,
  "ThumbnailLength": 5243,
  "MPFVersion": "0100",
  "NumberOfImages": 2,
  "MPImageFlags": "Dependent child image",
  "MPImageFormat": "JPEG",
  "MPImageType": "Large Thumbnail (full HD equivalent)",
  "MPImageLength": 380460,
  "MPImageStart": 11734016,
  "DependentImage1EntryNumber": 0,
  "DependentImage2EntryNumber": 0,
  "ImageWidth": 6000,
  "ImageHeight": 4000,
  "EncodingProcess": "Baseline DCT, Huffman coding",
  "BitsPerSample": 8,
  "ColorComponents": 3,
  "YCbCrSubSampling": "YCbCr4:2:2 (2 1)",
  "Aperture": 9.0,
  "BlueBalance": 1.726563,
  "ImageSize": "6000x4000",
  "LensID": "Sigma 105mm F2.8 EX DG OS HSM Macro",
  "Megapixels": 24.0,
  "RedBalance": 2.613281,
  "ScaleFactor35efl": 1.5,
  "ShutterSpeed": "1/2000",
  "ThumbnailImage": "(Binary data 5243 bytes, use -b option to extract)",
  "PreviewImage": "(Binary data 380460 bytes, use -b option to extract)",
  "FocusDistance2": "0.81 m",
  "CircleOfConfusion": "0.020 mm",
  "FOV": "13.1 deg",
  "FocalLength35efl": "105.0 mm (35 mm equivalent: 157.0 mm)",
  "HyperfocalDistance": "60.96 m",
  "LightValue": 14.0
},
{
  ... autres photos ...
}]

Si jamais tu as des piste pour gérer ce type d'import, je prends (ce qui ne veut pas dire que je ne cherche pas d'abord par moi-même aussi ! wink ).

A+

[Edit]
Bon, je viens de regarder vite fait, ça n'a pas l'air si compliqué que ça en effet :
https://stackoverflow.com/questions/392 … postgresql
Je tente ça dès que je peux !
(et quand le scan des 120000 fichiers sera terminé : j'ai peur du temps de traitement ! yikes )
[/Edit]

Dernière modification par Sylvain M. (Tue 05 May 2020 14:51)


Sylvain M.

Hors ligne

 

#5 Mon 04 May 2020 18:54

GeoSignature
Participant occasionnel
Lieu: Saint-Pierre-des-Nids
Date d'inscription: 12 Nov 2019
Messages: 34

Re: [PostGreSQL] ExifTool To PostGreSQL

[edit] décidément wink [/edit]

Dernière modification par GeoSignature (Tue 05 May 2020 14:50)

Hors ligne

 

#6 Tue 05 May 2020 14:48

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

ça n'a pas l'air si compliqué que ça


Bon, pas si compliqué que ça, je me suis un peu surestimé.
Voici ce que j'ai fait :

Code:

-- création d'une table temporaire avec une ligne par object JSON
CREATE TABLE photos.dbphotosjsontxt_rows (jsontxt_rows text);
COPY photos.dbphotosjsontxt_rows FROM 'M:\Photos\dbphotos.json';
-- aggrégation de objects JSON sur une seule ligne
CREATE TABLE photos.dbphotosjsontxt AS (SELECT string_agg(jsontxt_rows,'') AS jsontxt FROM photos.dbphotosjsontxt_rows);
-- création de la table finale des métadonnées au format JSON
CREATE TABLE photos.dbphotosjson(valjson json);
-- importation des données via une conversion via json_array_elements()
INSERT INTO photos.dbphotosjson (SELECT valjson FROM   (SELECT json_array_elements(replace(jsontxt,'\\','\\\\')::json) AS valjson    FROM   photos.dbphotosjsontxt) a);

En effet, l'import depuis le JSON, qui est formaté avec 1 ligne par objet, ne passait pas directement avec json_array_elements().
Je suis donc passé par des tables temporaires au format texte, multilignes, puis aggrégées.

Si vous voyez de grossières erreurs ou améliorations possibles, n'hésitez pas à me les signaler.

Le point de blocage actuel, c'est que cette requête fonctionne depuis mon client SQL (DBeaver), mais pas via PSQL depuis un fichier batch (ce que je souhaiterais) :

Code:

psql -h localhost -U monuser -d mabdd -f import_dbphotosjson.sql

Je pense que c'est un problème d'échappement de caractères spéciaux, mais je ne vois pas comment le contourner.

Si vous pouvez m'éclairer, je vous en serai reconnaissant !


Sylvain M.

Hors ligne

 

#7 Tue 05 May 2020 16:29

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [PostGreSQL] ExifTool To PostGreSQL

Bonjour,

Doublez les "\":

Code:

COPY photos.dbphotosjsontxt_rows FROM 'M:\\Photos\\dbphotos.json';

Utilisez le type jsonb plutot que json: plus performant, compressé, indexable clé-valeurs. Bref, que des avantages.

Nicolas

Hors ligne

 

#8 Tue 05 May 2020 16:51

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Doublez les "\":


Oui, j'y avais pensé, mais ce n'est pas ça le problème.
J'ai la même erreur lorsque j'execute le batch, et elle se situe dans les données de la table TXT.
(donc l'accès au fichier n'a pas posé de souci)
Voici ce que m'affiche la fenêtre BATCH de Windows :

Code:

psql -h localhost -U postgres -d phototheque -f import_dbphotosjson.sql
CREATE TABLE
COPY 1407503
SELECT 1
CREATE TABLE
psql:import_dbphotosjson.sql:16: ERREUR:  syntaxe en entrée invalide pour le type json
DÉTAIL : Chaîne attendue, mais « } » trouvé.
CONTEXTE : données JSON, ligne 1 : ...  "FileAccessDate": "2020:01:16 17:35:34+01:00",}...

Et effectivement, on voit que le JSON est corrompu, puisqu'une virgule n'est pas suivie d'objet.

Mais j'ai vérifié le JSON source, il est bon : c'est donc le processus d'intégration qui corrompt le JSON

Utilisez le type jsonb plutot que json: plus performant, compressé, indexable clé-valeurs. Bref, que des avantages.


merci pour le conseil : je vais regarder ça !

Dernière modification par Sylvain M. (Tue 05 May 2020 16:52)


Sylvain M.

Hors ligne

 

#9 Tue 05 May 2020 17:39

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Je n'y comprends plus rien : la requête SQL lancée depuis DBeaver fonctionnait très bien tout à l'heure, et si je la réexecute maintenant, après avoir "droppé" les tables, me renvoit de nouveaux messages, différent si je lance les instruction 1 à 1 ou de manière globale.

Voici le nouveau message d'erreur :

Code:

SQL Error [22P02]: ERREUR: syntaxe en entrée invalide pour le type json
  Détail : Le jeton « N » n'est pas valide.
  Où : données JSON, ligne 1 : ...3 14:58:28Z",  "GPSLatitude": "43 deg 47' 3.92" N...

Et tout à l'heure, c'était une autre virgule mal placée dans le JSON, mais pas au même endroit que précédemment...


Sylvain M.

Hors ligne

 

#10 Tue 05 May 2020 17:43

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Si, je commence à comprendre !
Ce sont les coordonnées en DMS (° ' " ) qui corrompent le JSON !!!!
(notamment : peut-être d'autres objets qui sont écrit avec des caractères d'échappement).

Mais alors pourquoi ça marche parfois, et parfois pas ???


Sylvain M.

Hors ligne

 

#11 Tue 05 May 2020 17:51

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Voici comment sont les balises correspondantes dans le JSON source :

Code:

  "GPSLatitude": "43 deg 46' 29.56\" N",
  "GPSLongitude": "7 deg 30' 31.29\" E",
  "GPSPosition": "43 deg 46' 29.56\" N, 7 deg 30' 31.29\" E",

Ça m'a l'air bien compliqué à gérer...
Je vais regarder du côté des options d'exportation d'ExifTool. En mode CSV, j'avais réussi à les passer en décimales avec le dièze à la fin des tags -GPSLatitude# -GPSLongitude#
Mais comme là, je prends tous les tags bruts, j'ai peur que ce soit pas possible...


Sylvain M.

Hors ligne

 

#12 Tue 05 May 2020 18:11

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [PostGreSQL] ExifTool To PostGreSQL

Vous pouvez charger les infos directement en jsonb depuis exiftool, en ligne de commande, par exemple:

-- en SQL

Code:

create table exifinfo (
    id serial primary key ,
    tags jsonb
);

--en shell/cmd:
for f in `find /Users/nicolas/Desktop -name "*.png"`; do echo `exiftool -r -j "$f" | tr -d "\n"`; done | psql -c "copy exifinfo(tags) from stdin"

La commande cherche tous les fichiers png dans un repertoire, les passe a exiftool, enleve les newline de la sortie JSON, et copy ces data dans la table.

Possible de faire ça sous windows, en adaptant la commande (linux/mac, là) ou en installant Windows Subystem for Linux, qui marche bien.

L'avantage est que ca n'ecrit les infos que dans la bd, dans le bon format jsonb, sans fichiers intermédiaires.

Nicolas

Hors ligne

 

#13 Tue 05 May 2020 18:15

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [PostGreSQL] ExifTool To PostGreSQL

Sylvain M. a écrit:

Voici comment sont les balises correspondantes dans le JSON source :

Code:

  "GPSLatitude": "43 deg 46' 29.56\" N",
  "GPSLongitude": "7 deg 30' 31.29\" E",
  "GPSPosition": "43 deg 46' 29.56\" N, 7 deg 30' 31.29\" E",

Ça m'a l'air bien compliqué à gérer...
Je vais regarder du côté des options d'exportation d'ExifTool. En mode CSV, j'avais réussi à les passer en décimales avec le dièze à la fin des tags -GPSLatitude# -GPSLongitude#
Mais comme là, je prends tous les tags bruts, j'ai peur que ce soit pas possible...


si la chaine json est exactement celle-la, postgres devrait le gérer:

Code:

select '{"GPSLatitude": "43 deg 46'' 29.56\" N"}'::jsonb;

renvoie bien un object jsonb.

Nicolas

Hors ligne

 

#14 Tue 05 May 2020 18:45

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [PostGreSQL] ExifTool To PostGreSQL

Oui effectivement, en ligne de commande les caractères \" ne sont pas conservés.

On peut les virer en ligne de commande et les remplacer par d'autres caractères, par ex:

Code:

exiftool -j /Users/nicolas/Downloads/IMG_6068.JPG | tr -d "\n" | sed 's/\\"/ sec/g' | psql -X -p 5532 -c "copy exifinfo(tags) from stdin"

donne:
...
"GPSPosition": "43 deg 35' 37.76 sec N, 1 deg 26' 37.20 sec E"

dans une commande qui copierait toutes les infos dans pg:

Code:

for f in `find /Users/nicolas/Desktop -name "*.png"`; do echo `exiftool -r -j "$f" | tr -d "\n"`; done | sed 's/\\"/ sec/g' | psql -c "copy exifinfo(tags) from stdin"

Nico

Hors ligne

 

#15 Tue 05 May 2020 22:18

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Super Nicolas : merci pour tous tes conseils smile
Je vais explorer si je pars sur "Windows Subystem for Linux" ou si je tente d'adapter ces commandes pour Windows.
Je me demande si la boucle for de filtrage par extension est nécessaire, puisque Exiftool peut scanner les dossiers de manière récursive ( -r ) en filtrant sur une extension ( -ext jpg )
Je regarde tout ça dans la semaine !
MERCI !

Dernière modification par Sylvain M. (Tue 05 May 2020 22:19)


Sylvain M.

Hors ligne

 

#16 Wed 06 May 2020 10:42

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [PostGreSQL] ExifTool To PostGreSQL

Oui effectivement big_smile
J'ai pas trop lu la doc exiftool avant de tester et j'ai vu la signification du -r apres.

La boucle sert surtout a virer les retours chariots du json a chaque image, et pas sur le set complet des images.
Comme ca, on a une ligne par json d'une image, qu'on peut copier directement dans une table PG avec colonne jsonb.

Je ne connais pas bien les scripts windows, mais PowerShell, ca doit etre assez puissant ( wink )
Sinon WSL, ca offre plein de commandes bash et c'est qd même bien pratique vu la doc existante en ligne sur des traitements bash.

Nico

Hors ligne

 

#17 Thu 07 May 2020 00:01

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Déjà, un immense MERCI Nicolas, car grace à tes exemples, j'ai pu réécrire ma requête initiale en une seule ligne :

Code:

exiftool -T -r -Directory -filename -DateTimeOriginal -model -GPSLatitude# -GPSLongitude# -ext jpg -charset FileName=Latin "M:\Photos" | psql -h localhost -U postgres -d phototheque -X -c "copy photos.photos(Directory, filename, DateTimeOriginal, model, GPSLatitude, GPSLongitude) from stdin NULL '-' ENCODING 'UTF-8'"

Mais là, c'est un export tabulé  d'une sélection de Tags.
C'est déjà super !

Maintenant, pour le problème avec le JSON, j'ai commencé à regarder WSL, et je me demande si je ne vais pas perdre pas mal de perfs sur mon disque système à installer une distribution Linux en plus. Et en plus, ce disque est déjà dans le rouge au niveau stockage (mais j'ai d'autres disque dispos).

Et pour ce qui est d'adapter le script shell en batch (ou powershell), c'est malheureusement hors de ma portée.
Au cas où (je vais essayer quand même), c'est bien c'est parties là que je dois adapter ?

Code:

 tr -d "\n" | sed 's/\\"/ sec/g'

La première partie supprime les sauts de lignes ("\n"), et la seconde remplace les antislash, c'est bien ça ?

[edit]C'est bon, j'ai compris le principe du "sed", qui remplace les secondes des coordonnées (") par "sec") wink [/edit]

Dernière modification par Sylvain M. (Thu 07 May 2020 00:10)


Sylvain M.

Hors ligne

 

#18 Thu 07 May 2020 09:40

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 567
Site web

Re: [PostGreSQL] ExifTool To PostGreSQL

Bonjour,
PowerShell est effectivement puissant mais demande de "rentrer dedans" en "pensant Windows" (ce que je n'ai pas fait); le WSL installe un Linux minimal (je constate 360 Mo sur mon poste) et le bénéfice me parait très intéressant avec la possibilité de lancer des scripts shell aussi facilement qu'un .bat ou faire un simple sed par exemple.
Comme le dit Nicolas, cela permet d'utiliser tels quels les nombreux scripts existants et tant qu'à investir dans un langage de script, je préfère bash plutôt que PowerShell.

Pas trop intéressant dans ton cas et je n'ai pas essayé mais, si WSL installé,  il est possible de lancer des scripts bash depuis PowerShell  (https://devblogs.microsoft.com/commandl … for-linux/)

Dernière modification par jmarsac (Thu 07 May 2020 09:41)


Jean-Marie
Azimut

Hors ligne

 

#19 Thu 07 May 2020 14:49

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Pas trop intéressant dans ton cas et je n'ai pas essayé mais, si WSL installé,  il est possible de lancer des scripts bash depuis PowerShell  (https://devblogs.microsoft.com/commandl … for-linux/)


Pas sûr de comprendre du coup : si WSL installé, quelle est la voie la plus simple pour lancer les scripts bash ?
Aurai-je accès au Terminal de Linux facilement ?
Et si oui, ayant installé Exiftool depuis l’exécutable Windows, est-ce que le Terminal Linux pourra exécuter les commandes Exiftool ? (Exiftool, qui est une librairie Perl, est présenté comme indépendant de la plateforme : https://exiftool.org/ )

Merci pour ces éclairage smile


Sylvain M.

Hors ligne

 

#20 Thu 07 May 2020 15:33

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 567
Site web

Re: [PostGreSQL] ExifTool To PostGreSQL

Sylvain M. a écrit:

Pas trop intéressant dans ton cas et je n'ai pas essayé mais, si WSL installé,  il est possible de lancer des scripts bash depuis PowerShell  (https://devblogs.microsoft.com/commandl … for-linux/)


Pas sûr de comprendre du coup : si WSL installé, quelle est la voie la plus simple pour lancer les scripts bash ?


La console Linux (WSL)

Aurai-je accès au Terminal de Linux facilement ?


oui, aussi simplement que pour les .bat :
.bat => cmd (icone ou touche Windows + cmd)
.bash => wsl (icone ou touche Windows + wsl)

Et si oui, ayant installé Exiftool depuis l’exécutable Windows, est-ce que le Terminal Linux pourra exécuter les commandes Exiftool ? (Exiftool, qui est une librairie Perl, est présenté comme indépendant de la plateforme : https://exiftool.org/ )


Même si l'exécutable Exiftool est en Perl et indépendant de la plate-forme, chaque système a son propre chemin d'executables et surtout ses propres bibliothèques binaires. Il faudra donc que tu l'installes sous linux.
Sous debian/ubuntu

Code:

sudo apt install exiftool

Dernière modification par jmarsac (Thu 07 May 2020 15:45)


Jean-Marie
Azimut

Hors ligne

 

#21 Thu 07 May 2020 15:54

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 981

Re: [PostGreSQL] ExifTool To PostGreSQL

Super, merci pour toutes ces précisions !


Sylvain M.

Hors ligne

 

Pied de page des forums

Powered by FluxBB