Étiquette : mashup

Exprimer simplement les métadonnées d’une page web avec RDFa

Comment exprimer des métadonnées d’une page web très simplement en utilisant la syntaxe RDFa ? Prenons exemple un billet de blog « propulsé » par WordPress. S’il existe des plugins pour cela, l’obsolescence de ces derniers peut rendre difficile leur maintien dans le temps. Autre solution, implémenter RDFa dans le code HTML du thème WordPress que l’on aura choisi. Pour ce que cela soit facile et « gérable » dans le temps, le plus simple et d’utiliser l’entête HTML <head> afin d’y placer des balises <meta> qui contiendront les métadonnées. Exprimer des métadonnées selon le modèle RDF via la syntaxe RDFa permet à des machines (principalement des moteurs de recherche) de mieux traiter l’information car elle devient plus explicite : pour une machine, une chaine de caractère peut être un titre ou un résumé, si vous ne lui dites pas que c’est un titre ou que c’est un résumé elle ne le devinera pas. A minima, il est donc possible d’utiliser les balises <meta> pour définir une structure RDF offrant la possibilité de structurer les métadonnées minimales par exemple avec le vocabulaire documentaire Dublin Core Element Set (plus connu en France sous appellation « Dublin Core simple »).

Comment faire ?

En premier, il faut indiquer dans le DOCTYPE de la page web, qu’elle va contenir des informations qui vont utiliser le modèle RDF, ainsi, le DOCTYPE sera :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">

Dans la balise <html>, nous allons indiquer les adresses des vocabulaires documentaires – par l’intermédiaire de namespace XML – qui vont nous servir à typer les informations, dans notre exemple, nous allons utiliser le Dublin Core simple et le Dublin Core Terms (DC Terms) :

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:dcterms="http://purl.org/dc/terms/">

Il serait possible, pour encoder plus d’information, d’utiliser plus de vocabulaires documentaires :

<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:dcterms="http://purl.org/dc/terms/" 
xmlns:skos="http://www.w3.org/2004/02/skos/core#" 
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
xmlns:foaf="http://xmlns.com/foaf/0.1/" 
xmlns:cc="http://creativecommons.org/ns#">

Ici, foaf nous servirait à encoder des informations relatives à une personne ou un objet décrit par les métadonnées, cc nous permettrait de signaler quelle licence creative commons s’appliquerait à ce contenu. Après avoir déclaré des les vocabulaires documentaires que nous allons utiliser, nous allons ajouter la structure RDFa au travers de balises <meta> dans l’entête <head> de la page HTML.

Dans un premier temps, à l’aide d’une balise <link>, nous allons définir l’objet numérique auquel les informations encodées en RDF seront rattachées :

<link rel="dc:identifier" href="http://monblog.com/monbillet.html" />

Cette balise définie donc un « conteneur » pour les informations que nous allons indiquer à l’aide des balises <meta>. Ce conteneur est identifié par une URI qui se trouve être là une URL, c’est à dire l’adresse de la page dans le web.

Maintenant, nous enchainons les balises <meta> qui définissent donc un ensemble de métadonnées, c’est à dire dans notre cas, des informations descriptives de la page web :

<meta property="dc:title" content="Le titre de mon billet" />
<meta property="dc:creator" content="Stéphane Pouyllau" />
<meta property="dcterms:created" content="2011-01-27" /> 
<meta property="dcterms:abstract" content="Un résumé descriptif du contenu de ma page" xml:lang="fr" /> 
<meta property="dc:subject" content="mot-clé 3" /> 
<meta property="dc:subject" content="mot-clé 2" /> 
<meta property="dc:type" content="billet" />
<meta property="dc:format" content="text/html" />
<meta property="dc:relation" content="Un lien vers une page web complémentaire" />

Il s’agit là d’un exemple minimal : un billet de blog utilisant le Dublin Core simple et peu descriptif sur le plan documentaire. Suivant la nature du contenu de la page web, il sera bien sur possible d’être plus précis, plus fin et plus complet dans les informations encodées. Le DC Terms permettra avec :

<meta property="dcterms:bibliographicCitation" content="Mettre ici une référence bibliographique" />

de proposer une forme pour une référence bibliographique dans le cas d’une page web décrivant un ouvrage par exemple. Il serait possible de passer l’ensemble du texte d’une page web à l’aide du vocabulaire SIOC en utilisant la propriété sioc:content. Il est possible également de relier des pages web entre elles (pour définir un corpus d’auteurs par exemple) en utilisant dans le vocabulaire DC Terms la propriété dcterms:isPartOf.

Il s’agit là d’un court billet présentant une façon très simple d’implémenter des métadonnées descriptives utilisant le formalisme RDF via une implémentation directe dans le code HTML, ce que l’on appelle le RDFa (« a » pour « in attributes« ). Cette implémentation, même minimale, permet d’être indexé par Isidore par exemple et d’indiquer des informations qui seront utilisées pour une meilleure indexation des données et qui pourront être ré-exposées dans la base de données RDF de ce dernier. La plateforme hypotheses.org (éditée par Open Edition) utilise cette implémentation d’RDFa. Pour cela, il faut simplement construire un sitemap (carte des liens du site web) au format xml pointant toutes les adresses URL des pages contenant du RDFa et que l’on souhaite voir indexer par Isidore.

Stéphane.

ChronoSIDORE : explorons les données d’ISIDORE avec SPARQL #2

ChronoSIDORE n’est pas le nom d’une nouvelle espèce de dinosaures, c’est le nom d’une application web qui utilise les ressources d’Isidore. ChronoSIDORE est donc un petit « mashup » que j’ai programmé pendant mes congés d’été. L’idée est double, poursuivre l’exploration concrète des possibilités d’un outil comme Isidore et donner des idées à d’autres personnes, en particulier dans le monde des bibliothèques et de la documentation, pour développer d’autres mashups s’appuyant soit sur l’API d’Isidore soit sur son SPARQL endpoint.

Que propose-t-il ?

ChronoSIDORE, accessible sur www.stephanepouyllau.org/labs/isidore/chronosidore, propose une autre façon de « voir » les ressources d’Isidore ; différente des vues traditionnelles en « pages de résultats » comme cela est le cas dans les bases de données bibliographiques ou catalogues. Ce mashup propose une vision des ressources en « tableau de bord » : il s’agit de projeter sur une frise chronologique un ensemble de ressources issues d’une ou de plusieurs requêtes SPARQL. Ainsi, une vision plus globale est proposée permettant une représentation différente de la répartition des ressources : dans notre cas, une mise en lumière de l’évolution disciplinaire des ressources fondée sur la catégorisation automatique effectuée par Isidore. ChronoSIDORE offre la possibilité de « voir » l’évolution chronologique des tendances disciplinaires pour un ensemble fini de ressources documentaires définit dans Isidore ou « source » : il peut s’agir des publications d’un laboratoire (à la condition qu’il possède une collection dans HALSHS), des articles d’une revue, des notices d’une base de données, des billets d’un carnet de recherche (voir la liste des sources dans l’annuaire d’Isidore). ChronoSIDORE propose deux types de requêtes SPARQL : l’une est orientée « sources » la seconde est orienté « auteurs » (permettant de projeter sur la frise les ressources d’un auteur). ChronoIsidore est un exemple de mashup possible, bien d’autres mashup sont possibles (autour des langues, des types de documents…).

Comment fonctionne-t-il ?

N’étant pas un développeur professionnel, j’ai fais avec mes connaissances en PHP, Xpath, SPARQL et Javascript pour développer. J’en profite pour remercier ici mes collègues Laurent Capelli, Shadia Kilouchi et Jean-Luc Minel qui m’ont aidé, en particulier sur SPARQL. Ainsi, je pense qu’une équipe de développeurs professionnels ferait beaucoup mieux, mais j’ai pensé aussi qu’il serait bien de montrer que l’ancien étudiant en histoire et archéologie du Moyen Age que je suis est capable d’exploiter avec un peu de PHP, les gisements de données enrichies proposés par Isidore, en espérant que cela donnera des idées à d’autres. J’en profite pour ré-affirmer ici le rôle et l’importance des ingénieurs en digital humanities dont les métiers sont multiples et qui interviennent à différents niveaux de technicité : Il faut des très grands spécialistes, érudits mais aussi des intermédiaires qui vont chercher la compétence à l’extérieur et l’adapte aux besoins SHS . On fait souvent le reproche aux ingénieurs du CNRS, surtout en digital humanities, de ré-inventer l’eau chaude, mais je pense qu’ils développent des outils, des méthodes qui sont adaptés à des publics présentant une multitude de rapports au numérique et différents niveaux d’appropriation et c’est très important. Il faut parfois avoir un outil imparfait, ou un démonstrateur fonctionnel pour offrir un service qui permettra à certains de profiter d’outils communs, fondés sur des standards ouverts et bien documentés et de « sauter le pas », ensuite on peut toujours améliorer les fonctionnalités. Je préfère cela à deux extrêmes : passer cinq ans à faire un outil qui ne fonctionnera jamais et qui sera dépassé avant de sortir (car nous n’avons que trop rarement les moyens de faire vite et bien) et dire qu’au prétexte que cela existe en ligne, il ne faut rien, s’en contenter, faire avec, et ne rien tenter car on n’égalera jamais les autres. Il s’agit parfois de faire juste « un pas de plus » pour ouvrir des données aux autres et savoir que ce « pas » est maitrisé, accompagné par des collègues du monde académique peut être plus sécurisant que de plonger de suite dans  jungle des outils en lignes et des « consultants » (même si, comme je l’ai dit, cela peut être nécessaire). J’aime bien l’idée que ChronoSIDORE donnera peut-être des idées à d’autres, nous en reparlerons au THATCamp Paris 2012 en septembre.

ChonoSIDORE réalise en fait plusieurs tâches :

  • Il interroge le triple store RDF d’Isidore : il s’agit d’une base de données RDF qui contient l’ensemble des informations d’Isidore formalisées en RDF et proposées selon les principes du linked data.
  • Il utilise pour cela le langage normalisé et international SPARQL (W3C) qui permet d’interroger les triplets RDF.
  • Il assemble les informations reçues du triple store sous la forme d’un flux de réponse Xml lisible avec l’application timeline créé dans le cadre du projet Simile du MIT (plutôt que refaire un système propre, j’ai préféré utiliser cet outil, même si je le trouve quelque peu rigide, il existe aussi d’autres systèmes : par exemple Timeline JS mais quelque peu différent).

Quelques limites

Il s’agit d’une version bêta, en fait un démonstrateur, donc il présente des limites. Deux sont à signaler :

  • Isidore catégorise automatiquement via un corpus de référence (HALSHS) et à l’aide de signatures sémantiques : cela peut donc générer des erreurs de catégorisation. Pour aller plus loin, voir les principes de catégorisation dans Isidore avec la vidéo de présentation des systèmes d’Isidore par Fabrice Lacroix, président d’Antidot, lors de l’université d’hiver du TGE Adonis à Valpré en décembre 2010 (ouverture d’Isidore).
  • Isidore ne catégorise pas toute les ressources qu’il moissonne : cela dépend de la richesse sémantique des métadonnées : plus les métadonnées moissonnée seront riches (description, résumé, mots-clés) plus la catégorisation proposée par Isidore sera pertinente et donc utilisable dans ChronoSIDORE. Donc toutes les ressources ne « montent » pas dans la frise chronologie.

Je vous invite donc à utiliser ChronoSIDORE, à le tester, à le faire « craquer » et si vous le souhaitez vous pouvez laisser un commentaire, des idées, des critiques…

Stéphane.

Explorons les données d’ISIDORE avec SPARQL #1

Depuis quelques semaines, j’ai pris la direction d’une unité mixte de service qui anime la très grande infrastructure de recherche Corpus-IR. Après Adonis et tout en poursuivant un peu l’animation d’Isidore, je reviens avec plaisir dans les corpus de données en SHS. Cela dit, l’avenir d’un projet tel qu’Isidore est très directement lié aux corpus et bases de données qui pourraient être indexés et annotés par Isidore. Les consortiums de Corpus-IR sont déjà au travail et proposeront des corpus de données prochainement. J’espère qu’ils seront structurés avec du RDF et voir même, pour les corpus diffusés sur le web, avec du RDFa.

Ayant donc un peu moins de temps pour écrire dans ce blog, je profite tout de même de quelques minutes pour vous inviter à explorer les possibilités du SPARQL endpoint d’Isidore en lançant ici une petite série de billets. Pour ouvrir la série, une requête permettant de lister les métadonnées des photos et images de MédiHAL géolocalisées sur territoire (je prends ici quelques photos de Djibouti) appartenant au référentiel géographique utilisé dans Isidore, Geonames.org :

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX dces: <http://purl.org/dc/elements/1.1/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

select ?id ?titre ?uri_pays 
?nom_auteur ?prenom_auteur ?coord_geo where { 
<http://www.rechercheisidore.fr/resource/10670/2.hlil75> ?p ?o. 
?o dcterms:identifier ?id. 
?o dcterms:title ?titre. 
?o dcterms:creator ?creator. 
?creator foaf:familyName ?nom_auteur. 
?creator foaf:givenName ?prenom_auteur. 
?o dcterms:coverage ?uri_pays. 
?o dces:coverage ?coord_geo 
FILTER (regex(?id, "10670") 
&& regex(?uri_pays, "223816") 
&& regex(?coord_geo, "[0-9]")) 
} LIMIT 500

En posant cette requête SPARQL dans l’interface d’interrogation SPARQL d’Isidore, il est possible de récupérer les métadonnées, en fait les informations contenues dans les métadonnées, sous la forme de triplets RDF. Ces triplets RDF, base du web de données, peuvent donc être redondant si l’information fait appel aux même étiquettes d’un même vocabulaire (cf ex. ci-dessous). Le résultat de la requête est présenté dans différents formats (RDF/XML ; HTML ; json…).

A partir de là, de nombreuses petites applications web sont possibles, elle sont souvent nommées « mashup » car elles marient, grâce au liant que permet l’utilisation d’URIs à base d’http, plusieurs informations présentes dans le web de données.

Variantes… avec les enrichissements proposés par Isidore et issus des différents traitements effectués :

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX dces: <http://purl.org/dc/elements/1.1/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

select ?id ?titre ?uri_pays ?uri_enrichissements_ISIDORE 
?nom_auteur ?prenom_auteur ?coord_geo where { 
<http://www.rechercheisidore.fr/resource/10670/2.hlil75> ?p ?o. 
?o dcterms:identifier ?id. 
?o dcterms:title ?titre.
?o dcterms:subject ?uri_enrichissements_ISIDORE.
?o dcterms:creator ?creator. 
?creator foaf:familyName ?nom_auteur. 
?creator foaf:givenName ?prenom_auteur. 
?o dcterms:coverage ?uri_pays. 
?o dces:coverage ?coord_geo 
FILTER (regex(?id, "10670") 
&& regex(?uri_pays, "223816") 
&& regex(?coord_geo, "[0-9]")) 
} LIMIT 500

Ou encore avec les mots-clés d’origine et les enrichissements :

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX dces: <http://purl.org/dc/elements/1.1/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

select ?id ?titre ?uri_pays ?mots_cles ?uri_enrichissements_ISIDORE 
?nom_auteur ?prenom_auteur ?coord_geo where { 
<http://www.rechercheisidore.fr/resource/10670/2.hlil75> ?p ?o. 
?o dcterms:identifier ?id. 
?o dcterms:title ?titre.
?o dces:subject ?mots_cles.
?o dcterms:subject ?uri_enrichissements_ISIDORE.
?o dcterms:creator ?creator. 
?creator foaf:familyName ?nom_auteur. 
?creator foaf:givenName ?prenom_auteur. 
?o dcterms:coverage ?uri_pays. 
?o dces:coverage ?coord_geo 
FILTER (regex(?id, "10670") 
&& regex(?uri_pays, "223816") 
&& regex(?coord_geo, "[0-9]")) 
} LIMIT 500

La « vue » des triplets RDF d’une ressource est bien sur directement possible :

SELECT ?graph ?predicat ?object WHERE { 
GRAPH ?graph { <http://www.rechercheisidore.fr/resource/10670/1.f2v6vz> ?predicat ?object. } 
}

Bon, je m’arrête là pour ce premier petit billet qui n’a pas d’autre vocation que de présenter des exemples de requêtes SPARQL sur des données SHS afin de mettre un peu l’eau à la bouche aux développeurs web du domaine qui pourraient ainsi avoir des idées de mashup pour leurs productions. La prochaine fois, je présenterai comment est formé de la requête.

Stéphane.

Ca, mais si souviens toi, c’était où déjà ? ou le geocaching scientifique

Pour noël, j’ai eu un GPS ! Ceux qui me connaissent me diront que n’ayant pas de voiture à Paris, ce n’est pas très utile. Et pourtant, si l’ont veut géo-référencer les photos de noël et le déballage des cadeaux par les enfants, cet outil devient très pratique, testons un peu…

D90+GP-1

J’ai donc un GPS pour mon D90 : il s’agit de l’unité GP-1, qui se place à la place du flash ou sur le coté. Pour info, dans le Nikon P.6000, un compact, le GPS est en standard.

Mes grands-parents, s’ils étaient en vie, diraient : « Mais que fait Stéphane, dans le jardin, avec un appareil photographique pointant vers le ciel ? » Au début, la première capture des satellites est un peu longue : plus de 5 s., c’est déjà embêtant si vous devez déclencher tout de suite… passons. En laissant l’appareil en veille, ça va mieux. Ensuite cela semble assez précis (même dans le jardin), l’altitude aussi (testé avec un bon vieil altimètre).

D90+GP-1

Clic-clac, les coordonnées et l’altitude sont bien capturées et incluses dans les méta-données EXIF de l’image. Avec Exiftool (et tous les outils qui tourne autour), par exemple, il est facile de voir et d’exporter ces valeurs de positionnement (extrait) dans ExiftoolGUI…

D90+GPS_1

De les sortir sous la forme d’un tableau HTML (voir plus bas)…

EXIF GPSVersionID 2.2.0.0
EXIF GPSLatitudeRef North
EXIF GPSLongitudeRef West
EXIF GPSAltitudeRef Above Sea Level
EXIF GPSTimeStamp 11:24:24
EXIF GPSSatellites 05
EXIF GPSMapDatum
EXIF GPSDateStamp 2008:12:25
Composite GPSAltitude 36 m Above Sea Level
Composite GPSDateTime 2008:12:25 11:24:24
Composite GPSLatitude 44 deg 45′ 15.21″ N
Composite GPSLongitude 0 deg 34′ 31.58″ W
Composite GPSPosition 44 deg 45′ 15.21″ N, 0 deg 34′ 31.58″ W
Composite SubSecDateTimeOriginal 2008:12:25 13:21:45.00

…Et bien entendu, il est très facile d’exploiter cela avec un outil cartographique en local, tel que l’excellent GeoSetter dont une version en français est disponible :

D90+GPS_2

D90+GPS_3
ou bien via l’outil carte de Flickr (là, rien à faire de particulier, les photos sont positionnées par défaut lors du chargement).

Tout cela peut aussi ce faire via son Firefox avec IExif, Dans la monde Google avec Picasa et Google Earth, etc.

Si le format EXIF vous pose un problème, il est possible de stocker ces données dans du MIX. C’est évidement plus complexe pour l’exploitation, du moins pour le grand public.

Extraire ce type de méta-données avec du Perl est très facile : le programme perl exiftool de Phil Harvey est très bien pour cela : une petit ligne du type « Exiftool -exif:GPSAltitude -h  img > mes_exifs.html » et l’on récupère l’altitude d’une série d’images dans un tableau HTML.

Avec du PHP c’est possible aussi : il faut charger les extensions php_mbstring et exif (dans cet ordre) dans le php.ini ; ensuite il est possible d’utiliser la fonction exif_read_data.

Bref, bientôt TOUS les appareils géo-tagueront en automatique et l’on ne comprendra pas pourquoi les photos anciennes ne le sont pas (les documentalistes vont avoir du travail) : ainsi les interfaces d’intérogations vont évoluer : un fond de carte, des outils de sélection (ronds, carrés, etc.), des plots de couleurs, des requêtes externes, des réponses aux questions qui s’afficheront sous la forme d’un chapelet de marqueurs. Au CN2SV, nous avons commencé à le faire des cartes et des atlas anciens, j’imagine ce que nous allons faire dans quelques années !

Capture d'écran de l'application CN2SV pour les géodonnées

Mais j’y pense… le temps d’écrire ce billet et tout cela doit déjà exister, j’en suis sûr (et en open-source ?). En attendant la suite, j’espère que les artistes vont trouver des applications moins « utiles » que celles décrites ici. Je m’en retourne à mon mash-up de noël.

Joyeuses fêtes,

Stéphane.

Frises chronologiques sur le web : utilisation de Timeline pour faire un mashup AJAX avec PHP et MySQL

Bonsoir,

Je profite d’un week-end loin de Paris et d’un long voyage en train pour décrire (mais avec beaucoup de retard) un petit mashup que j’ai réalisé pour le site @.ampère et l’histoire de l’électricité. L’idée de départ était de développer des chronologies avec l’outil Timeline mis au point par le MIT et que pas mal de développeurs connaissent et utilisent. Timeline permet de créer des frises chronologiques à l’image de celles encore présentes dans les livres scolaires d’histoire (nous avons tous rêvés devant ces frises en couleurs présentant l’histoire de l’Homme par exemple). C’est outil utilise des éléments en javascript et du XML : c’est donc un système basé sur AJAX. Dans le site @.ampère nous voulions faire une frise avec des éléments historiques différents le tout devant être synchronisé :

  • une sous-frise sur les grands personnages de l’histoire de l’électricité
  • une sous-frise sur les grandes découvertes de ce même domaine

Dans Timeline, les évènements (events) sont stockés dans un fichier XML très simple. Dans le but d’inclure Timeline dans le système d’information (SI) du site, nous avons utilisé deux tables MySQL pour mettre les données brutes (date, contenu de l’évènement, etc.). Un script PHP utilisant DOM réalise alors une présentation XML de ces données : en sortie, nous avons deux fichiers XML, un pour chaque sous-frise, qui sont normés suivant le schéma des fichier nécessaire au fonctionnement de Timeline. Nos deux tables MySQL sont indépendantes du système AJAX de Timeline : c’est PHP/DOM qui formate les données en XML suivant la grammaire Timeline. Nous avons d’ailleurs un autre programme PHP qui présente ces même données sous la forme d’une page web classique. Le schéma suivant en résume le modèle :

Modèle informatique de frise chronologique (site www.ampere.cnrs.fr)

Les deux fichiers XML sont stockés dans un répertoire du serveur et chargé dans l’application AJAX qui gère Timeline. Le XML resemble à ceci :

<?xml version="1.0" encoding="iso-8859-1"?><data>

<event start="Jan 00 1544 00:00:00 GMT" end="Jan 00 1603 00:00:00 GMT" 
image="AMP_1015.jpg" isDuration="true" title="William GILBERT">(1544-1603)</event><event start="Jan 00 1666 00:00:00 GMT" end="Jan 00 1736 00:00:00 GMT" 
isDuration="true" title="Stephen GRAY">(1666-1736)</event> ...
</data>

Pour le tout fonctionne, il nous a fallu ajouter un petit programme php de vérification de la forme des dates/heures histoire de ne pas avoir de bug dans l’une des deux sous-frises. Pour terminer nous avons ajouté, dans le fichier javascript de la frise (main.js) qui pilote l’affichage écran, les instructions suivantes :

bandInfos[1].eventPainter.setLayout(bandInfos[1].eventPainter.getLayout());

tl = Timeline.create(document.getElementById("my-timeline"), bandInfos, Timeline.HORIZONTAL);

Timeline.loadXML("kronos1.xml", function(xml, url) { eventSourceA.loadXML(xml, url); });

Timeline.loadXML("kronos2.xml", function(xml, url) { eventSourceB.loadXML(xml, url); });

Nous avons une « bandInfos » dans laquelle nous « chargeons » les deux fichier XML : kronos1.xml et kronos2.xml. Ce chargement est réalisé au sein des deux eventSource (A et B). Ce fichier, main.js, qui est un fichier javascript pur est chargé dans une page HTML (ou PHP dans notre cas) par l’utilisation d’une simple balise <script> dans l’entête. La frise « double » est ensuite affiché dans le code HTML via un « id » de balise <div> :

<div id="my-timeline" style="height:800px; width:100%;"></div>

Le tour est joué, nous avons une belle frise chronologique présentant de façon synoptique ces deux types d’évènements. Voici le résultat :

FriseChronoAmpere

Bonne fin de week-end,

Stéphane.

PS : Merci à Marie-Hélène Wronecki pour le travail sur la base de données MySQL.

KML simple et géodonnées (partie 1)

Il est possible de construire rapidement de petites applications simples permettant d’exploiter des documents issus d’archives visuelles (cartes, photos, plans) en les connectant a des données bibliographiques. Ces applications utilisent de plus en plus les langages du web (et, depuis 2005, ceux du web 2.0) et elles se développent autour d’XML. Voici une première partie/introduction au KML et le début d’un exemple avec le géo-référencement 2D de cartes anciennes via Google Maps, du KML et du XML.

Le KML (Keyhole Markup Language) est une grammaire XML permettant d’afficher et de gérer des données dans Google Maps et Earth. Il offre la possibilité de poser des points, tracer des lignes, des polygones. Dans Google Earth, s’y ajoute les angles de vue, les objets 3D simples ou texturés. Mais l’une des fonctionnalités les plus intéressante pour la recherche reste l’enrichissement en données externes. KML peut diffuser des données XHTML riches (textes, images, videos), des images plaquées sur la photo satellitaire, etc…

Il existe une version compressé du KML, le KMZ. Pour ceux qui ont utilisé comme moi du VRML (Virtual Reality Modeling Language), nous avions aussi une version « Gzipé » du langage : le .wrz (à la place du .wrl). le KMZ encapsule aussi les images qui peuvent être liées au fichier KML. Il est possible de fabriquer du KMZ avec un simple compresseur : WinZip, Gzip, etc.

Sur le plan syntaxique, le KML se présente comme du XML :

<?xml version= »1.0″ encoding= »UTF-8″?>
<kml xmlns= »http://earth.google.com/kml/2.2″>
<Placemark>
<name>Siège du CNRS</name>
<description>Paris, le siège du CNRS.</description>
<LookAt>
<longitude>2.264605600614077</longitude>
<latitude>48.84727288728012</latitude>
<altitude>0</altitude>
<range>171.6689944655567</range>
<tilt>-6.848248640637841e-011</tilt>
<heading>0.0004740658326556625</heading>
</LookAt>
<Point>
<coordinates>2.264605600614077,48.84727288728013,0</coordinates>
</Point>
</Placemark>
</kml>

Ce petit fichier KML permet de placer dans Google Earth ou Maps, un point localisé sur le siège du CNRS, l’élément <LookAt/> correspondant au point de vue de la caméra qui « regarde » ce point. <Placemark/> encapsule le <Point/> géocodé présentant la latitude et la longitude. Dans le monde Earth / Maps de Google, les coordonnées géographiques sont en degrés décimaux (comptés positivement vers le Nord pour la latitude, et vers l’Est pour la longitude). Ici, le géocodage est très précis (2.264605600614077), mais si vous utilisez l’API de Maps, la précision est de l’ordre du mètre. Autre limite, dans Google Maps, seuls certains éléments peuvent être utilisés : les points, les lignes, les polygones, les styles, les icônes et les liens et l’application de couches multiple (placage d’images), mise en œuvre de dossiers et types de vues. Pour le moment (version 2.2 du KML) la 3D n’est pas utilisée (nous sommes dans Maps, donc le royaume de la 2D).

Ce petit exemple, permet de ce lancer dans la construction de fichiers KML et ainsi enrichir en information de toutes sortes de cartes dans le vaste « bac à sable » que peut être Google Maps ou Earth. De nombreux scientifiques, les géographes principalement, utilisent déjà ce format. J’ai découvert aussi ce site qui présente Google Earth et le KML pour les enseignants du secondaire. Le KML n’est pas le seul format XML dans le domaine des « géo-formats/2D/3D » : il y a le WMS, WFS et GML venant du monde de la géographie, les formats pour « services web » : AtomPub, GeoRSS et le KML/Z (avec d’autres limites cependant).

Dans le cadre du CN2SV, nous avons publié l’inventaire d’un fonds de cartes topographiques anciennes (XIXe-XXe siècle) de la cartothèque du centre de documentation REGARDS-CNRS. Nous avons décidé de coupler ce fonds de cartes, après numérisation, avec une base de données bibliographique/documentaire classique. Pour cela, nous avons utilisé une base de données intermédiaire qui, à partir des données lat./long. des quatres angles d’une carte, a pour mission de stocker des données pour produire à la fois du KML (pour l’instant sous la forme de petit fichier, donc nous sommes en mode asynchrone) qui peut être utilisé dans Google Earth pour visualiser l’emprise de la carte, ces villes importantes, etc. Mais aussi du XML compatible avec l’API de Google Maps (qui est légèrement différent du KML natif, du moins dans sa version 2.2 ).

Dans un second temps, j’ai développé une petit programme PHP qui exploite ces fichiers XML (pour l’API…) dans un contexte l’application riche. Du KML simple, nous passons dans un micro format XML propre (mais nous pourrions faire cela avec du KML directement, c’est juste une histoire d’optimisation du fichier pour l’API de Google Maps), ainsi pour chacune des cartes nous avons ceci :

Capture d'écran de l'application CN2SV pour les géodonnées

 

<?xml version= »1.0″ encoding= »UTF-8″?>
<mygeod xmlns= »http://www.cn2sv.cnrs.fr/xml/mygeoc/0.1″>

<markers>
<marker lat= »-20.53105″ lng= »47.24332″ label= »Ville d’Ambositra » html= »Informations sur la ville d’Ambositra <br>avec la base de données REGARDS-ADES-CNRS » infolink= »query.php?value=Ambositra »/>
<marker lat= »-20.62105″ lng= »47.20332″ label= »Carte de Madagascar » html= »Informations sur la ville d’Ivato <br>avec la base de données REGARDS-ADES-CNRS » infolink= »query.php?value=Ivato+Madagascar »/>
<marker lat= »-19.871795326377995″ lng= »47.03521728515625″ label= »Carte de Madagascar » html= »Informations sur la ville d’Antsirabe <br>avec la base de données REGARDS-ADES-CNRS » infolink= »query.php?value=Antsirabe »/>
<marker lat= »-20.27137605095937″ lng= »44.31661605834961″ label= »Carte de Madagascar » html= »Une carte est disponible » infolink= »?id=R_MADA11_04_00014″/>
<line colour= »#ff0000″ width= »5″>
<point lat= »-19.40″ lng= »45.32″/>
<point lat= »-19.40″ lng= »48.11″/>
<point lat= »-21.20″ lng= »48.11″/>
<point lat= »-21.20″ lng= »45.32″/>
<point lat= »-19.40″ lng= »45.32″/>
</line>
<center lat= »-20.33″ lng= »46.90″ zoom= »8″/>
</markers>

</mygeod>

Ce fichier XML permet de délimiter la couverture de carte et de pointer des lieux (les « markers » de Google Maps). Les attributs sont très simples :

  • label : titre de la vignette/popup
  • html : contenu de la vignette/popup
  • lat : latitude
  • lng : longitude
  • zoom (pour <center/>) : facteur du zoom d’entrée dans la carte
  • infolink : lien vers le connecteur de/des bases de données à interroger (mais on pourrait imaginer une chose avec du xlink et xpointer si l’on veut rester dans le monde XML)

Il suffit d’utiliser de l’API de Google Map pour monter l’application. Mais cela sera pour le prochain billet…

Stéphane.

PS : Le format KML est relativement simple, mais un ouvrage de référence en français manque (à moins qu’il soit sous presse).

 

Fièrement propulsé par WordPress & Thème par Anders Norén