Archives de l’auteur : emmanuel

petiteReine, une visualisation des parkings vélo avec OpenStreetMap

Un besoin

En octobre 2014 a commencé une collaboration entre le Collectif cycliste 37 et Tour(s) plus pour répertorier les parkings vélo de plusieurs communes de l’agglomération tourangelle. Ceci répondait aux besoins des deux parties : la collectivité n’avait pas de bases de données de ces équipements et l’association cherchait à diagnostiquer les besoins en stationnement sur l’agglomération. Culture libre et créations collectives s’est associée à cette initiative, d’où ma propre implication.

Quatre jours de cartopartie ont permis d’identifier 859 parkings sur les communes de Tours et Joué-les-Tours, mais comment visualiser ces données dans un outil grand public sur la toile ? comment tirer du sens d’un nuage de points sur une carte ?

La carte cyclable du site openstreetmap.org présente des carrés bleus pour les parkings vélo, les parkings de grande capacité ont un marqueur différent (un C dans un carré, accompagné de la capacité). Ce rendu est très sommaire car il n’informe du nombre de places que pour une petite minorité de stationnement, qu’il ne différencie par les équipements ouverts au public de ceux qui sont privés, et qu’il affiche identiquement les arceaux et les pince-roues, quand bien même les cyclistes préfèrent largement les premiers aux seconds (pour des raisons de sécurité). Le service de calcul d’itinéraires Géovélo affiche lui aussi les parkings vélo sur la carte, aux niveaux de zooms les plus hauts, mais le but est de montrer une information complémentaire (des stationnements situés dans les environs) à des cyclistes qui viennent calculer un itinéraire.

J’ai donc décidé de développer une petite application qui permettrait la visualisation des parkings vélo, l’analyse des données et le contrôle qualité.

Voir la carte.

Consultation détaillée

Le premier objectif est d’afficher les parkings vélos avec toutes les informations utiles aux cyclistes, dans une info-bulle qui s’affiche quand on passe la souris. Chacune de ces informations vient d’un attribut des objets décrits dans OpenStreetMap

  • Quel est le type ? On a seulement trois types sur notre territoire, les arceaux, les pince-roues et les abris (clé bicycle_parking)
  • Combien de vélos peut-on garer ? (clé capacity)
  • Est-ce que l’emplacement est couvert ? (clé covered)
  • Le lieu est-il accessible au public ? réservé aux clients ou usagers ? ou bien privé ? (clé access)
  • Quand des restrictions d’accès s’appliquent, à qui appartient le stationnement (clé operator) ? Cela peut être une entreprise qui pose des emplacements pour ses salariés, ou un commerce qui fournit ce service à sa clientèle.

Analyse de données

L’application petiteReine est avant tout un outil d’analyse des données sur les parkings vélo, qui peut servir aux associations cyclistes, aux collectivés, aux citoyens. Elle permet la visualisation des parkings vélo et le diagnostic sur la couverture du territoire en stationnements.

L’analyse se fait selon trois dimensions.

L’espace (où sont les parkings ?)

La prise en compte de l’espace est centrale dans un outil cartographique. Il est pris en compte de différentes manières à différents niveaux :

  • À petite échelle, on peut voir la localisation la plus exacte possible des stationnements vélo
  • À une échelle plus grande, les parkings sont regroupés en grappes ; on peut voir l’étendue de chaque grappe en passant la souris sur le symbole circulaire
  • Au niveau des divisions administratives, on a la possibilité de filtrer les données par commune
  • On peut également constater la répartition physique des parkings vélo sur le territoire avec la couche « Couverture en parkings vélo », qui affiche en vert les zones bien couvertes en stationnements (à moins de 100 mètres d’un parking vélo), et montre des zones plus éloignées (jaune entre 100 et 200m , orange de 200 à 400m). Ceci permet notamment de mettre en avant les zones où la couverture est dense, et les zones blanches.
  • Au niveau d’un point quelconque de la carte, un clic permet de déterminer la distance à vol d’oiseau jusqu’au parking le plus proche

La quantité (est-ce qu’il y en a assez ?)

Afficher des points sur une carte permet de vérifier la présence ou l’absence de parkings à un endroit. Il est intéressant de connaitre le nombre de places, au niveau d’un parking, mais aussi à plus grande échelle. C’est pour cela que les regroupements de parkings affichent le nombre total de places dans la zone du regroupement.

Dans le bloc des statistiques, on reprend le nombre de parkings et de places au niveaux des communes actuellement affichées.

Au delà de la maille de la commune, on peut déterminer une zone (quartier, voie de circulation) dans laquelle, on fait un comptage des parkings et places de stationnement. Le tracé de zones peut se faire par rectangle ou par polygone.

La typologie des parkings

La consultation individuelle d’un parking vélo met avant tout en valeur son type parmi les trois types identifiés sur Tours : arceaux, pince-roue et abri

Les statistiques proposées par l’outil permettent de compter les stationnements et places disponibles sur une zone donnée, mais on s’intéresse également au type des parkings en affichant des sous-totaux par type.

Veiller à la qualité

Puisqu’on récupère l’ensemble des parkings vélo sur une zone pour présenter des statistiques, on peut sans peine effectuer une validation simple et automatique des données présentes (mais pas deviner la présence sur le terrain de parkings inconnus dans OpenStreetMap). Alors qu’OpenStreetMap laisse la liberté de décrire un objet géographique, même de manière très incomplète, nous pensons que pour chaque parking, on doit au moins connaître le type de stationnement (arceau, pince-roue,…) et le nombre de places.

Un couche cartographique présente l’ensemble des parkings qui présentent au moins un de ces défauts :

  • Nombre de places inconnu
  • Type inconnu
  • Doublon géographique (deux parkings aux mêmes coordonnées, même si deux parkings voisins existent, ils doivent être distincts dans l’espace)

Le fait de présenter des données à corriger est une motivation pour des contributeurs d’OpenStreetMap, qui vont chercher à faire disparaitre ces signalements en corrigeant les données. Les marqueurs sont accompagnés d’un lien permettant de modifier ces données dans JOSM (éditeur de données OpenStreetMap). Si des parkings manquant d’informations sont ajoutés par la suite, ils seront aussi signalés.

La rapidité de mise à jour fait partie de la culture d’OpenStreetMap, les contributeurs souhaitent voir apparaitre les résultats de leurs modification sans attendre un processus de validation ou une synchronisation qui se produit rarement. La mise à jour des données de la carte se fait donc toutes les heures. Un traitement planifié récupère l’ensemble des données en parkings vélo de la zone, grâce à un service nommé Overpass API, qui extrait des données d’OpenStreetMap à la demande. Lors d’une cartopartie, on peut donc voir rapidement les résultats de la collecte, mais si d’autres utilisateurs d’OpenStreetMap ajoutent des données inexactes ou incomplètes cela sera visible rapidement.

Essaimer

Sur d’autres territoires

Après quelques dizaines d’heures de développement, j’ai réalisé qu’il serait dommage d’avoir passé tant de temps pour un outil qui ne servirait que pour un territoire, ses citoyens et ses collectivités.

Il était assez logique de publier le logiciel sous forme de logiciel libre (licence AGPL), sur la plateforme GitHub. Et non seulement faut-il mettre le logiciel à disposition, mais il faut le rendre accessible ; une documentation d’installation est disponible, pour guider toute personne ayant des compétences en informatique qui voudrait déployer l’application sur son propre serveur et sur le territoire de son choix. Le but de cette documentation est de rendre la carte installable rapidement, sur un hébergement peu cher et sans nécessiter de compétences très pointues.

Actuellement, les outils requis sont PHP et PostGIS. Il n’est pas possible à ma connaissance de disposer de PostGIS sur des hébergements mutualisés, mais on peut très bien se baser sur des serveurs dédiés ou des serveurs privés virtuels à faible coût (ex : VPS à partir de 2€ HT par mois chez OVH).

Pour maximiser les chances de réutilisation à l’échelle internationale, la documentation est écrite en anglais (enfin, en cours d’écriture). L’application offre également le support de plusieurs langues : anglais et français sont disponibles pour le moment, mais l’ajout d’autres langues peut se faire assez facilement. Les textes affichés à l’écran font partie de la configuration ; si par exemple des réutilisateurs francophones reprennent l’outil et veulent simplement changer des libellés ou la terminologie (exemple : Communes en Arrondissements si on fait une carte sur Paris), ceci nécessite simplement de modifier un fichier de configuration, sans avoir de compétences techniques.

Vers un outil plus global ?

Si le besoin émerge d’afficher des parkings vélo à une échelle plus grande (pays, monde), l’évolution est envisageable, mais nécessitera des moyens supérieurs en termes d’infrastructure.

Hollywood , l’école de la vie (épisode 1/∞) : The monuments men

Tonight, while watching the aforementioned movie in its original version, I drew some conclusions about languages and the perception of nations toward one another. This is a bit ironic, but true in a way.

At he beginning a scene shows a French employee, her French colleague,  a German officer and his chief marshal Göring. The first two persons speak French as they plan on spitting in a glass of champagne, while the last two persons talk about stolen artworks in German. And then, when the French and the German interact, they speak… English with an American accent, which is completely logical, and contemporary. Wouldn’t I do the same today ? It is 2014, so, don’t panic.

I always hear that French people at really bad at foreign languages, and I believe it is true to an extent. Surprisingly, this film is reassuring. James Granger, the curator from New York, pretends to be fluent in French. Yet, most people he meets happen to express themselves fluently in English, whereas his french is so awkward that I hardly understand it.

So, there is no need to bother with foreign languages when you are an american tourist travelling abroad. In Hollywood movies, you feel like at home everywhere you go, don’t you ?

Le bon coin, vous êtes en bonne compagnie

Aujourd’hui, je cherche à revendre un vieux PC sur le célèbre site Le bon coin, célèbre site de petites annonces, où l’on peut trouver des biens à vendre dans sa région, dans son département. La proximité de l’acheteur et du vendeur permet de se rencontrer physiquement, d’examiner le produit, puis de payer en espèces.

Pour certains acheteurs, apparemment, le produit ne pose aucune question, le prix leur convient et ils vous promettent encore plus. Ils n’ont pas besoin de vous voir, et bizarrement, ils sont fans des services d’expédition de La Poste. Paypal serait aussi la référence du paiement, il est présenté comme très sécurisé. Le pire est que tous ces gens sont unanimes.

Premier message à 13h05 :

Je suis d’accord pour le prix mais je compte vous régler via
paypal et pour l’envoi j’opte pour la compagnie Colissimo express de
préférence dans un emballage que je
compte prendre a ma charge les  frais d’envois,Je vous paie avant tout
envoi,mais je ne marche qu’avec paypal par mesures de sécurité en
vigueur car il y’a trop de fraudes
avec les chèques et autres modes de paiement si cela ne pose aucun
problème on peut poursuivre la transaction.

j’attends donc votre avis.

Deuxième message à 14h39, plus prometteur encore :

Bonjour J’ai bien pris note de votre courriel, je confirme ainsi l’achat de
votre Annonce vu son prix raisonnable je vous rajoute (25 Eur) pour que
vous me le cédez .Était donné que je l’achète
Je vous règle avant l’envoi pour le règlement
J’opte pour un virement Paypal qui est un moyen très fiable que
j’utilise pour des raisons de sécurité mutuelles. Pour l’envoi du
colis j’accepte uniquement Chronopost avec les frais de port en ma
charge. Tout en espérant que vous comprenez mon désir d’une
transaction claire, merci de donner suite à mon message rapidement
afin de conclure la vente dans les plus brefs délais. Merci de votre
bonne compréhension.

Envoyé depuis mon appareil mobile Samsung

Ces gens veulent faire un achat en toute confiance, mais ils tiennent tous les deux le même discours. Et chacun est prêt à engager de l’argent, article et livraison, sans aucune garantie sur le produit.

Quand cherche « le boin coin chronopost paypal« , on découvre une arnaque à la vente, assez simple dans le principe :

  • l’acheteur commence par faire un « paiement par Paypal », avec une confirmation contrefaite, il y a d’étranges problèmes techniques par la suite, et l’agent n’arrive pas
  • le vendeur, de bonne foi, envoie le colis à ses frais, dans des pays africains francophones, dans la plupart des cas

C’est un peu plus subtil que la fille d’un potentat récemment renversé, qui doit récupérer quelques millions d’euros et vous en verser quelques pourcents si vous lui envoyez 300 €.

Descente dans les donjons du destin #1

Je démarre cette série d’articles au sujet d’un jeu vidéo. J’avoue être ignorant de la plupart des blockbusters vidéoludiques, comme World of Warcraft ou Mario Bros et n’avoir jamais possédé de console de jeux. Il y a bien un jeu méconnu, mais dont on ne se lasse pas, c’est Nethack.

Ce jeu conserve un certain exotisme et a ses inconditionnels, malgré son grand âge. On y jouait déjà l’époque des petits écrans cathodiques à 16 couleurs, et des disquettes souples, que je n’ai pas vraiment connu, puisque la première version de ce jeu est sortie en 1987, année de ma naissance. Avec les moyens techniques de l’époque, il n’était pas question de graphismes 3D, ni même de temps réel; on dessinait les pixels un à un, ou bien on écrivait des caractères sur l’écran.

Nethack était un de ces jeux, qui utilisait des caractères ASCII, là où les jeux d’aujourd’hui simulent fidèlement le monde réel. Nethack est un jeu de rôle de type porte-monstre-trésor, qui fait partie de la grande famille des Rogue-like. Ces jeux, souvent parents, placent le joueur dans un univers de fantasy, où il explore des souterrains abandonnés, combat des orques et autres fantômes, et récolte des richesses. L’environnement est une grille en deux dimensions formée de caractères, où @ représente le joueur, + un mur ou G un gnome. La représentation graphique est plus métaphorique que figurative, elle tend plus vers le roman que vers le cinéma. En ce temps-là, la souris était encore un animal exotique, et Nethack s’en passe. D’ailleurs le jeu se passe au tour par tour, comme dans les jeux de rôle sur plateau.

Toutes les interactions se passent au clavier, ainsi q permet de boire une potion (quaff en anglais), et on enfile un vêtement avec maj+w. Ceci fait quelques combinaisons de touches à retenir, mais on retient assez vite ces raccourcis,qui sont aussi donnés en mode graphique.

La version la plus basique de Nethack est toujours en mode texte, mais on peut à présent jouer à ce jeu légendaire dans des interfaces plus pratiques et surtout plus lisibles. Il est en effet, plus facile de reconnaître les monstres sur des petites images que se souvenir de la différences entre un o gris clair, simple gobelin pauvrement armé, et un o gris, l’Uruk-Haï qui peut vous tuer immédiatement d’une flèche empoisonnée.

Pourquoi s’intéresser à un jeu aussi archaïque qui ne doit plus être maintenu depuis longtemps ? Parce Nethack est peut-être le jeu le plus addictif, le plus difficile et celui qui offre la plus grande durée de vie.

Nethack offre un défi apparemment simple: récupérer le plus puissant objet objet magique de l’univers, l’amulette de Yendor. Le commanditaire est votre dieu, qui n’a pas d’autres occupations que chercher querelle aux autres dieux pour être adoré de tous, l’amulette lui permettrait d’établir sa suprématie. Pour cela, il faut affronter de nombreux ennemis, traverser des lieux redoutables, et vaincre le magicien de Yendor. Contrairement à la grande majorité des jeux, où l’on peut recommencer plusieurs fois après un échec, le personnage de Nethack n’a qu’une vie; même si après dix heures de jeu, vous mourez bêtement d’indigestion, il n’y a plus qu’à recommencer.

Il existe un wiki à propos de Nethack, qui compte plus de 2000 pages, et ce n’est pas sans raison, car les règles de Nethack sont assez complexes, il existe de nombreux objets différents, aux usages parfois inattendus, des mécanismes de compétences, de multiples caractéristiques qui affectent le personnage, une foultitude de monstres dont même les plus insignifiants peuvent être des pièges mortels.

La difficulté du jeu et la forte mortalité des aventuriers dans les donjons maléfiques font qu’on ne finit pas le jeu en dix heures. Les joueurs qui « ascendent », ceux qui accomplissent la mission, ont en général au moins un an d’expérience du jeu. Jouant à Nethack irrégulièrement depuis trois ans, je n’ai pas encore réussi.

Comment installer Nethack ? Même si à l’origine, Nethack se joue exclusivement avec le clavier et en mode texte, il existe une certain nombre d’interfaces, plus ou moins conviviales et élaborées. Supposant que vous n’êtes pas spécialement masochiste et que vous vous servez de la souris de temps à autres, les interfaces suivantes sont recommandées:

  • Sous GNU/Linux, Qt-Nethack est une interface particulièrement claire et agréable, même si elle date un peu (paquet nethack-qt sous Ubuntu)
  • Sous Windows, Nethack a aussi une version graphique assez utilisable

Parmi d’autres interfaces, on peut citer Falcon’s Eye, qui représente l’environnement en vue isométrique avec les graphismes les plus soignés. La vue isométrique peut convenir à certains, mais désoriente quelque peu.

Le jeu est peu bavard sur lui même, son site officiel ne donne quasiment qu’un lien de téléchargement, et l’aide dans Nethack ne donne que le minimum d’informations. C’est le principe des jeux Rogue-like d’avoir des règles obscures qui ne sont pas en principe dévoilées au joueur. Or comme Nethack est un logiciel libre, toute personne versée un temps soit peu dans l’informatique peut comprendre les règles en lisant le code source. Depuis longtemps, ces gens publient des spoilers, fichiers qui dévoilent les mécanismes internes du jeu comme tous les événements qui peuvent vous arriver en buvant l’eau d’une fontaine, comment identifier les parchemins selon leur prix en magasin et bien d’autres choses qu’on ne saurait pas normalement. Pour certains, consulter des spoilers gâche le plaisir de découvrir le jeu par soi-même, mais ceux ci permettent de progresser plus rapidement et d’apprendre des techniques intéressantes. Les articles de cette série seront en grande partie des spoilers.

Dernier avertissement avant de descendre au coeur du danger: le jeu n’est développé qu’en anglais, jouer à Nethack ne requiert pas un niveau exceptionnel, mais ceci peut rebuter.

La magie du regroupement dans OpenLayers

Quand on affiche tout un tas de points d’intérêts sur une carte, leur répartition n’est pas toujours uniforme, ce qui occasionne parfois un agglutinement des points d’intérêt qui s’empilent dans une mêlée confuse.

Pour gérer proprement des points d’intérêt nombreux et qui ont tendance à se confondre, on dispose dans OpenLayers d’un mécanisme de regroupement, qu’on désigne en anglais sous le nom de clustering. Plutôt que dessiner tous les points tel quel, la bibliothèque va se charger de regrouper les points très rapprochés en un seul point d’intérêt. Ce système, bien que puissant est un peu compliqué, comme bien d’autres choses dans OpenLayers.

Voyons point par point comment mettre en œuvre le regroupement sur une couche de points, gérer l’apparence des points regroupés et prendre en compte les événements sur une telle couche.

Propriétés de la couche

Le regroupement dans OpenLayers est implémenté comme une stratégie, c’est à dire un objet qui change de comportement d’une couche. Voici la définition de notre couche de point d’intérêt, un objet OpenLayers.Strategy.Cluster() est fourni dans la propriété strategies.

var layerPOI = new OpenLayers.Layer.Vector("Points d'intérêt", {
	projection: new OpenLayers.Projection("EPSG:4326"),
	strategies: [
		new OpenLayers.Strategy.Cluster()
	],
	styleMap:new OpenLayers.StyleMap({
           "default": clusterStyle
	})
});

Nota: Nous avons référencé un style nommé clusterStyle, que nous expliciterons plus tard.

Manipuler les groupes

Il est nécessaire ici d’adapter votre code concernant la gestion des événements liés à la couche. Quand on implémente un contrôle, comme SelectFeature pour intercepter le clic sur un objet, sans regroupement d’objets, on reçoit un objet OpenLayers.Vector, dont les propriétés sont:

  • attributes:  tableau des attributs de l’objets
  • geometry: une géométrie

Quand on ajoute à cela le regroupement, on reçoit plus des OpenLayers.Vector, mais un objet avec deux attributs:

  • count: nombre de points d’intérêt dans le groupe
  • cluster: tableau des objets du groupe, ce sont des OpenLayers.Vector

Re-définir le style

Pour la couche, on doit définir un style avec la classe OpenLayers.Style. Comme dans toutes les déclarations de style dans OpenLayers, on y définit les valeurs de différents attributs comme le label, la grosseur d’un point ou l’adresse d’un pictogramme. Mais comme on ne souhaite pas forcément rendre un point d’intérêt seul de la même manière que le regroupement de dix points d’intérêt, on peut calculer des propriétés de style en fonction du groupe de points d’intérêt. Là où on donne souvent des valeurs constantes pour une propriété, on peut déclarer dans les attributs des « variables ». Par exemple, dans la propriété label, on utilise la déclaration ${nombre}, qui désigne une valeur à calculer lors du rendu de la couche. Les variables sont calculées dans des méthodes du même nom, qui font partie de l’objet context.

Dans cet exemple, on affiche comme label le nombre d’éléments d’un groupe d’au moins deux éléments, avec la variable ${nombre}.

var clusterStyle = new OpenLayers.Style({
    label:"${nombre}",
    graphicWidth: 20,
    graphicHeight: 20
}, {
    context: {
         nombre: function(feature) {
             if(feature.attributes.count>=2)
            	 return feature.attributes.count;
             else
            	 return "";
         }
    }
});

Critères de regroupement

L’algorithme de regroupement d’OpenLayers est relativement simple: on regroupe tous les objets qui, à l’écran, sont à moins de 40 pixels de distance.

On peut vouloir personnaliser ce comportement, pour prendre en compte d’autres règles de gestion. Dans ce cas, après avoir instancié la stratégie de regroupement, on doit re-définir sa méthode shouldCluster. Partant d’un groupe existant, nommé cluster et d’un objet feature qu’on pourrait y ajouter, cette méthode décide de la possibilité de fusionner le groupe avec un élément, en retournant un booléen. Dans cet exemple, on a modifié la stratégie pour ne regrouper que les objets qui ont la même valeur pour l’attribut type et qui sont distant d’au plus 35 pixels.

var clusterCat = new OpenLayers.Strategy.Cluster();
clusterCat.shouldCluster = function(cluster,feature)
{
	if(cluster.cluster[0].attributes.type != feature.attributes.type)
	{
		return false;
	}
	var cc = cluster.geometry.getBounds().getCenterLonLat();
        var fc = feature.geometry.getBounds().getCenterLonLat();
        var distance = (Math.sqrt(Math.pow((cc.lon - fc.lon), 2) + Math.pow((cc.lat - fc.lat), 2)) / this.resolution);
        return (distance <= 35);
}

Valeur par défaut dans un champ texte avec jQuery

Dans les formulaires sur le web, on trouve souvent des champs texte qui affichent au départ une petite explication sur ce que l’utilisateur doit y taper. Le texte par défaut est souvent dans un ton gris qui signifie qu’il s’agit simplement d’une indication. Quand on entre dans le champ texte, la couleur du texte change. Et si jamais on quitte le champ texte en le laissant vide, la valeur par défaut revient avec son apparence originelle.

Petite démo:

Ce comportement est déjà implémenté dans les navigateurs modernes grâce à l’attribut placeholder de HTML5, malheureusement, quand il faut assurer la compatibilité avec tous les navigateurs, dont le vénérable et sénile Internet Explorer 7, HTML5 ne peut pas tout.

Voici de quoi mettre en œuvre cet effet très simplement avec jQuery.

On définit premièrement deux classes CSS:

  • inputValDefaut définit l’apparence du champ texte quand il a sa valeur par défaut
  • inputValDefautValeur est utilisé pour représenter le champ si l’utilisateur y a entré une valeur

Ici, la valeur par défaut sera en gris et les valeurs réelles en noir.

.inputValDefaut{color: #aaaaaa}
.inputValDefautValeur{color: black}

On déclare ensuite un ou plusieurs champs texte avec la classe inputValDefaut, et on utilise l’attribut title pour la valeur par défaut.

<input type="text" title="Taper une adresse" name="adresse" class="inputValDefaut">

Il ne reste plus qu’à copier-coller ces quelques lignes de Javascript, qui gèrent le changement d’état des champ texte et affecte leurs valeurs par défaut.

$(function(){
    	$(".inputValDefaut").bind({
    		blur:function(){
    			if($(this).val() == "")
    			{
    				$(this).val($(this).attr("title"));
    				$(this).removeClass("inputValDefautValeur");
    			}
    		},
    		focus:function(){
    			if($(this).val() == $(this).attr("title"))
    			{
    				$(this).val("");
    				$(this).addClass("inputValDefautValeur");
    			}
    		}
    	});
    	$(".inputValDefaut").each(function(){$(this).val($(this).attr("title"))});
});

Faire des panoramas avec Hugin

Il n’y a rien de mieux que des yeux humains: il savent s’adapter à la luminosité, ils permettent à eux deux de voir sur 180° d’ouverture horizontale et 130° d’ouverture verticale, leur léger décalage associé au post-traitement du cerveau permet de situer des objets dans l’espace. Si les compare à un appareil photo, l’appareil photo est un peu honteux, surtout quand on pense à l’appareil de Monsieur Tout-le-monde. Personnellement avec un Nikon Coolpix L2 d’il y a cinq ans, j’ai l’air un peu pauvre, avec 45,9° de champ de vision latérale et une sensibilité ridicule qui fait que les photos sont floues dans les espaces mal éclairés. Ces limitations se voient bien quand on prend des photos:

  • Devant un paysage magnifique, vous ne pouvez prendre qu’un bout plutôt limité de ce que vous voyez avec vos yeux
  • En ville, vous essayez de prendre un bâtiment assez imposant, mais pas moyen de s’éloigner assez pour avoir une vue d’ensemble, sachant que la rue mesure dix mètres de large…
  • Vous êtes adepte de la utra-HD, sauf que les appareils actuels font « juste » 10 megapixels, vous pourrez créer de grandes photos (le record actuel, avec des moyens de professionnel est 26 giga-pixels), avec un appareil à 6 mega-pixels j’arrive sans problème à faire des photos de 28 méga-pixels

Heureusement, il n’y a pas besoin d’acheter un objectif grand angle, ni un appareil 3D stéréoscopique pour obtenir de superbes photos immersives, mais simplement de faire un peu de post-traitement logiciel. Il y a des outils de création de panoramas qui permettent de travailler sur vos photos pour créer:

  • Des panoramas 360 degrés
  • Des photos à large angle de vue, et donc plus réalistes, puisqu’elles ressemblent plus à ce qu’on verrait dans la réalité avec nos propres yeux
  • Des photos en très haute définition avec un appareil basse définition
  • Et même des choses hallucinantes comme ce panorama en coordonnées polaires

Pour revenir à mes petites histoires, j’avais envie dimanche de photographier la façade sud d’une chouette église, qu’on appelle la Collégiale Saint-Ours, mais malheureusement on ne peut bien voir la façade que depuis un petit jardin visible sur cette carte. Vu la taille du jardin on ne peut se reculer d’une vingtaine de mètres pour prendre cette église, et voici tout ce que mon appareil photo peut voir:

On est un peu limité… Pourtant, en prenant dix photos différentes du bâtiment et en les assemblant sur ordinateur j’ai réussi à obtenir une très belle vue d’ensemble:

Prise de vue

N’importe quel appareil photo convient pour faire des panoramas, l’essentiel est de comprendre un minimum sur le fonctionnement du logiciel de montage de panoramas. Évidemment, il ne fonctionne ni par la magie, ni par opération du Saint-Esprit. Le principe est de prendre plusieurs photos, pour qu’il les relie entre elles et les fusionne en une seule image. Je n’ai pas vraiment cherché à comprendre ce qu’il fait (il doit y avoir d’intéressants algorithmes de traitement d’images) mais en tout cas les étapes de son travail sont les suivantes:

  • parcourir les images pour trouver des points-clé
  • essayer de rapprocher les points-clé des différentes photos
  • spatialiser les photos selon les points communs qu’il a trouvés
  • sortir une image fusionnant les photos de départ

La première étape est la prise de photos, avec votre appareil habituel. Prendre des photos est simple, mais pour constituer un panorama, il faut prendre plusieurs vues. Vous pouvez en prendre deux, trois, et même plusieurs dizaines… L’essentiel est que le logiciel puisse les recouper correctement; pour cela, les vues doivent être légèrement confondues pour que le logiciel puisse faire le lien entre deux photos voisines. Au lieu de prendre des photos de zones voisines mais séparées, il vaut mieux avoir un décalage raisonnable comme dans les deux photos ci-dessous:

Il faut aussi tirer sur se méfier de tout ce qui bouge, des personnes se baladant dans le champ ou des nuages rapides par temps venteux peuvent se retrouver sur plusieurs de vos photos ou apparaitre coupés. Attention donc aux bords des différentes photos, si vous prenez des « corps mouvants », il vaut mieux qu’ils soient en plein milieu d’une photo (ils seront encore entiers au final) plutôt que sur les bords (risque de perturber le recoupement avec les images voisines).

Les professionnels de la photo utilisent des trépieds pour que l’ « œil » de l’appareil photo reste à la même place, ceci évite le phénomène de parallaxe. Ce n’est pas du tout indispensable, personnellement, je porte l’appareil dans mes mains et en veillant à ne pas trop bouger entre deux prises de vue.

La parallaxe est un phénomène tout simple qui veut que si on change un peu de point de vue, l’image vue risque d’être assez différente. On en fait facilement l’expérience: placez votre index à vingt centimètres devant vos yeux, puis fixez le avec l’œil gauche, puis ensuite avec l’œil gauche. Selon les points de vue des yeux, le doigt n’est pas placé pareil par rapport aux objets en arrière plan. Notre cerveau s’en arrange, puisqu’il nous donne la perception de la 3D, mais un logiciel d’assemblage de panoramas apprécie un peu moins.

La documentation d’Hugin recommande si possible d’utiliser un « mode manuel » dans les réglages de l’appareil photo. Ce mode manuel fait que le contraste et la luminosité sont les mêmes pour toutes les prises de vue. Un appareil photo règle automatiquement ces paramètres pour obtenir une photo agréable à l’œil quelque soit l’objet photographié ou la lumière ambiante. Pour illustrer ce principe essayez de viser le ciel, il apparaitra bleu (s’il y a du soleil), puis dirigez l’objectif sur un bâtiment tout en gardant un bout de ciel dans le champ de vision, et bizarrement le ciel paraitra beaucoup plus clair. Ce mode manuel, s’il est présent sur votre appareil photo, peut faciliter la tâche au logiciel de montage, qui est parfois dérouté par les réglages que l’appareil photo fait automatiquement.

En pratique même si vous n’utilisez pas de mode manuel, Hugin a aussi les outils pour uniformiser l’éclairage lors du rendu. La capture ci-dessous montre comment deux photos très différentes sont fusionnées proprement.

Montage

Hugin est un logiciel libre  et multi-plateforme d’assemblage de panoramas. Son installation ne devrait pas vous poser problème: si vous êtes sous GNU/Linux, un paquet hugin est normalement disponible dans votre distribution, sous Windows ou Mac OSX le site officiel permet de récupérer l’exécutable.

Pour la petite histoire, Hugin « n’est qu’une interface graphique » pour les Panorama Tools, une suite d’outils en ligne de commande qui assurent l’assemblage de panoramas.

Hugin est un outil assez expert, il ne cache quasiment rien de sa petite cuisine, on se croirait aux commandes d’un avion, mais il n’empêche que son utilisation est très simple.

L’onglet « Assistant » nous donne les commandes indispensables pour commencer.

D’abord les images

Hugin a tout simplement besoin d’une liste de photos à assembler. On peut en ajouter en cliquant sur le bouton « Ajouter des images », on sélectionne ensuite des images. Il est possible de modifier cette liste dans l’onglet « Images ».

La prochaine étape est aussi simple: cliquez sur « Aligner », ensuite Hugin fait des calculs pour identifier les points de contrôle et relier les images entre elles.

Si vous essayez d’assembler une vingtaine ou une trentaine de photos, les calculs peuvent prendre un certain temps, l’explosion combinatoire fait que l’assemblage de 30 photos m’a pris un quart d’heure

Régler la projection

Maintenant que les calculs sont finis, Hugin affiche une fenêtre « Aperçu rapide du panorama ». Si tout s’est bien passé, on y voit un aperçu de l’assemblage, c’est un aperçu car on peut encore distinguer les différentes images qui sont projetées sur l’écran, alors que dans l’image finale les photos seront fusionnées pour donner un rendu vraiment homogène. En tout cas, on peut vérifier que le logiciel a bien fait le lien entre les photos.

Il est aussi possible de montrer à Hugin quels sont les points communs entre les photos, mais cette méthode est fastidieuse.

La fenêtre offre différents outils plus ou moins utiles. Je détaille ici les plus importants.

Modes de projection

A partir de son ensemble de photos, Hugin a plusieurs méthodes pour disposer les photos dans un panorama, ce sont des méthodes de projection. Historiquement, les méthodes de projection viennent de la géographie, quand on a voulu imprimer des cartes du mondes sur une surface plane, alors que la Terre est une sphère. La projection que vous avez toujours vue sur les grandes cartes depuis l’école primaire est celle de Mercator. La carte du monde en projection Mercator est présentée à gauche, et celle de Peters à droite

On voit bien la différence entre les deux méthodes, avec Mercator le Groenland parait aussi vaste que l’Afrique alors qu’en réalité il est quinze fois plus petit ! En fait ces deux méthodes ont des principes différents: Mercator est faite pour conserver les angles alors que Peters essaie de représenter la vraie surface des continents.

Mais pourquoi parler les projections géographique alors qu’on fait de la photo ? Parce que c’est globalement la même chose que ce que fait Hugin:

  • en géographie on projette l’extérieur d’une sphère (la Terre) en 2D
  • le logiciel de panoramas positionne plus ou moins les photos assemblées sur une section de sphère, qui est vue de l’intérieur, le centre de la sphère est le point de vue de la photo

Pour construire le panorama on a les mêmes systèmes de projection que nos amis géographes, il nous permettent de donner des effets assez différents aux panoramas. Pour en changer, il suffit de choisir (parmi dix-huit options disponibles) dans le menu « Projection » en bas de la fenêtre. Quand vous n’assemblez que deux photos, la projection a essez peu d’importance, mais c’est en essayant plusieurs projections qu’on voit laquelle convient mieux, pour une explication détaillée des projections, voir le wiki des Panorama Tools.

Changer le point de vue

Et si on cliquait sur le bouton « Glisser » ? Apparemment, ça ne fait pas grand chose mais il est activé, c’est bon signe. Maintenant, faisons glisser l’image avec la souris. On peut de cette manière centrer différemment la vue, mais aussi la tourner.

Mais que faire quand on a mis le panorama sens dessus-dessous à force de jouer avec l’outil « Glisser » ? Le bouton « Redresser » est la pour nous aider, il se dérouille pour remettre la vue à l’endroit. « Centrer » est dans la même veine, il retrouve automatiquement le point cental de la vue. « Remplir » ajuste la vue actuelle pour qu’elle remplisse le cadre.

Pour les plus experts, le dialogue « Transformation numérique » réalise en rotation panorama selon des trois axes de vue, avec les angles de lacet, tangage et roulis

D’autres outils permettent de cacher certaines photos (section « Images »), ou d’identifier visuellement les différentes
photos à l’écran (« Identifier »).

Dans la fenêtre, on peut distinguer facilement les différentes photos, car elles sont illuminées différemment. Pas de panique, dans l’étape suivante, lors du rendu notre logiciel règlera la luminosité pour que l’ensemble paraisse homogène.

Rendu du panorama

Pour enregistrer le panorama, il suffit de revenir à la fenêtre, dans l’onglet « Assistant », on clique sur « Créer le panorama », puis on enregistre le fichier.
Seul petit problème, Hugin enregistre par défaut au format TIFF. Comme je suppose que vous préférez le JPEG, allez donc voir dans l’onglet « Assemblage ».
Sous la section « Formats de fichier », vous pouvez choisir d’enregistrer l’image en JPEG.

Conclusion

Nous avons vu la manière de créer assez simplement de magnifiques panoramas avec un appareil photo des plus ordinaires. J’espère que vous aurez envie d’en faire vous aussi et de les partager à votre tour.

Je ne vous ai montré d’Hugin que quelques commandes basiques qui permettent de générer rapidement un panorama, mais en fouillant dans les onglets, vous trouverez plein d’options intéressantes.

Merci à tous les contributeurs d’Hugin et des Panorama Tools pour leurs bons outils, ainsi qu’à ceux de Wikimédia Commons, où j’ai pu trouvé des photos libres pour illustrer ce tuto, comme celle-ci.

Chers escrocs, vous êtes pathétiques

J’ai reçu ce soir un message frauduleux des plus ridicules, apparemment Gmail ne le filtre pas. En tout cas, ce faux qui se veut de Google est bien grossier, avec une adresse qui n’est même pas de Google. Si l’on passe les problèmes de typographie, l’idée ridicule d’envoyer son mot de passe dans un courrier électronique, et les menaces fumeuses; on peut conseiller à ces petites frappes de changer d’activité.

INFO GOOGLE!  verification-reply@mail.com

Chers Membres

Nous avons l\’honneur de porter à votre connaissance que des opérations de vérification ont permis d\’observer de
nombreuses et fausses Adresses sur notre réseau, nous serons dans l\’obligation de supprimer tous les *E-mail*
frauduleux afin de mettre à votre disposition notre service gratuit et fiable.

Veuillez dans un délai de 48h renvoyer les informations correctes ci-dessous :

Nom & Prénom(*):………………..

……..
Date de naissance(*):……………..……
*E-mail* Connexion:(*):…………….…..
Mot de passe(*):……………………….
Confirmation Mot de passe(*):……………
Adresse Secours(*):……………….……
Pays(*):………………….…………..
Région(*):………………..…………..
N° Téléphone(*):……………..………..
N° Mobile(*):………………..………..
Fonction(*):………………………….. Veuillez considérer ce message étant le dernier avertissement avant la fermeture de votre *E-mail*. Cordialement, Notre Equipe !!! 

 

Transformations de coordonnées avec GDAL

Cette petite note technique traite d’une des activités les plus fréquentes quand on travaille avec des données géographiques: la transformation de coordonnées entre différentes projections. L’incontournable PostGIS est pourvu de la fonction st_transform(the_geom,srid), qui passe n’importe quelle géométrie dans le système de coordonnées voulu. Or, il n’est pas toujours possible pour des contraintes techniques ou autres soucis de performances de solliciter PostGIS.

La bibliothèque GDAL est un outil très adapté dans les cas où vous voulez manipuler des données géographiques en C++ ou Python. Celle ci a la mérite d’être bien développée, même s’il n’y a pas vraiment une grande communauté et beaucoup de tutoriel sur ses fonctionnalités. Pour preuve, le site de GDAL n’est autre qu’une documentation générée par Doxygen.

Il n’est pourtant pas très compliqué, en C++ ou Python, de transformer des coordonnées avec GDAL, supposant qu’on utilise le langage C++:

  • Installer la bibliothèque  GDAL, sur des systèmes de type Debian ou Ubuntu:
sudo  apt-get install libgdal1-dev
  • Il est nécessaire de faire les inclusions suivantes:
#include <gdal/ogr_geometry.h>
#include <gdal/ogr_spatialref.h>
#include <gdal/ogr_srs_api.h>s
  • Pour effectuer des transformations d’un système à l’autre, on déclare d’abord deux objets représentant des systèmes de coordonnées, avec la classe OGRSpatialReference, puis l’objet destiné à transformer des coordonnées (classe OGRCoordinateTransformation). Typiquement, on utilise le code EPSG, pour représenter un système de coordonnées. Ici, on instancie la projection 4326 (latitude et longitude) et la projection 25572, qu’on appelle aussi Lambert II, et qui a l’avantage en France de représenter fidèlement les distances en mètres. On cherche alors à transformer les coordonnées de Lambert II vers longitude/latitude
OGRSpatialReference refLonLat;
refLonLat.importFromEPSG(4326);
OGRSpatialReference refLambert;
refLambert.importFromEPSG(27572);
OGRCoordinateTransformation * lambertToLonLat = OGRCreateCoordinateTransformation(&refLambert,&refLonLat);
  • Lorsqu’on veut convertir un vecteur de deux coordonnées, avec les variables x et y, on utilise l’objet de transformation avec la méthode Transform
double x = ...;
double y = ...;
lambertToLonLat->Transform(1,&x,&y);

A noter, les coordonnées sont converties sur place, c’est à dire que les variables (ou tables) qui lui sont données sont modifiées. Si le premier argument vaut 1, on peut lui donner de simples valeurs de type double, ou bien des tableaux de double dans le cas contraire…

Pour convertir des coordonnées en Python, un code Python équivalent serait:

try:
from osgeo import ogr
except:
import ogr
try:
from osgeo import osr
except:
import osr
refLambert = osr.SpatialReference()
refLambert.ImportFromEPSG(27572)
refLonLat = osr.SpatialReference()
refLonLat.ImportFromEPSG(4326)
coordTrans = osr.CoordinateTransformation(refLambert,refLonLat)
point = ogr.Geometry(ogr.wkbPoint)
x = ...
y = ...
point.AddPoint(x,y)
point.Transform(coordTrans)