La gestion et l'exploitation des données photogrammétriques, lasergrammétriques et...

Preview:

Citation preview

Rapport de Travail de Fin d’ÉtudeMastère Spécialisé Photogrammétrie, Positionnement et Mesure de Déformations

La geStion et L’exPLoitation DeS DonnéeS PhotograMMétriqueS, LaSergraMMétriqueS et toPograPhiqueS : Le caS D’aigueS-MorteS

écoLe nationaLe DeS ScienceS géograPhiqueS6 et 8 avenue Blaise Pascal - cité Descartes - champs sur Marne - 77455 Marne-La-VaLLee ceDex 2téléphone : 01 64 15 31 00 - télécopie : 01 64 15 31 07

Maxime SEGUIN

mardi 27 septembre 2011

Non confidentiel Confidentiel IGN Confidentiel industrie

Jury

Président du jury :

olivier DiSSarD

Commanditaires :

Direction régionale des affaires culturelles (Drac) du Languedoc-roussillon5, rue de la Salle l’évêque 34967 Montpellier cedex 2

centre des Monuments nationaux (cMn) - tours et remparts d’aigues-MortesLogis du gouverneur d’aigues-Mortes 30220 aigues-Mortes

Encadrement du stage :

Jean-Marie BaroY, Drac, Maître de stageMarie-Laure FroMont, cMn, Maître de stageDaniel ScheLStraete, enSg/ign, Professeur référentLivio De Luca, MaP gaMSau, chercheur

Responsables pédagogiques du mastère spécialisé PPMD :

Jacques BeiLin, Département Positionnement terrestre et Spatialraphaële heno, Département imagerie aérienne et Spatiale

© enSg

Stage pluridisciplinaire du 18 avril au 10 juin 2011 et du 1 août au 23 septembre

Diffusion Web : internet intranet Polytechnicum intranet enSg

Situation du document : Rapport de travail de fin d’étude présenté en fin de mastère spécialisé PPMD

Nombre de pages : 80

Système hôte : adobe inDesign

édition révision Date Pages modifiées1 0 création

1 Modification

i. Résumé - Abstract

L’ensemble des remparts d’aigues-Mortes a fait l’objet de trois campagnes de mesures de la part de l’enSg, depuis l’année 2009. Parallèlement, d’autres spécialistes (archéologues, architectes, historiens, ...) travaillent sur l’édifice. Ces derniers sont demandeurs de produits et de solutions techniques permettant d’exploiter ces données et de les croiser avec d’autres, pour pouvoir répondre à leurs problèmatiques. Ce mémoire propose d’utiliser la plateforme NubesVisum développée par le laboratoire MAP-GAMSAU afin d’intégrer les données topographique, lasergrammétriques et photogrammétriques acquises par l’enSg et les données hétérogènes provenant des spécialistes. en effet, cette plate-forme permet déjà d’associer des représentations 3D d’édifices à des données externes (photographies, documents graphiques, textes, etc ...).il s’agit donc de proposer des solutions pour une intégration aisée des milliers de données collectées lors des trois campagnes de numérisation. ceci a été fait en développant plusieurs logiciels et en proposant des méthodes de traitement des données.

Mots clés : lasergrammétrie, topographie, photogrammétrie, gestion de la documentation, nubes, MaP-gaMSau, aigues-Mortes.

all the ramparts of aigues-Mortes city has been the subject of three measurement campaigns from enSg since 2009. Meanwhile, other specialists (archaeologists, architects, historians, ...) are working on the building. they are seeking products and technical solutions to exploit these data to answer their problems.this thesis proposes to use the platform nubesVisum developed by the laboratory MaP-gaMSau to integrate the data acquired by enSg by laserscanning and photogrammetry and other heterogeneous data from acquired by experts. indeed, the platform already allows to combine 3D representations of buildings to external data (photographs, graphics, text, etc ...).it’s therefore to propose solutions for easy integration of thousands of data collected during three campaigns scanning. this was done by developing several software and providing ways of working.

Keywords : laser scanning, topography, photogrammetry, document management, nubes, MaP-gaMSau, aigues-Mortes

3

ii. Remerciements

Mes plus vifs remerciements vont à tous ceux qui ont contribué à l’aboutissement de mon mémoire et au bon déroulement de mon stage.

a mes maîtres de stage, Jean-Marie BaroY et Marie-Laure FroMont, qui ont m’ont aidé tout au long de mon stage.

a Daniel ScheLStraete, pour sont encadrement tout au long de mon travail, sa joie de vivre et son aide.

a Yves egeLS pour ses conseils et sa réactivité.

a toute l’équipe du MaP-gaMSau et plus particulièrement : Livio De Luca, chiara SteFani, nicolas nonY, Julie LoMBarDo et Pascal BeniStant.

a l’équipe du monument d’aigues-Mortes pour son accueil et à ma collègue de bureau, Fabienne tuSet.

Enfin, à tous ceux que j’ai pu oubliés et qui se reconnaitrons.

4

3 i résumé - abstract

4 ii remerciements

6 1. introduction

7 2. objectifs du stage

8 3. organismes d’accueil 8 3.1 La Direction régionale des affaires culturelles 9 3.2 Le centre des Monuments nationaux 9 3.3 Le laboratoire MaP-gaMSau

11 4. aigues-Mortes

12 5. outils utilisés

13 6. analyse des besoins

14 6. etat des lieux des données acquises et des produits livrés 14 6.1 Données acquises 14 6.2 Produits livrés

16 8. inventaire des données externes 16 8.1 inventaire général 16 8.2 Bases de données de l’inventaire 17 8.3 archives crMh 17 8.4 archives Sra

18 9. etat de l’art 18 9.1 topographie, lasergrammétrie, photogrammétrie 18 9.2 Monuments historiques 18 9.3 archéologie

20 10. nubes 20 10.1 intégration des données lasergrammétriques 24 10.2 intégration des données photogrammétriques 27 10.3 intégration des données topographiques 28 10.4 intégration des données de la Drac et du crMh

30 11. conclusion

31 12. Bibliographie

32 13. Table des figures

33 14. table de annexes

Sommaire

5

1. Introduction

ce rapport présente le travail réalisé au sein de la Drac Languedoc-roussillon, du centre des Monuments nationaux d’aigues-Mortes et du laboratoire MaP gaMSau. L’objet de l’étude concerne l’ensemble des données, topographiques, lasergrammétriques et photogrammétriques, acquises depuis 2009 par l’enSg, sur le site des remparts d’aigues-Mortes.

La première partie présente les objectifs du stage, les différents organismes d’accueil ainsi que les outils utilisés.

La seconde partie présente une analyse des besoins des différents acteurs, un état des lieux des données et des produits mis à leur disposition ainsi qu’un état de l’art des méthodes, protocoles et outils pour la gestion des données.

La dernière partie présente les outils et les solutions mis en œuvres pour répondre au problème posé.

6

2. Objectifs du stage

Le stage proposé par Daniel ScheLStraete, enseignant à l’enSg, fait suite à trois campagnes de numérisation menées par l’enSg à aigues-Mortes. elles ont eu lieux dans le cadre des stages terrain des promotions PPMD2009, g2010 et g2011. au terme de ces trois sessions, la totalité des remparts a été numérisé, ainsi que la tour de constance et de la Porte de la reine.ces acquisitions ont produit une masse importante de données topographiques, lasergrammétriques et photogrammétriques. elles ont fait l’objet, pour certaines, d’un traitement permettant leur exploitation et leur géoréférencement, mais la plupart sont restées en l’état. Les partenaires du projet, le cMn et la Drac, sont maintenant dans l’attente de données exploitables et d’outils dont la prise en main ne nécessite pas un haut niveau de technicité.quelques produits avaient déjà été livrés, mais ils nécessitaient l’utilisation de logiciels spécialisés tel que cumulus, Poivilliers, … ou des logiciels commerciaux hors de prix et ne correspondaient pas forcément aux attentes des commanditaires.Le stage devait donc faire une première analyse des besoins des différents partenaires du projet et faire un état des lieux des données acquises et des produits fournis. il devait également faire un état de l’art des méthodes et des outils existants pour la gestion de ces ensembles de données.Le second objectif était de proposer des méthodes, des protocoles et des outils permettant de répondre aux contraintes et aux attentes tout en s’intégrant aux outils, aux produits et aux méthodes déjà existants.La Drac et le cMn avaient déjà eu l’occasion d’utiliser le système nubes sur d’autres chantiers (Villeneuve-lès-avignon, Saint-guilhem-le-Désert, etc...). il a donc été décidé, dès le début du stage, d’orienter les solutions et les réflexions autour de ce support.

7

3. Organismes d’accueil

3.1. La Direction Régionale des Affaires Culturelles

La Drac est un service qui dépend du ministère de la culture et de la communication. il est placé sous l’autorité du préfet de région et des préfets de département et est chargé de mettre en œuvre la politique culturelle définie par le gouvernement.

Les rôles de la Drac sont l’étude, la protection, la mise en valeur, la gestion, le conseil, l’expertise, le contrôle et la diffusion de l’information dans les domaines de compétences du ministère de la culture et de la communication. ces domaines sont les suivants : aménagement culturel du territoire, arts plastiques, archives, livre et lecture, musées, musique et danse, langues de France, cultures régionales, cinéma, théâtre, spectacles et patrimoine.

Depuis l’application de la Loi Organique relative à la Loi des Finances, cinq objectifs généraux ont été définis :• Contribuer à travers la politique culturelle aux objectifs nationaux en matière d’emploi et de cohésion sociale• Affirmer le rôle spécifique de l’Etat aux côtés de ses partenaires en ce qui concerne les politiques patrimoniales• Améliorer la couverture culturelle du territoire • Favoriser le retour vers les citoyens de l’ensemble des données documentaires produites par l’action des services de l’etat • Moderniser le fonctionnement des services de l’Etat et améliorer leur relations avec le citoyen

La DRAC de Montpellier comprend 125 agents permanents répartis de la manière suivante (fig. 1) :

• 14 pour le pôle Création et Diffusion Artistique• 84 pour le pôle Architecture et Patrimoine• 31 pour le pôle Territoires et Publics, Fonctions de Soutient, la Direction et Secrétariat Général

8

Fig. 1 - organigramme de la Drac Languedoc-roussillon

Lors de mon stage, j’ai travaillé dans le service de la conservation régionale des Monuments historiques qui dépend du pôle architecture et Patrimoine. L’un des objectifs de ce service est d’ « organiser la restitution et l’exploitation des ressources documentaires patrimoniales et architecturales ». c’est dans cette perspective que s’est intégré ma réflexion.

3.2. Le Centre des Monuments Nationaux

Le cMn est un établissement public à caractère administratif placé sous le contrôle du ministère de la culture et de la communication. il a pour objectif les missions d’intérêt général suivantes : la conservation, la restauration, la gestion, l’animation et l’ouverture au public d’une centaine de monuments répartis sur tout le territoire national. ces monuments sont propriété de l’état et balayent l’ensemble des périodes historiques : de la préhistoire à la période contemporaine.

Le Centre des Monuments Nationaux emploie 1300 agents, dont 34 administrateurs (fig.2). Ces derniers ont à leur charge la gestion d’un ou plusieurs monument. il sont présent sur le terrain pour concevoir et mettre en œuvre la politique générale de gestion du site, en accord avec la direction générale du cMn. ils gèrent, l’ensemble des opérations de maîtrise d’ouvrage, le budget de l’établissement, la programmation annuelle des événements culturels, etc... . ils servent d’interlocuteur pour les collectivités territoriales et les différents services de l’état, notamment la Drac.

J’ai travaillé sous la direction de l’administratrice des tours et remparts d’aigues-Mortes. Les objectifs du stage s’intégraient dans la politique de gestion et de documentation du site.

3.3. Le laboratoire MAP-GAMSAU

Le laboratoire MaP gaMSau est hébergé dans les locaux de l’école Supérieure d’architecture de Marseille, sur le campus de Luminy. il est intégré à l’unité Mixte de recherche uMr 649-MaP (Modèles et Simulations pour l’Architecture, l’Urbanisme et le Paysage). Cet UMR regroupe quatre laboratoires (fig. 3) :

• ARIA (Applications et Recherches en Informatique pour l’Architecture)• GAMSAU (Groupe de recherche pour l’Application de Méthodes Scientifiques à l’Architecture et à l’urbanisme) • CRAI (Centre de Recherche en Architecture et Ingénierie) • ASM (Architecture et Sociétés Montagnardes)

ces laboratoires ont été créés par le cnrS en 1998 et ont pour ministère de tutelle, le ministère de la culture et de la communication.

Fig. 2 - organigramme général du cMn

organismes d’accueil 9

Fig. 3 - organigramme des laboratoires MaP

Le laboratoire MaP gaMSau a déjà collaboré avec le laboratoire MatiS et l’enSg sur plusieurs sites gérés par le cMn (Forteresse de Salse, chartreuse de Villeneuve-lès-avignon, …). L’équipe travaille sur les problématiques du relevé et de la représentation des données tridimensionnelles. Pour cela plusieurs outils ont été développés, permettant de lier des données dimensionnelles et des données d’autre nature (iconographiques, textuelles, etc...). ils ont été développés dans le cadre du programme national de numérisation du patrimoine : 3D Monuments1.ces outils sont toujours en développement et intègrent maintenant des outils développés à l’ign, tel que Pastis, apero et MicMac :

organismes d’accueil 10

Nubes VisumSystème de visualisation et de consultation des relevés et des représentations d’édifi ces. C’est une architecture web constituée d’une base de donnée MySqL, d’un site internet PhP et du plugin Virtools permettant la manipulation et l’affi chage des scènes 3D.

Nubes FormaPlugin Maya permettant la reconstruction 3D d’édifi ces à partir de nuages de points et de photographies numériques. Il permet, entre autre, l’extraction de coordonnées, profi ls et images rectifi ées, ainsi que la reconstruction des surfaces à partir des profi ls extraits.

Nubes ImagoSystème de visualisation et de référencement spatial des sources iconographiques, en-ligne. il peut être intégré à directement à nubes Visum sous la forme d’un plugin.

Nubes TempusSystème de visualisation des évolutions temporelles d’un bâtiment. Deux versions sont disponibles : un plugin Maya et une version en-ligne intégrée à nubes Visum.

Pistou (Photo-based inSTant pOint cloUd)interface graphique développée en c++ destinée à encapsuler la chaîne logicielle Pastis, apero, MicMac.

Aioli (Architectural Image-Oriented expLoratIon)interface web permettant la visualisation des nuages de points et des images orientées générées par la suite logicielle Pastis-apéro-MicMac.

1. htp://www.map.archi.fr/3D-monuments/

4. Aigues-Mortes

11

La commune d’aigues-Mortes est située à l’extrême sud-est du département du gard et donne directement sur la mer méditerranée. Le paysage ressemble à la camargue située tout à côté. La ville d’aigues-Mortes a été fondée par Louis IX afin de servir de port de commerce. L’enceinte a été hérigée sous le reigne de Philippe III le Hardi et Philippe IV le Bel. Les remparts font 1640 métres et sont très bien conservés (fig. 4). Ils participent à la politique de centralisation du pouvoir de l’époque en affirmant la puissance du roi. Ce sera l’unique port de commerce du royaume de France pendant presque deux cents ans.La construction débute en 1240 après que Louis ix ait récupéré les terres à l’abbaye de Psalmodi. une première tour est construite : la tour de constance. celle-ci permettra la défense d’un château royal qui était situé en lieu et place de l’actuel Logis du gouverneur.Les matériaux et la main d’oeuvre sont importés, car la zone est complétement désertique et dépourvue de carrière de pierre. Afin d’attirer la population le roi accorde de nombreux priviléges à la bastide nouvellement construite et la dote d’une certaine autonomie du point de vue de la vie civique.La construction des remparts débutera seulement après la mort de Philippe iii le hardi, en 1274, c’est à dire plus de trente ans après la pose de la première pierre de la tour de constance. en 1289, à peine la moitié des remparts sont érigés. c’est seulement au tout début du xiVe siècle que les travaux s’achèvent.L’ampleur de la tâche explique la durée des travaux. Les courtines font environ 11 mètres de haut pour 3 mètres de large et les cinq tours, cinq petites portes et cinq grandes portes ont une hauteur moyenne de 18 mètres. ceci n’est d’ailleurs que la partie visible du travail. il ne faut pas oublier les opérations de terrassement et le fonçage des milliers de pieux en bois qui soutiennent l’édifice.Bien que la fonction première de l’enceinte soit militaire, elle a reçu énormément d’éléments décoratifs. quasiment toutes les clefs de voûtes, les culots et les gargouilles sont ajourées.L’enceinte subira plusieurs modifications au cours de l’histoire en fonction de l’évolution des techniques et des armes de guerre.

Fig. 4 - aigues-Mortes vue du nord-ouest

5. Outils utilisés

Qt Creator

qt creator2 est un environnement de développement c++ appartenant à nokia. il est libre, multiplateforme et distribué gratuitement. il permet de développer de nombreuses applications portables, graphiques ou en ligne de commande.il intègre également de nombreuses librairies qui facilitent la vie au programmeur (gestion des fi chiers, interfaçage réseau, gestion des bases de données, gestion du format XML, etc...).

Redresseur

redresseur3 permet le calcul d’une aérotriangulation dans le cas d’un chantier de photogrammétrie terrestre. il peut également réaliser l’assemblage et le redressement de photographies.

Cumulus

cumulus3 est un logiciel qui permet le traitement des nuages de points et notamment la lecture des formats de fi chier propriétaire. Il est très utile pour convertir les formats constructeurs en format aScii.

3DVIA Virtools

Virtools4 est un environnement de développement permettant la création de contenus 3D interactifs. il appartient au groupe Dassault Systems et est utilisé dans la plateforme nubes pour affi cher les scènes 3D. Cet outil a permis de convertir les nuages de points ASCII dans le format propriétaire de Dassault Système, le format nMo.

CloudCompare

cloudcompare5 est un logiciel libre destiné à traiter les nuages de points. il a été initialement conçu pour effectuer des comparaisons entre nuages, mais il possède maintenant tout une palette d’outils avancés (affi chage PCV, segmentation, sous-échantillonnage, etc...). Son principal intérêt résulte de sa capacité à traiter d’énormes nuages de points. un nuage d’une centaine de millions de points peut être traité avec seulement 2gb de mémoire vive.

XAMPP

xaMPP6 est une suite logicielle qui comprend un serveur apache avec MySqL, PhP, Perl et beaucoup d’autres utilitaires (phpMyAdmin, etc... ). Il permet une installation simplifi ée et rapide de tous ces logiciels. il a permis de sauvegarder en local la base de donnée MySqL du système nubes pour pouvoir effectuer des tests sans risques.

12

2. http://qt.nokia.com3. http://yves.egels.free.fr4. http://www.virtools.com5. http://www.danielgm.net/cc/6. http://www.apachefriends.org/fr/xampp.html

6. Analyse des besoins

13

La gestion et l’étude d’un monument tel que les remparts d’aigues-Mortes, impliquent plusieurs acteurs avec des besoins différents. en terme de besoins, on peut faire une première distinction entre les personnes chargées de la gestion et de la mise en valeur du site et les personnes chargées de son étude.

Les premiers ont généralement besoin d’un support permettant la mise en valeur du site pour le grand public. ceci peut passer par des modèles 3D, des animations ou tout autre support.ils ont également besoin d’une documentation permettant l’entretien et la gestion quotidienne du site. cette documentation se résume la plupart du temps à des plans sur support papier ou numérique.

Les seconds sont très souvent demandeurs de produits plus complets. ils souhaitent exploiter les données au maximum de leurs possibilités. ceci rentre d’ailleurs très souvent en contradiction avec leur volonté d’avoir à disposition des outils simples et conviviaux.

il s’agit donc de mettre à disposition des commanditaires des outils à la fois conviviaux, performants, évolutifs et adaptés à leurs besoins. ces outils devront également être capable d’intégrer des données hétérogènes provenant des diffèrentes spécialités des acteurs du projet.

7. État des lieux des données acquise et des produits livrés

14

7.1. Données acquises

on se propose, dans cette partie, de faire un inventaire exhaustif des données disponibles, suite aux trois campagnes de levés. Pour plus de clarté, on distinguera la topographie, la lasergrammétrie et la photogrammétrie.

GPS :

• Fichiers d’observation GPS bruts• Liste des points d’appuis GPS : photographies de croquis, fiches descriptives au format Microsoft Word et photographies des points mesurés.• Fichiers d’observation des stations permanentes au format Rinex• Résultats de calculs en ligne •Tableau récapitulatif au format Microsoft Excel

Topographie ‘classique’ :

• Fichiers bruts d’observation aux formats constructeurs • Liste des points mesurés : photographies de croquis, fiches descriptives au format Microsoft Word et photographies des points mesurés. • Fichiers des calculs intermédiaires • Fichiers de sortie de Comp3D • Résultats au format texte colonné en Lambert93 et Lambert93 tronqué

Lasergrammétrie : • Fichiers bruts des levés au format constructeur • Exports au format Cumulus • Exports au format texte colonné avec valeur de l’intensité retour • Liste des points d’appuis : impressions d’écran, photographies des cibles et des sphères, fiches signalétiques au format Microsoft Word

Photogrammétrie :

• Fichiers photographiques au formats RAW et JPEG• Liste des points d’appuis : schémas, photographies de croquis, photographies illustrées • Résultats de calculs d’aérotriangulations • Tableaux d’assemblage de prises de vues aériennes • Assemblages de photographies aériennes • Orthophotographies • Coupes aux formats : DXF, TRA et JPEG

7.2. Produits livrés L’ensemble de ces données ont permis de fournir un certain nombres de produits aux archéologues, aux gestionnaires du site et aux personnes en charge du dossier à la Drac de Montpellier. ces produits sont les suivants :

• Orthophotographies • Coupes • Nuages de points au format Cumulus • Assemblages de clichés aériens

Ces produits (fig. 5) sont, pour la plupart, restés sous-exploités, voir même inexploités. Les raisons sont multiples et touchent à des aspects techniques, matériels et humains. Les personnes auxquelles sont destinés les produits, n’ont pas le temps, pas les moyens et parfois pas l’envie de se former à de nouveaux logiciels. Pour certaines d’entre elles, l’utilisation de cumulus nécessite la migration sous le système d’exploitation Windows, alors qu’elles travaillent depuis toujours sous MacOS. La nécessité de se former à un logiciel destiné à des professionnels implique de maîtriser un certain nombre de concepts qui restent obscurs et déconnectés de la réalité de ces utilisateurs finaux.Les moyens matériels informatiques ne permettent parfois, tout simplement pas d’exploiter les données ; que ce soit les nuages de points ou les images.Les coupes, les orthophotographies et les plans fournis sont quelquefois inadaptés pour répondre aux questions posées par les chercheurs (repérage impossible des marques de tacherons sur les orthophotographies, etc...).

15etat des lieux des données et des produits

Fig. 5 - exemples de produits livrés

8. Inventaire des données externes

16

un des besoins des commanditaire est de pouvoir croiser les données acquises par l’enSg avec les données déjà existantes sur le monument. ces dernières sont assez disparates et sont enregistrées sur des médias divers (archives papier, bases de données informatiques, etc...).on se propose ici de faire l’état des lieux des données disponibles.

8.1. Inventaire général (CLAPAREDE 1973)

cette monographie, en deux tomes, est le produit de l’inventaire général des monuments et des richesses artistiques de la France ; créé par la loi du 4 août 1962. L’inventaire a pour but de "recenser et décrire l’ensemble des constructions présentant un intérêt culturel ou artistique ainsi que l’ensemble des œuvres et objets d’art créés ou conservés en France depuis les origines".L’ouvrage date de 1973 ; il recense l’ensemble de la documentation disponible sur le monument : les sources manuscrites, sources imprimées, travaux historiques, cotes d’archives, relevés, dessins, lithographies, gravures, photographies anciennes et maquettes, références aux ouvrages généraux. il comporte également une synthèse géographique et historique, un inventaire topographique et des observations générales.L’ensemble des clichés et des documents qui ont donné lieu à cette publication sont actuellement conservés au centre de Documentation du Patrimoine régional. ils n’ont pas fait l’objet d’une opération de numérisation.

8.2. Bases de données de l’inventaire

L’inventaire général7 a également créé des bases de données informatiques consultables en ligne. elles sont au nombre de quatre :

Mérimée La base architecture-Mérimée recense le patrimoine monumental : architecture domestique, religieuse, agricole, industrielle, militaire, funéraire, commerciale, artisanale, scolaire, hospitalière, de jardin, etc... elle a été créée en 1978 et mise en ligne en 1995. elle comprend 200000 notices, dont 147000 sont issues de l’inventaire général et 42000 sont issues des monuments historiques. environ 35000 notices sont illustrées. Palissy La base Mobilier-Palissy recense les objets mobilier : peinture, sculpture, objets et mobilier civils et religieux, mobilier monumental, vitrail, instruments de musique, patrimoine industriel, patrimoine maritime et fluvial, instruments scientifiques, serrurerie, arts graphiques, etc... Elle a été créée en 1989 et mise en ligne en 1998. elle contient environ 280000 notices, dont près de 25000 sont illustrées. 170000 sont issues de l’inventaire général et 110000 sont issues des monuments historiques. Mémoire La base image-Mémoire est un catalogue d’images provenant de photographies, gravures, plans, dessins et autres documents graphiques. elle a été créée en 1995 et mise en ligne en 1996. elle comprend 600000 notices. Les notices sont issues de l’inventaire général, des services régionaux d’archéologie, des monuments historiques et de la médiathèque du patrimoine.

7. http://www.inventaire.culture.gouv.fr

ThésaurusLa base Vocabulaire-thésaurus définit les termes utiles à la désignation des oeuvres architecturales et mobilières. elle a été créée et mise en ligne au cours de l’année 2000. elle permet à tous de disposer d’un vocabulaire normalisé. Elle comprend 1135 défintions pour les oeuvres architecturales et 2529 défintions pour les oeuvres mobilières.

Fig. 6 - Système d’information Patrimonial : Patriarche

8.3. Archives CRMH

Les archives du centre régional des Monuments historiques comportent un certain nombre de documents qui ne sont pas encore numérisés. ces documents sont de nature multitple : dossiers de recensement pour la protection, dossiers d’entretien d’immeubles, dossiers de travaux d’immeubles, dossiers de marchés pour travaux ou restauration, dossiers de travaux sur des objets mobiliers, etc... Les cartes et les plans, sont en cours de numérisation et devraient être ajoutés à la base de donnée de l’inventaire général. Pour la seule commune d’aigues-Mortes, ces documents sont au nombre d’une centaine et ce nombre est susceptible d’augmenter au gré des interventions prévues ou nécessaires sur le monument.

8.4. Archives SRA

Les archives du Service régional de l’archéologie contiennent les rapports de diagnostic et de fouille effectués à la suite des prescriptions de l’administration. un rapport papier est rendu au service, qui est archivé sur une base de donnée informatique. Pour la commune d’aigues-Mortes, un rapport de diagnostic (ManieZ 2002) et un rapport (Petitot 1994) de campagne de révision de monuments historiques et de sites archéologiques sont disponibles. actuellement, les plans numériques géoréférencés des opérations de fouille et de diagnostic sont également rendus au SRA pour être intégrés dans un système d’information patrimonial, nommé Patriarche (fig. 6). Les opérations effectuées à aigues-Mortes n’étaient pas intégrées dans ce dispositif à l’époque où elles ont été menées.

17inventaire des données externes

18

9. État de l’art

Dans le cadre de ce projet, la documentation est multiple et stockée sur divers médias.L’objectif est d’intégrer au sein d’un même système l’ensemble des données disponibles, pour l’ensemble des acteurs du projet. Pour ce faire, nous allons commencer par analyser les différents systèmes d’informations mis en place dans les différents domaines.

9.1. Topographie, lasergrammétrie, photogrammétrie

A l’heure actuelle aucun système de gestion spécifique n’est utilisé à l’ENSG pour les projets de numérisation de monuments. quelques prototypes de bases de données ont été développés lors de projets d’élèves, mais aucun n’a donné suite à une utilisation systématique. De plus, ces systèmes nécessitent quelque fois l’emploi de logiciels spécifiques et payants tel que Matlab.La documentation et les données acquises sont la plupart du temps stockées sur des disques durs externes ou sur des serveurs dans une arborescence de répertoires plus ou moins standardisé. cette organisation permet à l’utilisateur averti de trouver de manière intuitive ce qu’il cherche.quasiment tous les éditeurs de suites logicielles destinées aux professionnels de la photogrammétrie proposent aujourd’hui, des systèmes de gestion des clichés numériques et argentiques. ces systèmes intègrent les métadonnées, le géoréférencement, les plans de vols, etc... il n’est pas raisonnable d’envisager de mettre en place ce genre de système de gestion pour des projets de photogrammétrie architecturale tel que celui d’aigues-Mortes.

9.2. Monuments historiques

comme nous l’avons vu, la seule base de donnée existante à l’échelle nationale est celle des Monuments historiques. Malheureusement, cette dernière est loin d’intégrer l’ensemble des ressources documentaires présentent dans l’ensemble des services décentralisés du ministère de la culture. au crMh de la région Languedoc-roussillon, l’inventaire est effectué sur des listings au format Microsoft excel stockés sur des postes informatiques isolés et sur des bases de données Microsoft acces interrogeables uniquement sur l’intranet. Les fonds documentaires ne sont pas dématérialisés et sont uniquement consultables sur place. une campagne de numérisation des plans et des cartes a été lancée en juin 2011. une partie des documents numérisés devraient être intégrés à la base de donnée nationale.

9.3. Archéologie

Les archéologues en charge de l’étude de la Porte de la reine n’utilisent pas de système de gestion informatique. ces systèmes sont pourtant légion dans ce domaine. Le plus utilisé et le plus connu en France reste SysLat (PY 1997). C’est un système de gestion de la documentation archéologique (fig. 7) développé par Michel Py pour le site archéologique de Lattara (Lattes). ce système pionnier en France dans les années 90 est maintenant utilisé dans la plupart des laboratoires et des instituts de recherche. il est basé sur le SgBD MySqL et tend de plus en plus à être interopérable avec les Sig. en dehors de ce dernier, de nombreux autres systèmes ont été développés. il en existe quasiment autant que de sites archéologiques. certains sont très aboutis et permettent de gérer quasiment toute la documentation générée par ce type de chantier, ils sont très souvent basés sur une architecture client-serveur et incluent parfois une interface Web-GIS. A l’inverse certains se contentent d’une simple base de donnée accessible localement sur un poste informatique isolé. chaque système est développé en fonction des objectifs scientifiques, de l’avancement des recherches et des moyens humains, matériels et financiers disponibles.

8. http://syslat.net/pubterminal/t.index.html

ces constatations montrent qu’actuellement aucun système n’est capable d’intégrer au travers d’une même interface, les données : topographiques, lasergrammétriques, photogrammétriques, iconographiques et documentaires. cependant, le système nubes développé par le MaP-gaMSau, qui est déjà utilisé au château comtal de carcassonne et à la chartreuse de Villeneuve-lès-avignon, serait probablement à même de remplir ces objectifs. en effet, ce système permet de visualiser et d’interagir avec des nuages de points, de géoréférencer et d’afficher des images numériques et d’associer des documents ou des liens hypertextes à des entités 3D.c’est donc ce système de gestion qui a été choisi comme solution d’intégration des données collectées à aigues-Mortes.

19etat de l’art

Fig. 7 - SysLat

20

10. Nubes

L’outil utilisé pour l’intégration des données sera la plateforme nubes Visum. L’application permet la consultation et l’édition des données d’un monument, à partir d’un site internet écrit en PhP. Les données sont stockées dans la base MySqL et sur des emplacements serveur. La scène 3D interactive est générée grâce au module Virtools.

Les fonctionnalités de nubes Visum sont les suivantes :• Visualisation des photographies et des nuages de points• Prise de mesures et génération de coupes horizontales• Recherche automatique du point de vue d’une photographie• Ajout d’images géoréférencées• Référencement spatial manuel et en-ligne des images (à l’aide du module Imago)• Ajout de sources iconographiques, textuelles et Internet

10.1. Intégration des données lasergrammétriques (Annexe 4)

Le système nubes interprète un monument comme un ensemble d’entités architecturales. ces entités doivent être défi nies et conceptualisées par l’utilisateur en fonction de ses attentes et de ses besoins. De plus, chaque entité apparient à un groupe. un groupe peut donc contenir une ou plusieurs entités.

Prenons l’exemple des remparts d’aigues-Mortes. on peut découper le site en 32 groupes constitués des 6 tours, 10 ouvrages d’entrée et 16 courtines. chaque ouvrage d’entrée peut ensuite constituer une entité à part entière ou bien être décomposé. La porte de la reine peut, par exemple, être décomposée en trois entités : deux tours et une porte. on peut ensuite distinguer pour la porte : l’assommoir, la bretèche, la herse, la chambre de herse, etc...

Fig. 8 - Exemple de décompostion d’un édifi ce

au delà de l’aspect conceptuel, ces décompositions en entités sont directement liées à le segmentation des nuages de points (fi g. 8). En effet, à chaque entité est associé une ou plusieurs représentations (fi laire, surfacique ou nuage de point), mais une seule peut être affi chée à la fois. Le découpage en entité va donc être lié à la

segmentation des nuages de points.L’utilisateur va pouvoir ainsi charger les portions de l’édifice qui l’intéressent. En dehors de cet aspect purement pratique s’ajoute le problème de la taille des nuages de points. L’architecture du système nubes Visum est basée sur le modèle client-serveur. Les nuages sont donc téléchargés sur la machine de l’utilisateur. il est alors inconcevable de s’affranchir de la segmentation d’un monument comme celui d’aigues-Mortes. De plus, les nuages de points devront être sous-échantillonnés pour pouvoir être affichés sur la machine cliente.Pour une même entité, nubes Visum permet de stocker trois densités diffèrentes pour les nuages de points. Si on souhaite afficher l’ensemble du site on chargera toutes les entités avec leur représentation constituées des nuages de points de faible densité. A l’inverse, si on s’intéresse à une partie spécifique du monument, on pourra se permettre de charger le nuage à moyenne densité ou forte densité. il est également possible d’enregistrer les éléments architecturaux ajourés comme des entités à part entière. on pourra alors charger la géométrie générale de l’édifice à moyenne densité et charger les détails architecturaux qui nous intéressent à haute densité.

10.1.1 Chaîne opératoire MAP-GAMSAU

Actuellement la chaîne opératoire au sein du laboratoire MAP-GAMSAU est la suivante (fig. 9).

21

Fig. 9 - cahîne opératoire du MaP-gaMSau

Dans une première étape les nuages de points sont traités avec les logiciels des constructeurs de laser scanner. cette étape inclue le géoréférencement, le nettoyage des nuages, leur sous-échantillonnage et l’exportation au format aScii (extension .asc) colonné (x,Y,Z,red,green,Blue).

Lors de la création des entités dans nubes Visum, une coordonnée leur est obligatoirement affectée. cette coordonnée doit être cohérente avec le centre de la boite englobante du nuage de point. cette information est obtenue en ouvrant le nuage de point dans Autodesk Maya (fig. 11).

Il faut alors convertir le fichier ASCII en fichier lisible par Autodesk Maya. Pour cela on utilise un petit applicatif appelé Passerelle 3D (fig. 10), développé par le MAP-GAMSAU. Il permet de convertir les fichiers .asc en fichier .ma. il est également capable de sous-échantillonner le nuage de point.

Actuellement le fichier ASCII ne peut être chargé, tel quel, dans Nubes Visum. Il doit être converti au format nMo à l’aide du logiciel Virtools de 3DVia. en effet, c’est à l’aide du plugin de cette suite logicielle que les scènes sont affichées dans le navigateur Web. Auparavant, 3DVIA laissait la possibilité de charger directement un fichier ASCII, mais cette fonctionnalité n’est plus disponible. A l’heure actuelle, le laboratoire MAP-GAMSAU réfléchit à une solution permettant de contourner ce problème. Le format nMo est un format propriétaire non documenté, mais il permet une compression impressionnante de la taille des fichiers points. on obtient très régulièrement des fichiers dont la taille diminue d’un facteur dix.

Une fois le fichier NMO créé, on peut le charger dans Nubes Visum à l’aide de l’interface Web.

Fig. 10 - Passerelle3D

nubes

22

Fig. 12 - chaîne opératoire utilisée pour les données enSg

nubes

10.1.1 Chaîne opératoire ENSG

a l’enSg le traitement débute par la récupération des données avec les logiciels propriétaires des constructeurs de laser scanner. Lors de cette étape, les nuages de points sont assemblés et géoréférencés.

Pour intégrer ces données dans Nubes Visum j’ai utilisé la chaîne opératoire suivante (fi g. 12).

Fig. 11 - coordonnées du ‘Center Pivot’ dans autodesk Maya

Tout d’abord, il s’agit de convertir les fi chiers de points, du format constructeur, au format ASCII. Ceci est fait grâce au logiciel cumulus qui permet la lecture des formats propriétaires. il faut ensuite effectuer un export au format neutre .neu. c’est un format aScii qui contient les coordonnées x Y Z de chaque point, la valeur d’intensité retour du pulse laser et les composantes r, g, B. cette première étape peut être ignorée si on dispose d’exports dans un format aScii ou binaire (.pts dans le cas de Leica ou .ply d’une manière plus générale).

Le fi chier obtenu est ouvert avec CloudCompare. Ce logiciel va permettre de fusionner les différents fi chiers et va également permettre de segmenter les nuages.

il sert également à effectuer un calcul d’ambiant occlusion ou Portion de ciel Visible (PcV) en français. c’est une technique de rendu des volumes basée sur « la mesure de la quantité de lumière ambiante que chaque point du nuage peut recevoir depuis l’extérieur » (De Luca 2009).

Portion de Ciel Visible (GIRARDEAU 2009)

cette technique permet de calculer rapidement l’illumination des points d’un nuage ou des sommets d’un maillage. elle consiste à calculer en chaque point la quantité de lumière qu’il recevrait si l’objet était éclairé de manière uniforme. Les points sont alors coloriés en fonction de leur profondeur relative. ceci fait donc très bien ressortir le relief. Les arrêtes, fissures, etc... seront mises en valeurs. L’algorithme prend en compte deux paramètres : le nombre de rayons et la taille du buffer de rendu.Les rayons sont considérés comme des directions d’éclairement, il n’y a pas de lancé de rayon à proprement parler. Pour chaque direction d’éclairement, l’agorithme projete les points dans le buffer et calcule la visibilité des points du nuage. chaque point obtient donc un score qui permet de calculer l’éclairement global.Le buffer de rendu stocke la projection des points selon la direction sélectionnée. Sa taille va donc conditionner le pouvoir de séparation entre les points.au niveau des performances, le temps de calcul est dépendant du nombre de rayons et de la taille du buffer. au niveau des résultats, plus le nombre de rayons et la taille du buffer sont importants, meilleur sera la dynamique du rendu.

Ce mode de représentation (fig. 13) a été choisis pour remplacer la radiométrie RVB acquise par le scanner ScanStation de Leica dont les valeurs sont très mauvaises et donc inexploitables. On exporte alors, un fichier aScii colonné qui comporte les valeurs xYZ et les composantes rgB du calcul de portion de ciel visible pour chaque point.

23

Sous-échantillonnage (GIRARDEAU 2009)

cloudcompare est utilisé pour sous-échantillonner les nuages de points. au niveau du sous-échantillonnage, plusieurs méthodes sont disponibles :

• Le sous-échantillonnage aléatoire. On fixe le nombre de points du nouveau nuage que l’on souhaite obtenir et on tire aléatoirement les points de l’ancien nuage jusqu’à obtenir le nombre de points voulu.• Le sous-échantillonnage spatial. On impose l’écart maximal à conserver entre deux points. On obtient alors une densité du nuage à peu près constante.• Le sous-échantillonnage par octree. L’octree est un découpage, de l’espace occupé par le nuage, en cubes (fig. 14).

L’octree de niveau 0 correspond au plus petit cube contenant le nuage. au niveau 1, ce cube est décomposé en 8 sous-cubes de même taille et les cubes ne contenant pas de points sont éliminés. au niveau 7 on peut déjà disposer de 2097152 cubes et au niveau 10 on dépasse le milliard de cubes. cloudcompare ne permet pas d’aller au-delà d’une décomposition en octree de niveau 10, car il est peu probable d’avoir à traiter des nuages de plus d’un milliard de point en une seule opération.cloudcompare a très souvent recours à un octree pour effectuer des traitements sur les nuages de points. c’est pour cela que l’on retrouve cette option dans les méthodes de sous-échantillonnage.

nubes

Fig. 13 - représentations ir, rgB et PcV

On fixe donc le niveau d’octree entre un et dix, le nuage est décomposé et seul le point le proche du centre du cube est conservé. On obtient donc un écart entre les points à peu près constant si le nuage est suffisamment dense.J’ai choisis d’utiliser le sous-échantillonnage spatial afin d’obtenir des nuages de densité constante. Ceci permet ensuite d’avoir des nuages de même densité dans nubesVisum.

Au niveau du choix des valeurs de sous-échantillonnage, il est difficile de donner des valeurs figées et applicables dans tous les cas de figure. Je propose ici quelques valeurs qui seront sûrement appelée à être modifiées pour des cas particuliers (MaurangeS 2009) :

• 1 à 5 millimétres pour les détails architecturaux (culots, clefs de voûtes ajourées, etc...)• 1 à 2 centimètres pour le nuage haute densité• 5 à 10 centimètres pour le nuage moyenne densité• 20 à 50 centimètres pour le nuage faible densité

Coordonnées de la boîte englobante

Pour obtenir les coordonnées du centre de la boîte englobante j’ai programmé un petit applicatif en ligne de commande : aSccenterPivot (annexe 1). il récupère les valeurs minimales et maximales du nuage de point, dans les trois directions XYZ en parcourant l’ensemble du fichier, ce qui lui permet par la suite de calculer le centre de la boîte englobante. ceci évite la conversion au format Maya et l’utilisation d’un logiciel payant pour une opération qui était facilement implémentable.

La suite du traitement passe par la conversion au format nMo à l’aide de Virtools. cette étape devrait bientôt devenir inutile grâce à la possibilité de charger directement les fichiers de points au format ASCII dans Nubes Visum. on aura alors une archive du nuage de points accessible sur le serveur de nubes Visum, stockée à différentes résolutions.

10.2. Intégration des données photogrammétriques (Annexe 5)

On a vu que la plate-forme Nubes Visum permet de stocker et d’afficher des images géoréférencées. L’idée est donc d’utiliser cette fonctionnalité pour archiver sur le serveur les images géoréférencées issues des calculs d’aérotriangulation.

Les logiciels utilisés à l’enSg pour les calculs d’aérotriangulation sont au nombre de deux : redresseur pour les chantiers de photogrammétrie architecturale et topaero pour les chantiers de photogrammétrie aérienne. ils enregistrent les résultats du calcul d’aérotriangulation dans le format aPx.

Dans un fichier APX on trouve les coordonnées dans le repère terrain, des points utilisés pour l’aérotriangulation. Les coordonnées de ces points ont fait l’objet d’une compensation par la méthode des moindres carrés lors du processus d’aérotriangulation. on trouve ensuite pour chaque cliché : son nom, les coordonnées de son sommet de prise de vue dans le repère terrain, le numéro de bande, le nom du fichier proprement dit, le fichier de

24nubes

Fig. 14 - octree de niveau 1 et 4

calibration de la caméra associée, son orientation et sa matrice de passage du repère image au repère terrain.

Le fi chier de calibration de la caméra contient les coordonnées en pixels du point principal d’autocolimation dans le repère image, la focale exprimée en pixels, les coordonnées en pixels du point principal de symétrie dans le repère image, les trois coeffi cients de distorsion radiale, le nombre de repère de fond de chambre et leur coordonnées, et la taille du capteur en pixels.

nubes Visum oriente les clichés dans la scène 3D en effectuant une translation et une série de rotations par rapport au centre de l’image. Pour insérer le cliché dans la scène, il est nécessaire de fournir : le nom du fi chier image, sa largeur et sa hauteur en pixels, la valeur de sa focale en millimètres, les coordonnées du sommet de prise de vue et les valeurs des trois angles d’euler en degrés décimaux.

Les angles d’euler (egeLS 2006) s’obtienent à partir de la matrice rotation présente dans le fi chier APX :

La subtilité vient du fait que l’on passe d’un système ‘main droite’ à un système ‘main gauche’. L’enchaînement des rotations dans Nubes se fait dans cet ordre : Rx → Ry → Rz

Les valeurs de la composante de translation sont les coordonnées dans le repère terrain des sommets de prise de vue. on approxime alors le sommet de prise de vue et le centre du cliché. cette approximation est imperceptible lors de l’affi chage dans la scène 3D.

Une fois que tous ces paramètres sont connus on peut insérer l’image géoréférencée à l’aide de l’interface Web de nubes Visum. cette façon de faire pourrait convenir à de petits chantiers, mais dans le cas d’aigues-Mortes nous sommes face à plusieurs milliers de clichés numériques.J’ai donc programmé un utilitaire qui permet d’insérer les images dans nubes Visum sans passer par l’interface Web.

ce programme se nomme apx2nubes et fonctionne en ligne de commande (annexe 2). il prend en argument le nom du fi chier APX que l’on souhaite traiter. Ceci lui permet de récupérer la liste des images, leurs différents paramètres et le nom des fi chiers de calibration des caméras. Dans le fi chier APX, il récupère les coordonnées des sommets de prise de vue, le nom du fi chier de calibration et le nom du fi chier image. Il peut ainsi calculer les angles d’Euler. Ensuite il lit les fi chiers de calibration et en extrait les tailles des capteurs. Enfi n la longueur de la focale et la date de prise de vue sont extraites directement du fi chier image à partir des données EXIF.L’insertion dans la base de donnée MySqL peut se faire directement avec apx2nubes. L’utilisateur doit posséder des droits en écriture sur la base de donnée. il est également possible de générer la miniature utilisée dans l’interface Web. Par contre le dépôt par protocole FTP sur le serveur n’est pas implémenté. Les fi chiers image et les miniatures devront donc être uploadés à l’aide d’un client FtP.

Implémentation logicielle

Interactions avec la BDD MySQL :

Les interactions avec la base de donnée MySqL ont été implémentées à l’aide de plusieurs classes qt.

La connexion est effectuée à l’aide de la classe qSqlDatabase. elle permet l’accès à une base de donnée de type SqL. en arrière plan, qt fait appel à des plugins qui se chargent de rendre transparent, pour le programmeur, les différences entre les SgBD. Les SgBD gérés par qt sont les suivants : iBM DB2, Borland interBase, MySqL, oracle call, Microsoft SqL Server, PostgreSqL et SqLite. En pratique il suffi t donc d’indiquer à Qt quel SGBD se trouve sur le serveur. Si le plugin n’existe pas, Qt offre la possibilité de faire appel à son propre plugin développé spécialement par le programmeur.Par contre, qt ne fournit pas le plugin pour le SgBD MySqL dans sa version précompilée. Deux solutions s’offrent alors :

• Télécharger les sources du SGBD MySQL et le SDK de Qt, puis recompiler Qt en lui demandant de prendre en charge MySqL (annexe 6).

25nubes

• Recompiler uniquement le plugin MySQL à partir des sources du SGBD MySQL et du SDK de Qt (Annexe 7).

Les requêtes ont été lancées à l’aide de la classe qSqlquerry. c’est une manière d’exécuter des requêtes SqL. elle intègre les commandes SqL standards tel que : SeLect, inSert, uPDate, DeLete, create taBLe, etc... et certaines commandes spécifiques à certains SGBD.

Hachage cryptographique :

La connexion à NubesVisum est soumise à une authentification par un couple ‘identifiant’ / ‘mot de passe’. La liste des utilisateurs est stockée dans la table ‘user’, mais pour des questions de sécurité, les mots de passe ne sont pas stockés en clair dans la table. Au moment de l’inscription l’utilisateur définit son mot de passe et une empreinte de ce mot de passe est créée à l’aide de l’algorithme MD5. c’est cette empreinte qui est enregistrée dans la table ‘user’ . A chaque fois que NubesVisum demande à l’utilisateur de s’authentifier, l’empreinte MD5 est générée et comparée à celle stockée dans la table. Si les deux empreintes coïncident, alors l’accès est autorisé.Une fois connecté à la base de donnée MySQL, on peut modifier des tables et de données qui ne nous appartiennent pas. C’est pourquoi, j’ai implémenté cette deuxième authentification, afin de s’assurer que le projet appartient bien à l’utilisateur.La procédure est donc la même. Le mot de passe est haché à l’aide de la classe qcryptographichash qui propose trois méthode de hashage : MD4, MD5 et Sha-1. ensuite l’empreinte est comparée pour valider la connexion.MD5 signifie Message Digest 5, c’est une méthode mise au point en 1996 qui est toujours utilisée mais qui comporte des failles de sécurité. Dans le cadre de l’utilisation de nubesVisum, cette sécurité reste largement suffisante.

Création des miniatures :

Lorsque les images géoréférencées sont insérées dans NubesVisum au travers de l’interface Web, une miniature est générée et stockée avec l’image originale. ceci permet le chargement plus rapide de certaines pages. Pour créer ces miniature, j’ai fait appel à la classe qimage. cette classe fournit au programmeur des fonctions indépendantes du format de fichier, pour la manipulation des images. Elle supporte les formats suivants : bmp, gif, jpeg, png, pbm, pgm, ppm, tiff, xbm et xpm.

Lecture des informations EXIF :

EXIF signifie Exchangeable Image File Format. Ce format (Jeita 2002) édicte un certains nombre de normes applicables aux fichiers image et notamment sur les métadonnées qui leurs sont associés. Ainsi, un fichier jpeg ou tiff peut contenir la date de création, la date de dernière modification, le modèle d’appareil photo, la focale, etc...Qt ne propose pas de classe permettant d’extraire les informations EXIF d’un fichier image. Des librairies externes existent tel que : exiv2 ou libexif, mais leur installation et leur compilation semblait bien compliquée pour un aussi petit projet. J’ai donc préféré développer ma propre classe pour extraire les informations dont j’avais besoin, c’est à dire la focale et la date de prise de vue.il ne s’agit pas ici de rentrer dans les détails du format exiF, mais plutôt d’en présenter succinctement les principes. Un fichier image compressé tel que les fichiers jpeg sont organisés selon une structure standard (fig. 15).

Les métadonnées sont stockées à l’intérieur de la structure ‘aPP1’ et celles qui nous intéressent sont présentes dans la sous-section ‘1st iFD Value’. Dans ces section les métadonnées sont codées sur 16 octets. Les deux premiers octets correspondent à un tag qui permet de savoir ce qui est codé. Par exemple le tag 0x920a indique qu’il s’agit de la focale. Les deux octets suivants indiquent le format de codage de l’information (int, short, long, etc...). On trouve ensuite quatre octets qui renseignent sur le nombre de valeurs et enfin les quatre derniers octets contiennent l’information ou un offset vers l’information concernée si elle ne peut être codée sur quatre octets.

26nubes

La classe que j’ai codée prend en compte l’encodage Little endian et l’encodage Big endian. en effet, en fonction des constructeurs d’appareils photographiques, l’encodage n’est pas réalisé de la même manière. Le type d’encodage est spécifié dans les deux premiers octets du ‘TIFF Header’. Si les deux premiers octets sont : 0x4949 (« ii ») on a affaire à un encodage intel (Little endian) et si les deux premiers octets sont : 0x4d4d (« MM ») on a affaire à un encodage Motorola (Big endian).

Tests

Les tests ont été réalisés avec des aérotriangulations effectuées sur la porte de la reine à l’aide du logiciel redresseur. Dans un premier temps, j’ai réalisé une copie de la base de données ‘nubesvisum’ du serveur vinci.gamsau.archi.fr sur mon ordinateur. Pour cela j’ai installé xaMPP qui est une suite logicielle destinée au développement PhP-MySqL. elle permet d’installer un serveur MySqL, apache et le support PhP sans avoir besoin d’effectuer les configurations soi même. Une fois cette première phase de test terminée, les tests ont été effectués directement sur le serveur distant.

10.3. Intégration des données topographiques

Le logiciel utilisé par l’enSg pour la compensation de réseaux géodésiques locaux est Comp3D. il permet d’intégrer les mesures topométriques classiques, les mesures photogrammétriques et les mesures issues des levés laser.il pourrait être intéressant de visualiser dans la scène 3D les visées entre stations, les points rayonnés depuis une station, différencier les types de stations en fonction des appareils, etc...La plateforme nubes Visum n’a jamais réellement été pensée pour pouvoir intégrer ce genres d’informations mais elle a été en partie conçue pour afficher des graphes en 3D avec des relations hiérarchiques entre les éléments du graphe.une première approche consisterait donc, par exemple, à enregistrer chaque station comme une entité et chaque point rayonné comme un repère. Le repère est un point dans l’espace qui appartient à une entité. on peut lui associer les mêmes informations qu’aux autres éléments, c’est à dire : documents iconographiques, images orientées, liens internet, etc...Un point de mesure enregistré comme un repère peut alors recevoir sa fiche descriptive. Elle sera attachée au repère comme un lien vers une base de donnée externe ou comme un document au format PDF ou autre.Cette solution permet l’archivage des fiches de site, fiche descriptives, etc... mais ne permet pas de visualiser

27nubes

Fig. 15 - Structure d’un fichier JPEG

un réseau. elle ne permet donc pas de savoir depuis quelles stations le point a été visé. en effet, l’état actuel de la hiérarchie : « groupe – entité – repère » n’autorise pas un repère à appartenir à plusieurs entités ; on ne peut donc pas modéliser la visée d’un point par plusieurs stations. De même, une entité ne peut pas appartenir à plusieurs groupes, on ne peut donc pas représenter la station d’un même point d’un canevas par un tachéomètre et un laser-scanner.

L’idée d’intégrer les données topographiques et de pouvoir visualiser les visées entre stations et les points rayonnés a été soumise à l’équipe du laboratoire MaP-gaMSau qui s’est trouvé intéressée par cette perspective.Une nouvelle base a été créée dans la base de donnée MySQL de Nubes Visum afin de stocker les informations nécessaires. ces données sont les suivantes :

• Relations entre les points • Type de point (station de nivellement, station laser, station de tachéomètre, station libre, point matérialisé, cible photogrammétrique, point naturel) • Coordonnées des points • Photographie du point • Fiche descriptive

Un espace a également été créé sur le serveur Web pour mettre en place une éventuelle interface entièrement dédiée à la gestion d’un projet de levé topométrique. il serait alors envisageable de créer et de mettre à jour directement les fiches signalétiques sur cet espace dédié.

a la date de rédaction de ce mémoire, seule le développement d’une librairie en c++ permettant de lire les fichiers NEW et OBS est achevée (Annexe 3). Elle permet de récupérer les coordonnées des points du réseau et la hiérarchie entre ces points. c’est à dire de savoir si un point est un point de détail ou un point stationné et de savoir par quelle(s) station(s) il a été visé.

Dans l’attente de la poursuite du développement de cette nouvelle fonctionnalité, la solution pour archiver les données topographiques consiste à créer des repères et à leur associer les fiches descriptives.

10.4. Intégration des données du CMN et du CRMH

il va de soit qu’en l’état actuel des choses, seules les données numérisées sont susceptibles d’être archivées par la plate-forme nubes Visum.comme on l’a vu précédemment les documents iconographiques ou textuels peuvent être associés à un groupe, une entité ou un repère (fig. 16). Il sera donc à la discrétion des agents du CMN et du CRMH de choisir le groupe ou l’entité la plus à même d’être liée à la documentation numérisée.

en ce qui concerne les données présentes sur le serveur national, son interrogation peut être faite à l’aide d’une urL. on peut donc lier aux entités, aux groupes ou aux repères des requêtes sur ces bases de données en leur associant des urL. on pourra lancer une requête sur les bases de données Mérimée (architecture), Palissy (mobilier) et Mémoire (image).L’urL se compose de la manière suivante :

http://www.culture.gouv.fr/public/mistral/memoire_fr?action=chercher&FieLD_1=Loca&VaLue_1=aigues%20mortes&FieLD_2=eDiF&VaLue_2=remparts&FieLD_3=Leg&VaLue_3=porte%20de%20la%20reine

Le nom de la base de donnee (memoire_fr pour Mémoire , mersri_fr pour Mérimée et palsri_fr pour Palissy), un ou plusieurs critère de recherche, composé d’un nom de champ et d’une valeur. il ne faut pas oublier d’incrémenter la numérotation du champ et de sa valeur pour chaque nouveau critère de recherche.Dans l’exemple, on cherche sur la base Mémoire les images qui concernent un édifice de type « remparts » ayant dans sa légende la mention « porte de la reine » et étant situé sur la commune « aigues mortes » (fig. 17).

28nubes

29nubes

Fig. 16 - Données externes associées à un nuage de points

Fig. 17 - résultat d’une requête sur la base Mémoire à partir de l’internface de nubesVisum

30

11. Conclusion

ce mémoire a montré que la plateforme nubesVisum est une solution viable pour l’intégration de données hétérogènes et qu’elle peut répondre au problème du stockage et de la diffusion des données acquises sur un monument.un certain nombre de fonctionnalités sont encore en cours de développement, mais le système permet d’ores et déjà de subvenir aux besoins des principaux acteurs du projet.il serait intéressant de mettre en place un système complet de gestion des données topographiques et d’offrir la possibilité d’exporter dans un format SVG ou DXF les coupes affichées dans l’interface Web.une autre application très intéressante consisterait à pouvoir créer des repères, en cliquant dans une image géoréférencée. ceci permettrait, par exemple, à un utilisateur novice en photogrammétrie, de géoréférencer au travers de l’interface Web, des détails sur une élévation architecturale. Dans le cas d’Aigues-Mortes, ce genre de fonctionnalité permettrait de géoréférencer la dizaine de millier de marques de tâcherons réparties sur le monument et de les lier à un thésaurus.

D’un point de vue personnel, le stage m’a permis d’enrichir mes faibles connaissances en programmation tout en les appliquant à des domaines qui me sont familier : l’archéologie et le patrimoine. J’ai découvert la compilation de librairies externes et la lecture de fichiers binaires. Enfin, j’ai apprécié de travailler avec des personnes issus de tous les domaines liès à l’architecture et au patrimoine, que ce soit au crMh, à la Drac, au cMn ou au laboratoire MaP-gaMSau.

31

12. Bibliographie

DE LUCA 2009 : L. De Luca, La photomodélisation architecturale, relevé, modélisation et représentation d’édifices à partir de photographies, 2009, 263 p.

EGELS 2006 : Y. egels, quelques formules utiles en photogrammétrie, 2006, 19 p.

GIRARDEAU 2009 : D. girardeau-Montaut, a. Bey, r. Marc, cloudcompare, Manuel utilisateur de la version 2.1, 2009, 57 p.

JEITA 2002 : Japan Electronics and Information Technology Industries Association, Exchangeable image file format for digital still cameras : exif Version 2.2, 2002, p. 1-71

MANIEZ 2002 : Y. Manniez et alii, Logis du gouverneur à Aigues-Mortes, Document final de synthèse, Diagnostic archéologique, institut national de recherches archéologiques Préventives, 2002, 27 p.

MAURANGES 2009 : L. Mauranges, Étude et définition de spécifications pour le relevé (par lasergrammétrie et photogrammétrie) du patrimoine architectural, Mémoire de travail de fin d’étude ESGT, 2009, 73 p.

PETITOT 1994 : h. Petitot, campagne de révision de Monuments historiques et de sites archéologiques dans la moitié sud du département du gard, Ministère de la culture et de la communication, 1994, 8 p.

PY 1997 : M. Py, Lattara 10, SysLat 3.1, Système d’information archéologique, Manuel de référence, 1997, 380 p.

32

13. Table des figures

8 fig. 1 organigramme de la Drac Languedoc-roussillon - M. Seguin

9 fig. 2 organigramme général du cMn - M. Seguin

9 fig. 3 Organigramme des laboratoires MAP - M. Seguin

11 fig. 4 aigues-Mortes vue du nord-ouest - http://lemasdessables.com

15 fig. 5 exemples de produits livrés - enSg

17 fig. 6 Système d’information Patrimonial : Patriarche - Drac/Sra

19 fig. 7 SysLat - http://syslat.net

20 fig. 8 Exemple de décomposition d’un édifice - L. De Luca

21 fig. 9 chaîne opératoire du MaP-gaMSau - M. Seguin

21 fig. 10 Passerelle3D - M. Seguin

22 fig. 11 coordonnées du ‘center Pivot’ dans autodesk Maya - M. Seguin

22 fig. 12 chaîne opératoire utilisée pour les données de l’enSg - M. Seguin

23 fig. 13 représentations ir, rgB et PcV - M. Seguin

24 fig. 14 octree de niveau 1 et 4 - M. Seguin

27 fig. 15 Structure d’un fichier JPEG - JEITA

29 fig. 16 Données externes associées à un nuage de points - M. Seguin

29 fig. 17 résultat d’une requête sur la base Mémoire - M. Seguin

33

14. Table des annexes

34 annexe 1 code source du programme aSccenterPivot

36 annexe 2 code source du programme apx2nubes

54 annexe 3 code source du projet comp3d2nubes

67 annexe 4 Protocole d’intégration des données lasergrammétriques

74 annexe 5 Protocole d’intégration des données photogrammétriques

75 annexe 6 compiler qt 4.x avec le support MySqL

77 annexe 7 compiler le plugin MySqL pour qt 4.x

34

Annexe 1code source du programme aSccenterPivot

/****************************************************************************** * * File : main.cpp * Date : 19 mai 2011 * Project: ASCBarycenter * Purpose: Calcul du centre de la boite englobante (‘Center Pivot’ de Maya) * Author: Maxime SEGUIN * ******************************************************************************/

#include <iostream>#include <fstream>#include <string>#include <iomanip>

int main(int argc, char *argv[]){ double x=0, y=0, z=0; double cpx=0, cpy=0, cpz=0; double xmin, ymin, zmin; double xmax, ymax, zmax; int count=0, touche=0; std::string trash, file_name;

// Recuperation du nom du fichier en entree de la ligne de commande file_name=argv[1];

std::ifstream file(file_name.c_str());

// Test de l’ouverture du fichier if(!file.good()) { std::cout<<"Probleme a l’ouverture du fichier"<<std::endl; return false; }

// Initialisation des variables avec les coordonnées du premier point file>>xmin; file>>ymin; file>>zmin; getline(file, trash); xmax=xmin; ymax=ymin; zmax=zmin;

// Recherche des extremas while(!file.eof()) { file>>x; file>>y; file>>z; getline(file, trash);

if(x<=xmin) { xmin=x; } if(x>=xmax) { xmax=x; }

if(y<=ymin) { ymin=y; } if(y>=ymax) { ymax=y; } if(z<=zmin) { zmin=z; } if(z>=zmax) { zmax=z; }

count++; }

file.close();

// Calcul du centre de la boite englobante cpx=(xmin+xmax)/2; cpy=(ymin+ymax)/2; cpz=(zmin+zmax)/2;

// Affichage des résultats std::cout<<std::endl; std::cout<<"Nom du fichier : "<<file_name<<std::endl<<std::endl; std::cout<<"Nombre de points : "<<count<<std::endl<<std::endl; std::cout<<"Coordonnees du centre de la boite englobante :"<<std::endl; std::cout<<std::fixed<<std::setprecision(4)<<"CPx = "<<cpx<<std::endl; std::cout<<std::fixed<<std::setprecision(4)<<"CPy = "<<cpy<<std::endl; std::cout<<std::fixed<<std::setprecision(4)<<"CPz = "<<cpz<<std::endl<<std::endl; std::cout<<"Hit Enter"<<std::endl; touche = getchar();

while (touche==0) {}

return 0;}

35code source du programme aSccenterPivot

36

Annexe 2code source du programme apx2nubes

/****************************************************************************** * * File : main.cpp * Date : 9 septembre 2011 * Project: apx2nubes * Purpose: Integration des photographies georeferencees par Redresseur et * TopAero dans NubesVisum * Author: Maxime SEGUIN * ******************************************************************************/

#include <iostream>#include <fstream>#include <string>#include <vector>#include <cmath>#include <sstream>#include <cstdio>

#include <QtCore/QCoreApplication>#include <QtSql/QSqlDatabase>#include <QtSql/QSqlQuery>#include <QtSql/QSqlResult>#include <QCryptographicHash>#include <QString>#include <QByteArray>#include <QtGui/QImage>

#include "fichierAPX.h"#include "donneesEXIF.h"#include "fichierCAM.h"

// Conversion de n’importe quel type std en std::stringtemplate<typename T>std::string type2string( const T & valeur ){ std::ostringstream resultat; resultat << valeur; return resultat.str();}

// Conversion des radians en degres decimauxdouble rad2deg(double angleRadian){ const double pi(3.141592653589793238462643383); double angleDegre; angleDegre = angleRadian*180/pi; return angleDegre;}

int main(int argc, char *argv[]){ QCoreApplication app(argc, argv); std::string nomFichierAPX(argv[1]);

std::vector<imgOrientee> listeImgOrientees; imgOrientee imageOrientee; double Rx, Ry, Rz;

fichierAPX fichierEntree; donneesEXIF lectureEXIF; fichierCAM lectureCAM;

fichierEntree.initialisation(nomFichierAPX); listeImgOrientees = fichierEntree.getListeImgOrientees();

// Connexion a la BDD MySQL du MAP-GAMSAU

std::cout<<"+"<<std::endl; std::cout<<"+ Connexion BDD MySQL"<<std::endl; std::cout<<"+"<<std::endl; QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); std::string serveur; std::cout<<"Serveur : "; std::cin>>serveur; db.setHostName(QString::fromStdString(serveur)); db.setDatabaseName("nubesvisum");

std::string loginNubes, passwordNubes; std::cout<<"Login : "; std::cin>>loginNubes; std::cout<<"Password : "; std::cin>>passwordNubes;

db.setUserName(QString::fromStdString(loginNubes)); db.setPassword(QString::fromStdString(passwordNubes));

std::cout<<"+"<<std::endl; std::cout<<"+ Connexion Nubes"<<std::endl; std::cout<<"+"<<std::endl;

std::string login, password; std::cout<<"Login : "; std::cin>>login; std::cout<<"Password : "; std::cin>>password;

QByteArray mdp; QCryptographicHash md5(QCryptographicHash::Md5); md5.addData(QByteArray(password.c_str())); mdp = md5.result();

if(db.open()) { QSqlQuery identification; identification.prepare("SELECT id_user, institut FROM user WHERE login=’" + QString::fromStdString(login) + "’ AND mdp=’" + QString(mdp.toHex()) + "’"); identification.exec();

if(identification.size()==1) { int idUser; std::string institut; identification.next(); idUser = identification.value(0).toInt();

37code source du programme apx2nubes

institut = identification.value(1).toString().toStdString();

std::string nomProjet("Groland"); int idProjet(0); std::cout<<"Nom du projet : "; std::cin.ignore(255, ‘\n’); std::getline(std::cin, nomProjet);

QSqlQuery projet; projet.prepare("SELECT id FROM projets WHERE nom=’" + QString::fromStdString(nomProjet) + "’"); projet.exec(); projet.next(); idProjet = projet.value(0).toInt(); //std::cout<<idProjet<<std::endl; // Debug

for (int i=0; i<listeImgOrientees.size(); i++) { imageOrientee = listeImgOrientees[i]; std::cout<<std::endl; std::cout<<imageOrientee.nomFichierImg<<std::endl; std::cout<<"Tx : "<<imageOrientee.x<<std::endl; std::cout<<"Ty : "<<imageOrientee.z<<std::endl; std::cout<<"Tz : "<<imageOrientee.y<<std::endl; Ry = std::asin(imageOrientee.matRotation[2]); Rx = std::asin(-imageOrientee.matRotation[5]/std::cos(Ry)); Rz = std::asin(-imageOrientee.matRotation[1]/std::cos(Ry)); std::cout<<"Rx : "<<rad2deg(Rx)+90<<std::endl; std::cout<<"Ry : "<<rad2deg(Rz)<<std::endl; std::cout<<"Rz : "<<rad2deg(Ry)<<std::endl;

lectureEXIF.initialisation(imageOrientee.nomFichierImg); double focale(lectureEXIF.getFocale()); std::cout<<"Focale : "<<focale<<std::endl; std::string date(lectureEXIF.getDateTime()); std::cout<<"Date : "<<date<<std::endl; lectureEXIF.fermeture();

lectureCAM.initialisation(imageOrientee.nomFichierCam); std::cout<<"Cvx : "<<lectureCAM.getLargeur()<<std::endl; std::cout<<"Cvy : "<<lectureCAM.getHauteur()<<std::endl;

std::string key;

std::cout<<std::endl<<"Creer la miniature ? [y/n]"; std::cin>>key; if (key=="y") { QImage image; QImage imageResized; image.load(QString::fromStdString(imageOrientee.nomFichierI-mg)); QSize size(100, 100); imageResized = image.scaled(size ,Qt::KeepAspectRatio, Qt::FastTransformation); imageResized.save("_miniature"+QString::fromStdString(imageOrientee.nomFichierImg)); }

std::cout<<std::endl<<"Inserer les donnees dans la BDD ? [y/n]";

38code source du programme apx2nubes

std::cin>>key; if (key=="y") { if(db.open()) { std::string nomFichier, extension; std::istringstream fichier(imageOrientee.nomFichierImg); std::getline(fichier, nomFichier, ‘.’); std::getline(fichier, extension);

std::string jour, mois, annee; std::istringstream dateStreamed(date); std::getline(dateStreamed, annee, ‘:’); std::getline(dateStreamed, mois, ‘:’); std::getline(dateStreamed, jour, ‘:’);

std::string values; values = "’" + nomFichier + "’, "; values += "’" + extension + "’, "; values += "’NULL’, "; values += "’" + institut + "’, "; values += "’" + jour + "/" + mois + "/" + annee + "’, "; values += "’" + type2string(idUser) + "’, "; values += "’" + type2string(imageOrientee.x) + "’, "; values += "’" + type2string(imageOrientee.z) + "’, "; values += "’" + type2string(imageOrientee.y) + "’, "; values += "’" + type2string(rad2deg(Rx)+90) + "’, "; values += "’" + type2string(rad2deg(Rz)) + "’, "; values += "’" + type2string(rad2deg(Ry)) + "’, "; values += "’" + type2string(focale) + "’, "; values += "’" + type2string(lectureCAM.getLargeur()) + "’, "; values += "’" + type2string(lectureCAM.getHauteur()) + "’, "; values += "’" + type2string(idProjet) + "’";

QSqlQuery query; query.prepare("INSERT INTO photos_temps(name, extension, legende, auteur, date, id_user, Tx, Ty, Tz, Rx, Ry, Rz, FoV, cvx, cvy, id_pro-jet) VALUES(" + QString::fromStdString(values) + ")"); query.exec(); } else { std::cout<<"Desole. A mache pas..."<<std::endl; } } } } else { std::cout<<"Acces refuse"<<std::endl; } } else { std::cerr<<"Probleme de connection a la BDD"<<std::cout; return 1; }

39code source du programme apx2nubes

db.close(); return 0;}

40code source du programme apx2nubes

/****************************************************************************** * * File : fichierCAM.cpp * Date : 9 septembre 2011 * Project: apx2nubes * Purpose: Lecture des fichiers .CAM * Author: Maxime SEGUIN * ******************************************************************************/

#include "fichierCAM.h"

fichierCAM::fichierCAM(){}

bool fichierCAM::initialisation(std::string nomFichier){ m_fichier.open(nomFichier.c_str(), std::ios::in); if(!m_fichier) { return 1; } else { m_fichierBuffer<<m_fichier.rdbuf(); m_fichier.close();

m_fichierBuffer>>m_xPPA; m_fichierBuffer>>m_yPPA; m_fichierBuffer>>m_focale; m_fichierBuffer>>m_xPPS; m_fichierBuffer>>m_yPPS; m_fichierBuffer>>m_r3; m_fichierBuffer>>m_r5; m_fichierBuffer>>m_r7; m_fichierBuffer>>m_nbReperes; if(m_nbReperes!=0) { std::cerr<<"Nombres de reperes !=0. Fonction non-implementee"<<std::endl; return 1; } m_fichierBuffer>>m_largeur; m_fichierBuffer>>m_hauteur; }

return 0;}

double fichierCAM::getXPPA() { return m_xPPA; }

double fichierCAM::getYPPA() { return m_yPPA; }

double fichierCAM::getFocale() { return m_focale; }

double fichierCAM::getXPPS() { return m_xPPS; }

double fichierCAM::getYPPS() { return m_yPPS; }

41code source du programme apx2nubes

double fichierCAM::getR3() { return m_r3; }

double fichierCAM::getR5() { return m_r5; }

double fichierCAM::getR7() { return m_r7; }

int fichierCAM::getLargeur() { return m_largeur; }

int fichierCAM::getHauteur() { return m_hauteur; }

fichierCAM::~fichierCAM(){}

42code source du programme apx2nubes

/****************************************************************************** * * File : fichierCAM.h * Date : 9 septembre 2011 * Project: apx2nubes * Purpose: Lecture des fichiers .CAM * Author: Maxime SEGUIN * ******************************************************************************/

#ifndef FICHIERCAM_H#define FICHIERCAM_H

#include <string>#include <iostream>#include <fstream>#include <sstream>

class fichierCAM{ public:

fichierCAM(); ~fichierCAM();

bool initialisation(std::string nomFichier);

double getXPPA();

double getYPPA();

double getFocale();

double getXPPS();

double getYPPS();

double getR3();

double getR5();

double getR7();

int getLargeur();

int getHauteur();

private:

double m_xPPA, m_yPPA, m_focale, m_xPPS, m_yPPS, m_r3, m_r5, m_r7; int m_nbReperes, m_largeur, m_hauteur;

std::ifstream m_fichier; std::stringstream m_fichierBuffer;};

#endif

43code source du programme apx2nubes

/****************************************************************************** * * File : fichierAPX.cpp * Date : 9 septembre 2011 * Project: apx2nubes * Purpose: Lecture des fichiers .APX * Author: Maxime SEGUIN * ******************************************************************************/

# include "fichierAPX.h"

fichierAPX::fichierAPX(){}

bool fichierAPX::initialisation(std::string nomFichier){ m_fichier.open(nomFichier.c_str(), std::ios::in); if(!m_fichier) { return 1; } else { m_fichierBuffer<<m_fichier.rdbuf(); m_fichier.close();

m_fichierBuffer>>m_nbPtAero;

ptAero m_ptAeroTemp;

for(int i=0; i<m_nbPtAero; i++) { m_fichierBuffer>>m_ptAeroTemp.num; m_fichierBuffer>>m_ptAeroTemp.x; m_fichierBuffer>>m_ptAeroTemp.y; m_fichierBuffer>>m_ptAeroTemp.z; m_listePtAero.push_back(m_ptAeroTemp); }

m_fichierBuffer>>m_nbImgOrientees;

imgOrientee m_imgOrienteeTemp;

for(int i=0; i<m_nbImgOrientees; i++) { m_fichierBuffer>>m_imgOrienteeTemp.num; m_fichierBuffer>>m_imgOrienteeTemp.x; m_fichierBuffer>>m_imgOrienteeTemp.y; m_fichierBuffer>>m_imgOrienteeTemp.z; m_fichierBuffer>>m_imgOrienteeTemp.numBande; m_fichierBuffer>>m_imgOrienteeTemp.nomFichierImg; m_fichierBuffer>>m_imgOrienteeTemp.nomFichierCam; m_fichierBuffer>>m_imgOrienteeTemp.orientation; double m_rTemp; for(int j=0; j<9; j++) { m_fichierBuffer>>m_rTemp; m_imgOrienteeTemp.matRotation.push_back(m_rTemp);

44code source du programme apx2nubes

} m_listeImgOrientees.push_back(m_imgOrienteeTemp); m_imgOrienteeTemp.matRotation.clear(); }

return 0; }}

std::vector<imgOrientee> fichierAPX::getListeImgOrientees(){ return m_listeImgOrientees;}

fichierAPX::~fichierAPX(){}

45code source du programme apx2nubes

/****************************************************************************** * * File : fichierAPX.h * Date : 9 septembre 2011 * Project: apx2nubes * Purpose: Lecture des fichiers .APX * Author: Maxime SEGUIN * ******************************************************************************/

#ifndef FICHIERAPX_H#define FICHIERAPX_H

#include <string>#include <iostream>#include <fstream>#include <sstream>#include <vector>

// Point d’aerotriangulation dans le repere terrainstruct ptAero{ int num; // Numero du point d’apppui ou du point de liaison double x, y, z; // Coordonnees des points d’appuis et des points de liaisons en sortie du calcul d’aerotriangulation dans le repere terrain};

// Image orientee dans le repere terrainstruct imgOrientee{ int num; // Numero de l’image orientee double x, y, z; // Coordonnees du sommet de prise de vue dans le repere ter-rain int numBande; // Numero de bande std::string nomFichierImg; // Nom du fichier image std::string nomFichierCam; // Nom du fichier d’etalonnage de la camera int orientation; // Orientation de la camera lors de la prise de vue std::vector<double> matRotation; // Matrice rotation r{ligne}{colonne} : [r11, r12, r13, r21, r22, ... , r33]};

class fichierAPX{ public:

fichierAPX(); ~fichierAPX();

bool initialisation(std::string nomFichier);

std::vector<imgOrientee> getListeImgOrientees();

private:

std::ifstream m_fichier; std::stringstream m_fichierBuffer;

// Nombre de points d’appui et de liaison int m_nbPtAero;

46code source du programme apx2nubes

// Nombre d’images orientees int m_nbImgOrientees;

std::vector<ptAero> m_listePtAero; std::vector<imgOrientee> m_listeImgOrientees;};

#endif

47code source du programme apx2nubes

/****************************************************************************** * * File : donneesEXIF.cpp * Date : 9 septembre 2011 * Project: apx2nubes * Purpose: Lecture de la focale et de la date dans les donnees EXIF * Author: Maxime SEGUIN * ******************************************************************************/

#include «donneesEXIF.h»

template <typename T>

T donneesEXIF::m_revertEndian(const T& iValue){ if(m_encodage==0x4949) { return iValue; } if(m_encodage==0x4d4d) { T oResult; const unsigned char* iRaw = (const unsigned char*) &iValue; unsigned char* oRaw = (unsigned char*) &oResult; for(int i=0; i!=sizeof(T); i++) { oRaw[i] = iRaw[sizeof(T)-i-1]; } return oResult; }}

donneesEXIF::donneesEXIF(){}

bool donneesEXIF::initialisation(std::string nomFichier){ m_fichier.open(nomFichier.c_str(), std::ios::in | std::ios::binary);

// // Verification des marqueurs SOF et EOF // unsigned short int sof(0); // SOF : Start Of File m_fichier.seekg(std::ios::beg); m_fichier.read((char *)&sof, 2); if (sof!=0xd8ff) // Un fichier JPEG/TIFF commence par 0xd8ff { return 1; }

unsigned short int eof(0); // EOF : End Of File m_fichier.seekg(-2, std::ios::end); m_fichier.read((char *)&eof, 2); if (eof!=0xd9ff) // Un fichier JPEG/TIFF se termine par 0xd9ff

48code source du programme apx2nubes

{ return 1; }

// // Recherche du marqueur APP1 : 0xe1ff // m_fichier.seekg(std::ios::beg); unsigned short int debutAPP1(0); while(debutAPP1!=0xe1ff) { m_fichier.read((char *)&debutAPP1, 2); if(m_fichier.eof()) { return 1; } } debutAPP1 = debutAPP1-2;

// // Dimension de l’entete APP1 // unsigned short int tailleAPP1(0); m_fichier.read((char *)&tailleAPP1, 2);

// // En tete EXIF // unsigned int headerEXIF(0); m_fichier.read((char *)&headerEXIF, 4); if(headerEXIF!=0x66697845) { return 1; } m_fichier.seekg(2, std::ios::cur); // On saute les deux bytes nuls 0x0000 de l’en tete EXIF

// // Debut de l’en tete EXIF // m_debutEXIF = m_fichier.tellg();

// // Encodage du fichier // m_fichier.read((char *)&m_encodage, 2); if (m_encodage==0x4949) { // std::cout<<»Encodage Intel»<<std::endl; // Debug } if (m_encodage==0x4d4d) { // std::cout<<»Encodage Motorola»<<std::endl; // Debug } if (m_encodage!=0x4d4d && m_encodage!=0x4949) { // std::cerr<<»Mauvais type d’encodage : «<<std::endl; // Debug return 1; }

49code source du programme apx2nubes

return 0;}

double donneesEXIF::getFocale(){ // // Lecture de l’adresse de IFD0 (0th IFD) // m_fichier.seekg(m_debutEXIF+4, std::ios::beg); unsigned int offsetIFD0(0); m_fichier.read((char *)&offsetIFD0, 4); offsetIFD0 = donneesEXIF::m_revertEndian(offsetIFD0); unsigned int debutIFD0(0); debutIFD0 = m_debutEXIF+offsetIFD0;

// // Placement au debut de IFD0 // m_fichier.seekg(debutIFD0); unsigned short nbEntreesIFD0; m_fichier.read((char *)&nbEntreesIFD0, 2); nbEntreesIFD0 = donneesEXIF::m_revertEndian(nbEntreesIFD0);

// // Lecture des donnees // unsigned int debutExifIFD; for (int i=1; i<=nbEntreesIFD0; i++) { unsigned short tag; unsigned short format; unsigned int numOfComponents; unsigned int data; m_fichier.read((char *)&tag, 2); tag = donneesEXIF::m_revertEndian(tag); m_fichier.read((char *)&format, 2); format = donneesEXIF::m_revertEndian(format); m_fichier.read((char *)&numOfComponents, 4); numOfComponents = donneesEXIF::m_revertEndian(numOfComponents); m_fichier.read((char *)&data, 4); data = donneesEXIF::m_revertEndian(data); if(tag==0x8769) // On teste la presence d’un SubIFD dans lequel la fo-cale est stockee { debutExifIFD = m_debutEXIF+data; } }

// Lecture de l’offset du prochain IFD (si 0x00000000 il n’y en a plus) // unsigned long nextIFDOffset; // fichier.read((char *)&nextIFDOffset, 4);

// // Placement au debut de ExifIFD // m_fichier.seekg(debutExifIFD); unsigned int nbEntreesExifIFD; m_fichier.read((char *)&nbEntreesExifIFD, 2); nbEntreesExifIFD = donneesEXIF::m_revertEndian(nbEntreesExifIFD);

50code source du programme apx2nubes

// // Lecture des donnees // for (int i=1; i<=nbEntreesExifIFD; i++) { unsigned short tag; unsigned short format; unsigned int numOfComponents; unsigned int data; m_fichier.read((char *)&tag, 2); tag = donneesEXIF::m_revertEndian(tag); m_fichier.read((char *)&format, 2); format = donneesEXIF::m_revertEndian(format); m_fichier.read((char *)&numOfComponents, 4); numOfComponents = donneesEXIF::m_revertEndian(numOfComponents); m_fichier.read((char *)&data, 4); data = donneesEXIF::m_revertEndian(data); if(tag==0x920a) // On teste la presence d’un SubIFD dans lequel la fo-cale est stockee { unsigned int offsetFocale; // Offset ou la focale est stockee, car elle est stockee sur plus de 4 octets (8 octets) offsetFocale = data; m_fichier.seekg(m_debutEXIF+offsetFocale); break; } }

// // Lecture de la focale // unsigned long num, den; double focale; m_fichier.read((char *)&num, 4); num = donneesEXIF::m_revertEndian(num); m_fichier.read((char *)&den, 4); den = donneesEXIF::m_revertEndian(den); focale = num/den; return focale;}

std::string donneesEXIF::getDateTime(){ // // Lecture de l’adresse de IFD0 (0th IFD) // m_fichier.seekg(m_debutEXIF+4, std::ios::beg); unsigned int offsetIFD0(0); m_fichier.read((char *)&offsetIFD0, 4); offsetIFD0 = donneesEXIF::m_revertEndian(offsetIFD0); unsigned int debutIFD0(0); debutIFD0 = m_debutEXIF+offsetIFD0; // // Placement au debut de IFD0 // m_fichier.seekg(debutIFD0);

51code source du programme apx2nubes

unsigned short nbEntreesIFD0; m_fichier.read((char *)&nbEntreesIFD0, 2); nbEntreesIFD0 = donneesEXIF::m_revertEndian(nbEntreesIFD0);

// // Lecture des donnees // unsigned int debutExifIFD; for (int i=1; i<=nbEntreesIFD0; i++) { unsigned short tag; unsigned short format; unsigned int numOfComponents; unsigned int data; m_fichier.read((char *)&tag, 2); tag = donneesEXIF::m_revertEndian(tag); m_fichier.read((char *)&format, 2); format = donneesEXIF::m_revertEndian(format); m_fichier.read((char *)&numOfComponents, 4); numOfComponents = donneesEXIF::m_revertEndian(numOfComponents); m_fichier.read((char *)&data, 4); data = donneesEXIF::m_revertEndian(data); if(tag==0x8769) // On teste la presence d’un SubIFD dans lequel la fo-cale est stockee { debutExifIFD = m_debutEXIF+data; } }

// Lecture de l’offset du prochain IFD (si 0x00000000 il n’y en a plus) // unsigned long nextIFDOffset; // fichier.read((char *)&nextIFDOffset, 4);

// // Placement au debut de ExifIFD // m_fichier.seekg(debutExifIFD); unsigned int nbEntreesExifIFD; m_fichier.read((char *)&nbEntreesExifIFD, 2); nbEntreesExifIFD = donneesEXIF::m_revertEndian(nbEntreesExifIFD);

// // Lecture des donnees // for (int i=1; i<=nbEntreesExifIFD; i++) { unsigned short tag; unsigned short format; unsigned int numOfComponents; unsigned int data; m_fichier.read((char *)&tag, 2); tag = donneesEXIF::m_revertEndian(tag); m_fichier.read((char *)&format, 2); format = donneesEXIF::m_revertEndian(format); m_fichier.read((char *)&numOfComponents, 4); numOfComponents = donneesEXIF::m_revertEndian(numOfComponents); m_fichier.read((char *)&data, 4); data = donneesEXIF::m_revertEndian(data); if(tag==0x9003) // On teste la presence d’un SubIFD dans lequel la date

52code source du programme apx2nubes

est stockee { unsigned int offsetDate; // Offset ou la date est stockee, car elle est stockee sur plus de 4 octets offsetDate = data; m_fichier.seekg(m_debutEXIF+offsetDate); break; } }

// // Lecture de la date // std::string date; unsigned char charASCII; m_fichier.read((char *)&charASCII, 1); date = charASCII; for (int i=2; i<=10; i++) { m_fichier.read((char *)&charASCII, 1); date += charASCII; }

return date;}

void donneesEXIF::fermeture(){ m_fichier.close();}

donneesEXIF::~donneesEXIF(){}

53code source du programme apx2nubes

54

Annexe 3code source du projet comp3d2nubes

/****************************************************************************** * * File : fichierNEW.h * Date : 9 septembre 2011 * Project: ASCBarycenter * Purpose: Lecture des fichiesr .NEW * Author: Maxime SEGUIN * ******************************************************************************/

#ifndef FICHIERNEW_H#define FICHIERNEW_H

#include <iostream>#include <fstream>#include <string>#include <sstream>#include <vector>

struct ligneNEW{ int code; std::string nom; double x, y, z; // Ecarts types a priori double etapXY, etapZ;};

class fichierNEW{ public:

fichierNEW(); ~fichierNEW();

// Lecture du fichier bool lectureFichier(std::string nomFichier);

// Renvoie le nombre de points int getNbPoints();

// Renvoie le code int getCode(std::string nomPoint);

// Renvoie les ecarts types a priori std::vector<double> getEtap(std::string nomPoint);

// Renvoie les coordonnees du point std::vector<double> getCoord(std::string nomPoint);

// Renvoie la ligne complete ligneNEW getLigne(std::string nomPoint);

// Renvoie toutes les donnees std::vector<ligneNEW> getDonnees();

// Teste l’existence d’un point bool testPoint(std::string nomPoint);

private:

std::ifstream m_fichier; std::stringstream m_fichierBuffer;

// Vector contenant les donnees std::vector<ligneNEW> m_donnees;};

#endif

55code source du projet comp3d2nubes

/****************************************************************************** * * File : fichierNEW.cpp * Date : 9 septembre 2011 * Project: ASCBarycenter * Purpose: Lecture des fichiesr .NEW * Author: Maxime SEGUIN * ******************************************************************************/

#include «fichierNEW.h»

fichierNEW::fichierNEW(){}

bool fichierNEW::lectureFichier(std::string nomFichier){ // Ouverture du fichier m_fichier.open(nomFichier.c_str(), std::ios::in);

// Test du bon deroulement de l’ouverture if(!m_fichier.good()) { return 1; } else { // Création d’un buffer et fermeture du fichier m_fichierBuffer<<m_fichier.rdbuf(); m_fichier.close();

// Stockage des données dans un vector de ligneOBS while(!m_fichierBuffer.eof()) { std::string gligne; std::getline(m_fichierBuffer, gligne); std::stringstream ligne; ligne<<gligne; ligneNEW ligneTemp; ligne>>ligneTemp.code; ligne>>ligneTemp.nom; ligne>>ligneTemp.x; ligne>>ligneTemp.y; ligne>>ligneTemp.z; ligne>>ligneTemp.etapXY; ligne>>ligneTemp.etapZ;

m_donnees.push_back(ligneTemp); } }

return 0;}

// Renvoie la ligne completeligneNEW fichierNEW::getLigne(std::string nomPoint)

56code source du projet comp3d2nubes

{ for(size_t i=0, taille=m_donnees.size(); i<taille; i++) { ligneNEW valTest(m_donnees[i]); if(valTest.nom.compare(nomPoint)) { return valTest; } }}

// Renvoie les coordonnees du pointstd::vector<double> fichierNEW::getCoord(std::string nomPoint){ for(size_t i=0, taille=m_donnees.size(); i<taille; i++) { ligneNEW valTest(m_donnees[i]); if(valTest.nom.compare(nomPoint)) { std::vector<double> resultat; resultat.push_back(valTest.x); resultat.push_back(valTest.y); resultat.push_back(valTest.z); return resultat; } }}

// Renvoie les ecarts types a prioristd::vector<double> fichierNEW::getEtap(std::string nomPoint){ for(size_t i=0, taille=m_donnees.size(); i<taille; i++) { ligneNEW valTest(m_donnees[i]); if(valTest.nom.compare(nomPoint)) { std::vector<double> resultat; resultat.push_back(valTest.etapXY); resultat.push_back(valTest.etapZ); return resultat; } }}

// Renvoie le codeint fichierNEW::getCode(std::string nomPoint){ for(size_t i=0, taille=m_donnees.size(); i<taille; i++) { ligneNEW valTest(m_donnees[i]); if(valTest.nom.compare(nomPoint)) { return valTest.code; } }}

57code source du projet comp3d2nubes

// Renvoie le nombre de pointsint fichierNEW::getNbPoints(){ return m_donnees.size();}

// Renvoie toutes les donneesstd::vector<ligneNEW> fichierNEW::getDonnees(){ return m_donnees;}

// Teste l’existence d’un pointbool fichierNEW::testPoint(std::string nomPoint){ bool test(false); for(size_t i=0, taille=m_donnees.size(); i<taille; i++) { ligneNEW valTest(m_donnees[i]); if(valTest.nom.compare(nomPoint)) { test=true; } } return test;}

fichierNEW::~fichierNEW(){}

58code source du projet comp3d2nubes

/****************************************************************************** * * File : fichierOBS.h * Date : 9 septembre 2011 * Project: ASCBarycenter * Purpose: Lecture des fichiesr .OBS * Author: Maxime SEGUIN * ******************************************************************************/

#ifndef FICHIEROBS_H#define FICHIEROBS_H

#include <iostream>#include <fstream>#include <string>#include <sstream>#include <vector>

struct ligneTopo{ int code; std::string station, cible; double mesure; double precision1, precision2; double hStation, hVoyant;};

struct ligneImage{ int code; std::string station; std::string fichier;};

struct ligneLaser{ int code; std::string station; std::string fichier; bool verticalisee;};

struct visee{ std::string station, cible;};

class fichierOBS{ public:

fichierOBS(); ~fichierOBS();

bool lectureFichier(std::string nomFichier);

// Renvoie un vector des couples Stations/Cibles std::vector<visee> viseesTopo();

59code source du projet comp3d2nubes

// Renvoie un vector des cibles std::vector<std::string> ciblesTopo();

// Renvoie un vector des stations std::vector<std::string> stationsTopo();

// Inventaire du type de donnees std::vector<bool> typeDonnees();

// Retourne un vector de ligneTopo std::vector<ligneTopo> donneesTopo();

private:

std::ifstream m_fichier; std::stringstream m_fichierBuffer;

// Vector contenant les observations std::vector<ligneTopo> m_donneesTopo; std::vector<ligneImage> m_donneesImage; std::vector<ligneLaser> m_donneesLaser; std::vector<std::string> m_donneesExt;

};

#endif

60code source du projet comp3d2nubes

/****************************************************************************** * * File : fichierOBS.cpp * Date : 9 septembre 2011 * Project: ASCBarycenter * Purpose: Lecture des fichiesr .OBS * Author: Maxime SEGUIN * ******************************************************************************/

#include «fichierOBS.h»

fichierOBS::fichierOBS(){}

bool fichierOBS::lectureFichier(std::string nomFichier){ // Ouverture du fichier m_fichier.open(nomFichier.c_str(), std::ios::in);

// Test du bon deroulement de l’ouverture if(!m_fichier.good()) { return 1; } else { // Création d’un buffer et fermeture du fichier m_fichierBuffer<<m_fichier.rdbuf(); m_fichier.close();

// Stockage des données dans un vector de ligneOBS while(!m_fichierBuffer.eof()) { std::string gligne; std::getline(m_fichierBuffer, gligne); std::stringstream ligne; ligne<<gligne; ligneTopo ligneTemp; int intTest; std::string stringTest; ligne>>intTest; ligne.seekg(std::ios_base::beg); ligne>>stringTest; ligne.seekg(std::ios_base::beg);

if((intTest<=9 && intTest>=1) || (intTest>=-9 && intTest<=-1)) { // On compte le nombre d’elements pour savoir si on a une ou deux precisions int nbElements(0); while(!ligne.eof()) { std::string poubelle; ligne>>poubelle; nbElements++; }

61code source du projet comp3d2nubes

ligne.seekg(std::ios_base::beg);

ligneTopo ligneTopoTemp; ligne>>ligneTopoTemp.code; ligne>>ligneTopoTemp.station; ligne>>ligneTopoTemp.cible; ligne>>ligneTopoTemp.mesure; ligne>>ligneTopoTemp.precision1; if(nbElements==8) { ligne>>ligneTopoTemp.precision2; } else { ligneTopoTemp.precision2=0; } ligne>>ligneTopoTemp.hStation; ligne>>ligneTopoTemp.hVoyant; ligne.setstate(std::ios::eofbit);

m_donneesTopo.push_back(ligneTemp); } if(intTest==10 || intTest==-10) { ligneImage ligneImgTemp; ligne>>ligneImgTemp.code; ligne>>ligneImgTemp.station; ligne>>ligneImgTemp.fichier; // Suppression du @ ligneImgTemp.fichier.erase(0,1); ligne.setstate(std::ios::eofbit);

m_donneesImage.push_back(ligneImgTemp); } if(intTest==11 || intTest==-11) { ligneLaser ligneLasTemp; ligne>>ligneLasTemp.code; ligne>>ligneLasTemp.station; ligne>>ligneLasTemp.fichier; // Suppression du @ ligneLasTemp.fichier.erase(0,1); if(ligne.eof()) { ligneLasTemp.verticalisee=0; } else { ligne>>ligneLasTemp.verticalisee; } ligne.setstate(std::ios::eofbit);

m_donneesLaser.push_back(ligneLasTemp); } else { if(stringTest.at(0)==’@’) { ligne.setstate(std::ios::eofbit);

62code source du projet comp3d2nubes

m_donneesExt.push_back(stringTest.erase(0,1)); } else { ligne.setstate(std::ios::eofbit); } } } }

return 0;}

std::vector<bool> fichierOBS::typeDonnees(){ std::vector<bool> resultat(4);

if(m_donneesTopo.size()>=0) { resultat[1]=true; } else { resultat[1]=false; } if(m_donneesImage.size()>=0) { resultat[2]=true; } else { resultat[2]=false; } if(m_donneesLaser.size()>=0) { resultat[3]=true; } else { resultat[3]=false; } if(m_donneesExt.size()>=0) { resultat[4]=true; } else { resultat[4]=false; }

return resultat;}

std::vector<visee> fichierOBS::viseesTopo(){ std::vector<visee> resultat;

for(size_t i=0, taille=m_donneesTopo.size(); i<taille; i++)

63code source du projet comp3d2nubes

{ ligneTopo valTemp; valTemp = m_donneesTopo[i]; visee viseeTemp; viseeTemp.station=valTemp.station; viseeTemp.cible=valTemp.cible;

// On initialise le vector resultat avec la premiere valeur if(resultat.size()==0) { resultat.push_back(viseeTemp); } else { // On verifie l’absence de doublon avant d’ajouter une nouvelle visee int doublon(0); size_t j(0); while(j<resultat.size()) { visee valTest; valTest = resultat[j];

if(viseeTemp.station.compare(valTest.station)==0 && viseeTemp.cible.compare(valTest.cible)==0) { doublon=1; j++; } else { j++; } }

// Si absence de doublon, on ajoute le couple station/visee if(doublon==0) { resultat.push_back(viseeTemp); } }

}

return resultat;}

std::vector<std::string> fichierOBS::ciblesTopo(){ std::vector<std::string> resultat;

for(size_t i=0, taille=m_donneesTopo.size(); i<taille; i++) { ligneTopo valTemp; valTemp = m_donneesTopo[i]; std::string cibleTemp; cibleTemp=valTemp.cible;

// On initialise le vector resultat avec la premiere valeur if(resultat.size()==0)

64code source du projet comp3d2nubes

{ resultat.push_back(cibleTemp); } else { // On verifie l’absence de doublon avant d’ajouter une nouvelle visee int doublon(0); size_t j(0); while(j<resultat.size()) { std::string valTest; valTest = resultat[j];

if(cibleTemp.compare(valTest)==0) { doublon=1; j++; } else { j++; } }

// Si absence de doublon, on ajoute le couple station/visee if(doublon==0) { resultat.push_back(cibleTemp); } }

}

return resultat;}

std::vector<std::string> fichierOBS::stationsTopo(){ std::vector<std::string> resultat;

for(size_t i=0, taille=m_donneesTopo.size(); i<taille; i++) { ligneTopo valTemp; valTemp = m_donneesTopo[i]; std::string stationTemp; stationTemp=valTemp.station;

// On initialise le vector resultat avec la premiere valeur if(resultat.size()==0) { resultat.push_back(stationTemp); } else { // On verifie l’absence de doublon avant d’ajouter une nouvelle visee int doublon(0); size_t j(0); while(j<resultat.size()) {

65code source du projet comp3d2nubes

std::string valTest; valTest = resultat[j];

if(stationTemp.compare(valTest)==0) { doublon=1; j++; } else { j++; } }

// Si absence de doublon, on ajoute le couple station/visee if(doublon==0) { resultat.push_back(stationTemp); } }

}

return resultat;}

std::vector<ligneTopo> fichierOBS::donneesTopo(){ return m_donneesTopo;}

fichierOBS::~fichierOBS(){}

66code source du projet comp3d2nubes

67

Annexe 4Protocole d’intégration des données lasergrammétriques

on fait l’hypothèse que les nuages sont géoréférencés.

Passer directement à l’étape 2 si les fichiers points sont disponibles au format ASCII colonné ou au format Standford .ply.

Etape 1 :

Ouvrir les fichiers de points au format constructeur avec Cumulus.enregistrer tous les nuages de points au format .neu (fig. 1).

Etape 2 :

ouvrir les nuages de points avec cloudcompare.Lors de l’ouverture de fichiers ASCII, renseigner les bons intitulés pour chaque colonne (fig. 2).

Sélectionner tous les nuages dans la fenêtre ‘DB Tree’ : Clic gauche + Ctrl (fig3).

Fusionner les nuages (fig4).

Fig. 1 - export au format .neu

Fig. 2 - Importation des fichiers ASCII

Fig. 3 - Selection des nuages dans la fenêtre DB Tree Fig. 4 - outils fusion

68Protocole d’intégration des données lasergrammétriques

Etape 3 :

nettoyer le nuage obtenu à l’aide de l’outil ‘Segment’ :

une nouvelle boîte de dialogue apparait en haut à gauche de la fenêtre principale.créer un contour en cliquant plusieurs fois avec le bouton gauche de la souris et fermer le contour par un clic droit.

Valider la sélection en cliquant sur ‘Segment Out’ :

Pour compléter la sélection appuyer sur ‘Pause’ : et renouveller l’opération. La nouvelle sélection s’ajoutera à la précedente.

terminer l’opération en cliquant sur ‘Confi rm’ :

une nouveau nuage apparaît dans la fenêtre ‘DB Tree’. il contient les points à supprimer.

Etape 4 :

Sous-échantillonner le nuage à l’aide de l’outil ‘Sub-Sample’ :

Sélectionner la méthode d’echantillonnage spatial ‘Space’ et indiquer l’espace maximum entre deux points du nuage (fi g. 5).

Etape 5 :

Faire le calcul de portion de ciel visible à l’aide du plugin ‘PCV ShadeVis’ :

cocher l’option ‘360° mode’ avant de lancer le calcul (fi g. 6).

Fig. 5 - Boîte de dialogue de la fonction de sous-échantillonnage

Fig. 6 - Boîte de dialogue du calcul de PcV

une fois le calcul terminé, remplacer la composante rgB originale par la composante rgB du calcul de portion de ciel visible (fi g. 7) et ne pas mixer avec les couleurs déjà existantes (fi g. 8).

69Protocole d’intégration des données lasergrammétriques

Fig. 7 - conversion du calcul de PcV en composantes rgB

Fig. 6 - option d’association avec les couleurs déjà existantes

Etape 6 :

Segmenter le nuage comme à l’étape 3 pour obtenir une décomposition du monument en entités. enregistrer chaque nuage obtenu au format .asc.

Etape 7 :

utiliser ASCCenterPivot pour obtenir les coordonnées du centre de la boîte englobante (fig. 7)

Fig. 7 - calcul du centre de la boîte englobante

70Protocole d’intégration des données lasergrammétriques

Etape 8 :

ouvrir le nuage de points au format .asc avec Virtools à l’aide du menu ‘Resources’ → ‘Import File‘ (fi g. 8).

Dans la partie inférieure de la fenêtre, développer l’arborescence ‘global’ et double-cliquer sur le nom du fi chier importé.un nouvel onglet ‘3D Points Cloud Setup‘ apparait. Dans le tableau ‘Attributes’, à la ligne ‘Colors’, cliquer sur le second ‘A’ barré par un croix rouge afi n d’activer la prise en charge la composante RGB (fi g. 9).

Fig. 8 - Importation d’un fi chier dans Virtools

Fig. 9 - activation de la composante rgB

71Protocole d’intégration des données lasergrammétriques

revenir dans l’onglet ‘Level Manager’, cliquer avec le bouton droit de la souris sur le nom du fichier importé et enregistrer le fichier au format .nmo (fig. 10).

Fig. 10 - enregistrement au format .nmo

Etape 9 :

on considère que l’utilisateur a un compte nubesVisum et que le Site et le Projet on déjà été créé. Si ce n’est pas le cas, se reporter au manule d’utilisation de nubesVisum.

Se connecter à nubesVisum : http://vinci.gamsau.archi.fr/htdocs_nubes/nuBeS/ouvrir le ‘Site’, dans notre cas : aigues Mortes puis un ‘Projet’ et cliquer sur ‘Composer en 3D’ (fig. 11).

revenir dans l’onglet ‘Projet’ et cliquer sur ‘Décomposition’.

Pour chaque entité (chaque nuage de points) on va créer une entité en lui donnant comme coordonnée, celle obtenue avec aSccenterPivot à l’étape 7.Attention : dans nubesVisum l’axe Y représente l’altitude et l’axe Z représente le nord. il faut donc inverser ces deux coordonnées lorsque l’on rentre des coordonnées dans nubesVisum.Le symbole [-] permet de supprimer une entité.

a ce stade, il peut être nécessaire de se déconnecter de nubesVisum (‘Fermer’ puis ‘Déconnecter’)et de réou-vrir le Projet pour que la mise à jour s’effectue.

Les entités créées apparaissent maintenant dans la fenêtre de visualisation. cliquer sur l’une d’entre elle et ajouter une représentation en cliquant sur le symbole [+] à droite de ‘Représentation’ (fig.12). On peut alors charger des nuages dèjà existants ou ‘Uploader une représentation’.

Une nouvelle fenêtre apparaît (fig. 13). Renseigner le type de représentation : ‘point’ et cliquer sur ‘valider’. Donner un nom à la représentation et renseigner le type de nuage : ‘nuage occlusion’. Préciser la résolution et sélectionner le fichier .nmo et éventuellement le fichier .asc.

72Protocole d’intégration des données lasergrammétriques

Fig. 11 - ouverture du projet Fig. 12 - entité sélectionnée

Fig. 13 - Upload du fichier .nmo

73Protocole d’intégration des données lasergrammétriques

74

Annexe 5Protocole d’intégration des données photogrammétriques

On considère que les aérotriangulations ont été calculées et que les fichiers images, le fichier .apx et le(s) fichier(s) .cam, sont tous situés dans le même répertoire.

L’utilisateur doit posséder un compte nubesVisum et un comptre MySqL avec des droits d’écriture sur la table ‘photo_temps’ de la base de données ‘nubesvisum’ et des droits en lecture sur l’ensemble de la base de donnée. il doit également posséder un accés SFtP en écriture au dossier ‘photographies’ de son projet, ici : ftp://vinci.gamsau.archi.fr/htdocs_nubes/NUBESbase/Aigues_Mortes/photographies/La demande doit être adressée à Pascal BeniStant : pascal.benistant@gamsau.map.archi.fr.

Etape 1 :

Placer l’exécutable apx2nubes.exe dans le dossier et le lancer à partir de la ligne de commande avec le nom du fichier .apx à traiter en argument (fig. 1).

L’exécutable peut avoir besoin des librairies suivantes pour fonctionner : libgcc_s_dw2-1.dll, libmysql.dll, libstdc++-6.dll, mingwm10.dll, qtcore4.dll, qtgui4.dll et qtSql4.dll. en cas de message d’erreur, placer ces librairies dans le même répertoire que l’exécutable.

Etape 2 :

entrer l’adresse du serveur MySqL : vinci.gamsau.archi.fr. il est possible d’entrer l’adresse d’un autre ser-veur, comme par exemple un serveur local pour effectuer des tests.Une fois la connexion établie, rentrer les identifiants pour s’authentifier.

Etape 3 :

S’identifier auprès du server NubesVisum. Les identifiants sont les mêmes que ceux utilisés pour se connec-ter à l’interface Web.

entrer le nom du projet en respectant la casse (majuscules et espaces) : aigues Mortes.

Etape 4 :

Pour chaque image les informations sont affichées à l’écran pour contrôle.créer les miniatures si nécessaire.enregistrer les informations dans la base de données si elles sont cohérentes.

Etapes 5 :

Se connecter à l’aide d’un client FtP au serveur ‘ftp://vinci.gamsau.archi.fr/htdocs_nubes/NUBESbase/Ai-gues_Mortes/photographies/’ et y déposer les fichiers images et les miniatures.

75

Annexe 6compiler qt 4.x avec le support MySqL

Etape 1 - Téléchargements :

Télécharger les fichiers et programmes suivants :• le SGBD MySQL : http://dev.mysql.com/downloads/installer/• les sources des librairies Qt : http://qt.nokia.com/downloads/• l’environnement GNU pour Windows, MinGW : http://sourceforge.net/projects/mingw/• des utilitaires nécessaires à MinGW : http://sourceforge.net/projects/mingw/files/MinGW/Utilities/mingw-utils/

Etape 2 - Installations :

• Installer MySQL dans le dossier ‘C:\MySQL’• Installer MinGW dans le dossier ‘C:\MinGW’• Décompresser mingw-utils dans le répertoire d’installation de MinGW• Ajouter le chemin ‘C:\MinGW\bin’ dans l’environnement Windows : clic droit sur ‘Poste de travail’ : ‘Proprié-tés’ : onglet ‘Avancé’ : ‘Variables d’environnement’ : ‘Variables systèmes’ : ‘Nouveau’.• Installer Qt

Etape 3 - Configuration de la librairie MySQL :

• Lancer ‘MinGW shell’• Aller dans le répertoire ‘C:\MySQL\lib\opt’ :cd /c/MySQL/lib/opt

• Executer ‘reimp.exe’ :reimp -d libmysql.lib

• Executer ‘dlltool.exe’ :dlltool -k --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a

• Quitter la console :exit

Etape 4 - Configuration de Qt :

• Ouvrir une nouvelle console : ‘MinGW shell’• Aller dans le répertoire de Qt :cd /c/Qt/4.x

• Taper ensuite :configure --help

On obtient les différentes options de configurations disponibles pour la compilation de Qt. Dans la liste, il y a une option ‘-plugin-sql-mysql’, c’est celle qui permet compiler qt avec le support de MySqL en plugin.

• Choisir les différentes options dans la liste et taper :configure -plugin-sql-mysql [autres_options]

• Ouvrir le fichier ‘C:\Qt\4.x\src\plugins\sqldrivers\mysql\mysql.pro’ avec un éditeur de texte et ajouter les lignes suivantes :INCLUDEPATH += C:\MySQL\include LIBS += -lC:\MySQL\lib\opt -lmysql

Etape 5 - Compilation de Qt :

• Lancer la commande :make

• Puis :make install

76compiler qt 4.x avec le support MySqL

77

Annexe 7compiler le plugin MySqL pour qt 4.x

Etape 1 - Téléchargements :

Télécharger les fichiers et programmes suivants :• le SGBD MySQL : http://dev.mysql.com/downloads/installer/• les sources des librairies Qt : http://qt.nokia.com/downloads/• l’environnement GNU pour Windows, MinGW : http://sourceforge.net/projects/mingw/• des utilitaires nécessaires à MinGW : http://sourceforge.net/projects/mingw/files/MinGW/Utilities/mingw-utils/

Etape 2 - Installations :

• Installer MySQL dans le dossier ‘C:\MySQL’• Installer MinGW dans le dossier ‘C:\MinGW’• Décompresser mingw-utils dans le répertoire d’installation de MinGW• Installer Qt

Etape 3 - Configuration de la librairie MySQL :

• Lancer ‘MinGW shell’• Aller dans le répertoire ‘C:\MySQL\lib\opt’ :cd /c/MySQL/lib/opt

• Executer ‘reimp.exe’ :reimp -d libmysql.lib

• Executer ‘dlltool.exe’ :dlltool -k -d libmysql.def -l libmysql.a

• Quitter la console :exit

Etape 4 - Compilation du plugin :

• Lancer ‘MinGW shell’• Aller dans le répertoire ‘C:\MySQL\lib\opt’ :cd /c/Qt/4.x/qt/src/plugins/sqldrivers/mysql

• Ouvrir le fichier ‘C:\Qt\4.x\src\plugins\sqldrivers\mysql\mysql.pro’ avec un éditeur de texte et ajouter les lignes suivantes :INCLUDEPATH += C:\MySQL\include LIBS += -lC:\MySQL\lib\opt -lmysql

• Compiler le plugin :makemake install

• Rechercher le fichier libmysql.dll à l’aide de l’outil de recherche de Windows et le copier dans ‘C:\Qt\4.x\qt\bin\’

La gestion et l’exploitation des données photogrammétriques, lasergrammétiques et topographiques : le cas d’Aigues-Mortes

Ce mémoire de fin d’études s’est déroulé au sein de la Direction régionale des affaires culturelles du Languedoc-roussillon, du centre des Monuments nationaux aux tours et remparts d’aigues-Mortes et au laboratoire MaP-gaMSau. L’objet de l’étude concerne l’ensemble des données topographiques, lasergrammétriques et photogrammétriques, acquises depuis 2009 par l’enSg, sur le site des remparts d’aigues-Mortes. au terme de trois années, la totalité de l’enceinte a été numérisée.ces acquisitions ont produit une masse importante de données. certaines ont fait l’objet d’un traitement permettant leur exploitation et leur géoréférencement, mais la plupart sont restées en l’état. Les partenaires du projet sont maintenant dans l’attente de données exploitables et d’outils dont la prise en main ne nécessite pas un haut niveau de technicité.

Aigues-Mortes

La commune d’aigues-Mortes est située à l’extrême sud-est du département du gard et donne directement sur la mer méditerranée. La ville d’aigues-Mortes a été fondée par Louis ix afin de servir de port de commerce. L’enceinte a été hérigée sous le reigne de Philippe iii le hardi et Philippe iV le Bel. Les remparts font 1640 métres et sont très bien conservés. La construction débute en 1240 après que Louis ix ait récupéré les terres à l’abbaye de Psalmodi. une première tour est construite : la tour de constance. La construction des remparts débutera seulement après la mort de Philippe iii le hardi, en 1274, c’est à dire plus de trente ans après la pose de la première pierre de la tour de constance. c’est seulement au tout début du xiVe siècle que les travaux s’achèvent.L’ampleur de la tâche explique la durée des travaux. Les courtines font environ 11 mètres de haut pour 3 mètres de large et les cinq tours, cinq petites portes et cinq grandes portes ont une hauteur moyenne de 18 mètres. ceci n’estd’ailleurs que la partie visible du travail.Bien que la fonction première de l’enceinte soit militaire, elle a reçu énormément d’éléments décoratifs. quasiment toutes les clefs de voûtes,

Maxime SeguinMastère Spécialisé Photogrammétrie, Positionnement et Mesure de Déformations

les culots et les gargouilles sont ajourées.

Données acquises

Les données acquises sont mutliples. Du point de vue des observations gPS, en plus des résultats de calculs, on dipose des fiches descriptives, des photos et des croquis des points d’appuis.Du point de vue de la topographie dite ‘classique’, on dispose des résultats de la composation effectuée à l’aide du logiciel comp3D. on retrouve aussi les fiches descriptives des points stationnés et les croquis.Pour la lasergrammétrie, en plus des fichiers bruts au format constructeur, on dispose d’exports au format cumulus et de fiches signalétiques pour les points de liaison entre les nuages.La photogrammétrie a produit des clichés numériques au format RAW et JPEG, des fiches descriptives de points naturels mesurés, des résultats d’aérotriangulations, des tableaux d’assemblage et des orthophotographies.

Produits livrés

L’ensemble de ces données ont permis de fournir un certain nombres de produits aux archéologues, aux gestionnaires du site et aux personnes en charge du dossier à la Drac de Montpellier. ces produits sont les suivants : orthophotographies, coupes, nuages de points au format cumulus et assemblages de clichés aériens. ces produits sont, pour la plupart, restés sous-exploités, voir même inexploités. Les raisons sont multiples et touchent à des aspects techniques, matériels et humains.Les personnes auxquelles sont destinés les produits, n’ont pas le temps, pas les moyens et parfois pas l’envie de se former à de nouveaux logiciels. Pour certaines d’entre elles, l’utilisation de cumulus nécessite la migration sous le système d’exploitation Windows, alors qu’elles travaillent depuis toujours sous MacoS. La nécessité de se former à un logiciel destiné à des professionnels implique de maîtriser un

certain nombre de concepts qui restent obscurs et déconnectés de la réalité de ces utilisateurs finaux.Les moyens matériels informatiques ne permettent parfois, tout simplement pas d’exploiter les données ; que ce soit les nuages de points ou les images.Les coupes, les orthophotographies et les plans fournis sont quelquefois inadaptés pour répondre aux questions posées par les chercheurs (repérage impossible des marques de tacherons sur les orthophotographies, etc...).

Données existantes

un des besoins des commanditaire est par pouvoir croiser les données acquises par l’enSg avec les données déjà existantes sur le monument. ces dernières sont assez disparates et sont enregistrées sur des médiasdivers (archives papier, bases de données informatiques, etc...).

une monographie, en deux tomes, produit de l’inventaire général des monuments et des richesses artistiques de la France, recense l’ensemble de la documentation disponible sur le monument : les sources manuscrites, sources imprimées, travaux historiques, cotes d’archives, relevés, dessins, lithographies, gravures, photographies anciennes et maquettes, références aux ouvrages généraux. L’ouvrage comporte également une synthèse géographique et historique, un inventaire topographique et des observations générales.L’ensemble des clichés et des documents qui ont donné lieu à cette publication sont actuellement conservés au centre de Documentation du Patrimoine régional. ils n’ont pas fait l’objet d’une opération de numérisation.

L’inventaire général a également créé des bases de données informatiques consultables en ligne. elles sont au nombre de quatre :

• La base Architecture-Mérimée recense le patrimoine monumental. elle comprend 200000 notices. environ 35000 sont illustrées.• La base Mobilier-Palissy recense les objets mobilier. elle contient environ 280000 notices, dont près de 25000 sont illustrées. • La base Image-Mémoire est un catalogue d’images provenant de photographies, gravures, plans, dessins et autres documents graphiques. elle comprend 600000 notices.• La base Vocabulaire-Thésaurus définit les termes utiles à la désignation des oeuvres architecturales et mobilières. elle permet à tous de disposer d’un vocabulaire normalisé.

elle comprend 1135 défintions pour les oeuvres architecturales et 2529 défintions pour les oeuvres mobilières.

Les archives du centre régional des Monuments historiques comportent un certain nombre de documents qui ne sont pas encore numérisés. Seul les cartes et les plans, sont en cours de numérisation et devraient être ajoutés à la base de donnée de l’inventaire général. Pour la seule commune d’aigues-Mortes, ces documents sont au nombre d’une centaine.

Les archives du Service régional de l’archéologie contiennent les rapports de diagnostic et de fouille. Pour la commune d’aigues-Mortes, un rapport de diagnostic et un rapport de campagne de révision de monuments historiques et de sites archéologiques sont disponibles. actuellement, les plans numériques géoréférencés des opérations de fouille et de diagnostic sont également rendus au Sra pour être intégrés dans un système d’information patrimonial, nommé Patriarche. Les opérations effectuées à aigues-Mortes n’étaient pas intégrées dans ce dispositif à l’époque où elles ont été menées.

Etat de l’art

actuellement aucun système n’est capable d’intégrer au travers d’une même interface, les données : topographiques, lasergrammétriques, photogrammétriques, iconographiques et documentaires. cependant, le système nubes développé par le MaP-gaMSau serait probablement à même de remplir ces objectifs. en effet, ce système permet de visualiser et d’interagir avec des nuages de points, de géoréférencer et d’afficher des images numériques et d’associer des documents ou des liens hypertextes à des entités 3D.c’est donc ce système de gestion qui a été choisi comme solution d’intégration des données collectées à aigues-Mortes.

Nubes

L’application permet la consultation et l’édition des données d’un monument, à partir d’un site internet écrit en PhP. Les données sont stockées dans la base MySqL et sur des emplacements serveur. La scène 3D interactive est générée grâce au module Virtools.

nubes interprète un monument comme un ensemble d’entités architecturales appartenant à des groupes. Ces entités doivent être définies et conceptualisées par l’utilisateur en fonction de ses attentes et de ses besoins. Les remparts d’aigues-Mortes peuvent se découper en 32 groupes constitués des 6 tours, 10 ouvrages d’entrée et 16 courtines. chaque ouvrage d’entrée peut ensuite être décomposé. La Porte de la reine peut, par exemple, être décomposée en trois entités : deux tours et une porte.au delà de l’aspect conceptuel, ces décompositions en entités sont directement liées à le segmentation des nuages de points. a chaque entité sont associés trois densités de nuage de points, mais une seule peut être affi chée à la fois.L’utilisateur va pouvoir ainsi charger les portions de l’édifice qui l’intéressent, à des résolutions variables. L’architecture du système nubesVisum est basée sur le modèle client-serveur. Les nuages sont donc téléchargés sur la machine de l’utilisateur. il est alors inconcevable de s’affranchir de la segmentation d’un monument comme celui d’aigues-Mortes. Si on s’intéresse à une partie spécifique du monument, on pourra charger la géométrie générale de l’édifice à moyenne densité et charger les détails architecturaux à haute densité.

Intégration des données

Les données lasergrammétriques sont traitées en plusieurs étapes. Les nuages sont d’abord assemblés et géoréférencés avec les logiciels des constructeurs de laser-scanner. ils peuvent ensuite être exportés au format aScii ou Stanford. il peuvent également être convertis à l’aide du logiciel cumulus. ensuite cloudcompare est utilisé pour les fusionner et les sous-échantillonner. il permet aussi d’effectuer un calcul de portion de ciel visible pour remplacer la radiométrie enregistrée par le laser-scanner. cette radiométrie est inexploitable étant donné sa qualité plus que médiocre. c’est aussi avec ce logiciel que les nuages sont segmentés en entités. ensuite les fichiers sont convertis au format .nmo de Virtools. ils peuvent alors être insérés dans NubesVisum par le biais de l’interface Web. un petit utilitaire a été développé pour calculer le centre de la boîte englobante du nuage de point. ceci permet d’éviter une conversion supplémentaire et l’utilisation d’autodesk Maya.

Les données photogrammétriques sont issues

des calculs d’aérotriangulations effectués par les logiciels redresseur et topaero. ces résultats sont enregistrés dans des fichiers au format .apx.Le logiciel apx2nubes permet de lire ces fichiers et d’en extraire les informations nécessaires au système nubesVisum. ce dernier permet de stocker et d’afficher des images géoréférencées dans la scène 3D. Le logiciel apx2nubes extrait également les informations des métadonnées EXIF dans les fichiers images. Il permet alors de compléter la base de données MySqL de nubesVisum et de créer les miniatures nécessaires à l’affichage de certaines pages de l’interface Web.

Les données topographiques sont pour le moment difficilement intégrables à NubesVisum. Pourtant les systèmes de graphes pourraient être utilisés pour afficher les visées entre stations. Pour l’instant la solution consiste à créer des repères dans le modèle 3D et de leur associer les fiches descriptives. Le développement d’une interface spécifique est en cours. Elle permettra à terme de gérer les fiches descriptives et les relations entre visées. ces informations sont présentes dans les fichiers .obs et .new créés par comp3D, le logiciel de compensation de réseaux géodésiques locaux utilisé par l’enSg.

Les données du centre des Monuments nationaux et du centre régional des Monuments historiques sont intégrables à nubesVisum seulement si elles ont été numérisées. L’accès au données en ligne de l’inventaire général se fait à l’aide de requêtes, via des urL. ces dernières sont lièes aux entités de nubesVisum. on a ainsi accès à ces données directement depuis la scène 3D.

Conclusion

La plateforme nubesVisum est une solution viable pour l’intégration de données hétérogènes. elle peut répondre au problème du stockage et de la diffusion des données acquises sur un monument.un certain nombre de fonctionnalités sont encore en cours de développement, mais le système permet d’ores et déjà de subvenir aux besoins des principaux acteurs du projet.il serait intéressant de mettre en place un système complet de gestion des données topographiques et d’offrir la possibilité d’exporter dans un format SVg ou DxF les coupes affichées dans l’interface Web.

Recommended