<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>neogeo &#187; WMS</title>
	<atom:link href="http://www.neogeo-online.net/blog/archives/tag/wms/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.neogeo-online.net</link>
	<description>SIG, OpenSource et Web 2.0</description>
	<lastBuildDate>Thu, 22 Dec 2011 17:53:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Qualité de service des services de visualisation INSPIRE</title>
		<link>http://www.neogeo-online.net/blog/archives/1597/</link>
		<comments>http://www.neogeo-online.net/blog/archives/1597/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 14:47:15 +0000</pubDate>
		<dc:creator>Guillaume Sueur</dc:creator>
				<category><![CDATA[OGC, ISO & INSPIRE]]></category>
		<category><![CDATA[INSPIRE]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=1597</guid>
		<description><![CDATA[La dernière mouture du Technical Guidance for View Services (version 3.1 donc) est parue au début du mois, alors même que la mise en œuvre en devenait règlementaire pour les Annexes I et II. Pas de grands bouleversements dans cette version donc, mais un éclaircissement sur la notion de Qualité de Service (QoS), qui était [...]]]></description>
			<content:encoded><![CDATA[<p>La dernière mouture du <a href="http://inspire.jrc.ec.europa.eu/documents/Network_Services/TechnicalGuidance_ViewServices_v3.1.pdf" target="_blank">Technical Guidance for View Services</a> (version 3.1 donc) est parue au début du mois, alors même que la mise en œuvre en devenait règlementaire pour les Annexes I et II. Pas de grands bouleversements dans cette version donc, mais un éclaircissement sur la notion de Qualité de Service (QoS), qui était alors reléguée au rang d&#8217;annexe et dispose désormais d&#8217;un chapitre dédié (le chapitre 6).</p>
<p>Comme souvent la notion d&#8217;éclaircissement s&#8217;accompagne d&#8217;une dose d&#8217;obscurcissement, voici un petit résumé de ce que j&#8217;ai pu en comprendre&#8230;</p>
<ol>
<li><strong>Comment tester ?</strong><br />
Sans doute pour répondre aux divers besoins exprimés, le document prévoit 2 scénarii de test : soit on teste le service depuis son point d&#8217;accès sur internet, soit on le teste depuis l&#8217;intérieur de l&#8217;infrastructure informatique. Dans ce dernier cas, il faut retrancher le temps de transport réseau pour mesurer la performance. Il s&#8217;agit en fait d&#8217;établir la différence de temps de transfert entre ce mode et le mode précédent, et de l&#8217;appliquer aux résultat obtenus ainsi. C&#8217;est une sorte d&#8217;extrapolation des résultats qu&#8217;on aurait obtenus en testant depuis l&#8217;extérieur faite à partir de résultats obtenus depuis l&#8217;intérieur de l&#8217;infrastructure. Bon, pour la suite, on partira du principe qu&#8217;on suit le scénario 1&#8230;</li>
<li><strong>Mesure de la performance.</strong><br />
Il faut pouvoir récupérer une image de 470 Ko (800&#215;600 pixels en 8 bits) en moins de 5 secondes, en situation normale. Mais il ne suffit pas que ça marche une fois. Le protocole de mesure indique qu&#8217;il faut effectuer plusieurs tests par heure (au moins 10), en n&#8217;interrogeant qu&#8217;une couche à la fois, mais en faisant varier la bbox pour éviter les effets d&#8217;une mise en cache éventuelle. Au final, 90% des mesures doivent être inférieures à ces 5 secondes (c&#8217;est la notion de situation normale).  Le chronométrage doit correspondre au premier bit reçu par le client, et non à la réception de l&#8217;ensemble de la réponse.</li>
<li><strong>Mesure de charge</strong><br />
Le nombre minimum de requêtes servies doit être de 20 par seconde.  Cette mesure doit être effectuée pendant 1 minute, en envoyant 20 requêtes simultanées par seconde (ce qui associé à l&#8217;exigence précédente suppose une bande passante d&#8217;au moins 75 Mbps). Pour éviter les biais, il est préférable de réaliser ce test en ayant désactivé l&#8217;accès public au service. Concrètement, un test avant la mise en production semble idéal, puis régulièrement (mensuellement selon la recommandation). Dans les 20 requêtes minimum envoyées par seconde, il faut prévoir 10 % de GetCapabilities et 90 % de GetMap (faits selon les exigences de performance vues précédemment).</li>
<li><strong>Disponibilité.</strong><br />
Le service doit être disponible (mais sans forcément atteindre les exigences précédente) 99 % du temps, soit 3,63 jours d&#8217;indisponibilité par an au maximum.  Il faut faire au minimum 10 requêtes par heure, qui peuvent être les mêmes que celles utilisées pour mesurer la performance. Néanmoins, les périodes de maintenance ne rentrent pas en compte dans cette mesure, pour peu qu&#8217;elles aient été signalées aux utilisateurs (via les portails ou une notification par mail) une semaine à l&#8217;avance.</li>
</ol>
<p>En résumé, si l&#8217;on met de côté la mesure de charge qui est particulière, il faut mettre en place un système qui envoie des GetMap sur un layer, en 800&#215;600 avec bbox variable (mais valide, c&#8217;est-à-dire incluse dans la bbox du layer tel qu&#8217;exposée par le GetCapabilities) plus de 10 fois par heure. Au moins 99 % de ces requêtes doivent aboutir à un résultat (HTTP 200 et image non vide), et le premier bit de ce résultat doit être obtenu en moins de 5s dans au moins 90% des cas. Vous remarquerez néanmoins sans doute un paradoxe : les ViewServices peuvent utiliser du WMS ou du WMTS, mais les indicateurs de QoS ne prévoient pas de mesure particulière sur du GetTile, équivalent en WMTS du GetMap. Si votre service de visualisation WMS ne répond pas aux exigences de qualité de service, vous n&#8217;avez donc plus qu&#8217;à le basculer en WMTS !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/1597/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Distribution géographique des services WMS</title>
		<link>http://www.neogeo-online.net/blog/archives/532/</link>
		<comments>http://www.neogeo-online.net/blog/archives/532/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 17:27:15 +0000</pubDate>
		<dc:creator>Benjamin Chartier</dc:creator>
				<category><![CDATA[Cartes à la con]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=532</guid>
		<description><![CDATA[Je suis tombé récemment sur deux exemples de cartes représentant la répartition géographique de services WMS (cf. illustrations ci-dessous). La première est une carte dynamique provenant du site mapmatters.org. La seconde est une carte tirée de la présentation &#171;&#160;State of Play of OGC Web Services across the Web&#160;&#187; faite à l&#8217;occasion des conférences INSPIRE 2010 [...]]]></description>
			<content:encoded><![CDATA[<p>Je suis tombé récemment sur deux exemples de cartes représentant la répartition géographique de services WMS (cf. illustrations ci-dessous).</p>
<p><img class="alignnone size-medium wp-image-534  alignleft" title="mapmatters.org" src="http://www.neogeo-online.net/blog/wp-content/uploads/2010/10/mapmatters.org_-300x210.png" alt="MapMatters.org" width="300" height="210" /></p>
<p><img class="alignnone size-medium wp-image-535" title="state_of_play" src="http://www.neogeo-online.net/blog/wp-content/uploads/2010/10/state_of_play-300x197.png" alt="Densité de services OWS en Europe" width="300" height="197" /></p>
<p>La première est une carte dynamique provenant du site <a href="http://www.mapmatters.org/">mapmatters.org</a>. La seconde est une carte tirée de la présentation &laquo;&nbsp;State of Play of OGC Web Services across the Web&nbsp;&raquo; faite à l&#8217;occasion des conférences INSPIRE 2010 (cf. <a href="http://inspire.jrc.ec.europa.eu/events/conferences/inspire_2010/presentations/80_pdf_presentation.pdf">ici</a>).</p>
<p>Ces cartes sont intéressantes. Elles mettent en évidence des disparités entre Etats que l&#8217;on n&#8217;aurait pas soupçonnées au premier abord. On constate en effet une espèce de vacuité au niveau de certains pays alors que d&#8217;autres semblent gonflés à bloc. Nos voisins immédiats ont l&#8217;air bien plus actifs que nous. On constate également une drôle de répartition des services en France. Enfin, pas vraiment une répartition, plutôt une concentration (à Orléans). Il doit y avoir quelque chose là-bas qui adore les services web.</p>
<p>Comme pour toute carte, il ne faut pas essayer de leur faire dire ce qu&#8217;elles ne disent pas. Ces documents ne doivent pas être interprétés comme des indicateurs d&#8217;une meilleure réussite de certains Etats par rapport à d&#8217;autres (pour cela il faudrait que l&#8217;on considère que la mise en œuvre de services web puisse être considérée comme une réussite en soi). En particulier, ces représentations cartographiques ne disent rien sur la qualité des services, sur leur utilisation ni sur la quantité des données mises à disposition.</p>
<p>J&#8217;en profite pour noter au passage que mon <a href="http://ows-search-engine.appspot.com/">OWS Search Engine</a> semble avoir été utilisé par les auteurs de l&#8217;anamorphose européenne illustrée ci-dessus (cf. <a href="http://ijsdir.jrc.ec.europa.eu/index.php/ijsdir/article/viewFile/188/">ici</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/532/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MapServer : attention à Greenwich en WMS 1.3.0</title>
		<link>http://www.neogeo-online.net/blog/archives/509/</link>
		<comments>http://www.neogeo-online.net/blog/archives/509/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 19:38:41 +0000</pubDate>
		<dc:creator>Guillaume</dc:creator>
				<category><![CDATA[GeoHacks]]></category>
		<category><![CDATA[Web mapping]]></category>
		<category><![CDATA[Mapserver]]></category>
		<category><![CDATA[QGis]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=509</guid>
		<description><![CDATA[MapServer est un excellent serveur WMS, mais j&#8217;ai récemment découvert un bug qui peut affecter l&#8217;affichage d&#8217;une couche WMS dans un client quelconque. Enfin, pas complètement quelconque non plus. Le problème se situe au niveau du calcul de la BBOX de la couche en coordonnées géographiques (WGS84), dont le résultat est exposé dans la balise [...]]]></description>
			<content:encoded><![CDATA[<p>MapServer est un excellent serveur WMS, mais j&#8217;ai récemment découvert un bug qui peut affecter l&#8217;affichage d&#8217;une couche WMS dans un client quelconque. Enfin, pas complètement quelconque non plus.</p>
<p>Le problème se situe au niveau du calcul de la BBOX de la couche en coordonnées géographiques (WGS84), dont le résultat est exposé dans la balise EX_GeographicBoundingBox du GetCapabilities. Le calcul de cette BBOX se fait sans vérifier que le méridien d&#8217;origine de la projection source de la donnée est bien Greenwich, qui est celui utilisé par le WGS84. Dès lors, si vos données sont dans un système de référence utilisant le méridien de Paris comme origine (les Lambert français de la NTF par <a title="WKT du Lambert II étendu" href="http://spatialreference.org/ref/epsg/27572/prettywkt/" target="_blank">exemple</a>, à la différence du <a title="Le WKT du Lambert93" href="http://spatialreference.org/ref/epsg/2154/prettywkt/" target="_blank">Lambert 93</a> (RGF93) qui utilise Greenwich plus un décalage), la BBOX en WGS84 sera erronée car décalée de plus de 2 degrés vers l&#8217;ouest.</p>
<p>Bon, mais qu&#8217;est-ce que ça change en pratique ? Je suis sûr que nombre d&#8217;entre vous ont déjà utilisé MapServer en WMS 1.3.0 sur ce type de projection sans rencontrer de problème&#8230; Il se trouve que certains logiciels clients WMS (l&#8217;excellent QGis notamment), plus malins que d&#8217;autres, se servent de cette information pour déterminer l&#8217;emprise de la couche (quelle que soit la projection utilisée pour l&#8217;affichage d&#8217;ailleurs), et n&#8217;envoient donc pas de requête au serveur WMS quand la vue se situe à l&#8217;extérieur de cette emprise, afin de ne pas solliciter inutilement le serveur. Finaud donc. Si vous publiez des données France entière, il y aura recouvrement, et donc pas de problème (à moins peut-être de zoomer sur Strasbourg par exemple. A tester sur vos services WMS 1.3.0 préférés avec QGIS. J&#8217;en ai déjà trouvé un&#8230;). Mais si l&#8217;emprise de vos données est suffisamment étroite (une agglomération par exemple), vous ne verrez tout simplement rien là où vous comptiez les voir apparaître, car d&#8217;après le GetCapabilities les données ne se trouvent pas là du tout. Vous ne verrez non seulement rien, et certainement pas d&#8217;erreur, et vous risquez de passer quelque temps (je parle d&#8217;expérience) à vous creuser la tête pour comprendre ce qui ne va pas dans votre configuration. Sauf que la configuration va bien. Là où ça devient énervant, c&#8217;est que les clients WMS qui envoient comme des bourrins des requêtes au serveur où qu&#8217;on se situe, ignorant par là la présence et le rôle de la balise EX_GeographicBoundingBox, ces barbares donc, vont eux recevoir une réponse correcte, puisque la reprojection de la donnée elle-même fonctionne normalement. Funeste sort que celui des clients WMS les plus exigeants, les plus respectueux de l&#8217;esprit de l&#8217;inter-opérabilité, induits ainsi en erreur par un calcul approximatif.</p>
<p>Mais heureux dénouement qui voit les lecteurs assidus de ce blog non seulement informés mais dépannés par un <a title="le patch" href="http://trac.osgeo.org/mapserver/attachment/ticket/2578/wms_1.3.0.patch" target="_self">patch</a> tout frais déposé sur le bug-tracker de MapServer ! Pour l&#8217;utiliser, il suffit de l&#8217;appliquer (commande patch mapows.c wms_1.3.0.patch) au fichier source puis de recompiler et remplacer son mapserv par le nouveau. Il devrait également être rapidement disponible dans la version officielle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/509/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WMS : livre de recettes écossaises</title>
		<link>http://www.neogeo-online.net/blog/archives/497/</link>
		<comments>http://www.neogeo-online.net/blog/archives/497/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 13:02:08 +0000</pubDate>
		<dc:creator>Benjamin Chartier</dc:creator>
				<category><![CDATA[OGC, ISO & INSPIRE]]></category>
		<category><![CDATA[Web mapping]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[INSPIRE]]></category>
		<category><![CDATA[ISO]]></category>
		<category><![CDATA[Mapserver]]></category>
		<category><![CDATA[OGC]]></category>
		<category><![CDATA[WFS]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=497</guid>
		<description><![CDATA[Le British Geological Survey ou BGS (l&#8217;équivalent britannique du BRGM semble-t-il) a publié un livre de recettes destiné à ceux qui doivent mettre en œuvre des services WMS dans le cadre de l&#8217;infrastructure de données spatiale écossaise et d&#8217;INSPIRE : How to serve a Scottish SDI and INSPIRE conformant Web Map Service. Ce document volumineux (plus [...]]]></description>
			<content:encoded><![CDATA[<p>Le British Geological Survey ou BGS (l&#8217;équivalent britannique du BRGM semble-t-il) a publié un livre de recettes destiné à ceux qui doivent mettre en œuvre des services WMS dans le cadre de l&#8217;infrastructure de données spatiale écossaise et d&#8217;INSPIRE : <a href="http://www.scotland.gov.uk/Publications/2010/05/06161701/0">How to serve a Scottish SDI and INSPIRE conformant Web Map Service</a>.</p>
<p>Ce document volumineux (plus de 300 pages) est riche en informations pour ceux qui s&#8217;intéressent au déploiement de services WMS dans le cadre d&#8217;INSPIRE. Ses annexes décrivent comment paramétrer des services motorisés par ArcGIS et MapServer et comment les consommer depuis une variété intéressante de clients (Gaia, WorldWind, Google Earth et le portail OneGeology notamment).</p>
<p>La confrontation de ce document au guide technique des services de visualisation d&#8217;INSPIRE est également instructive. Le premier point qui saute aux yeux : le livre de recettes écossaises propose d&#8217;utiliser WMS 1.1.1 (avec MapServer) et WMS 1.3 (à l&#8217;aide d&#8217;ArcGIS) alors que le guide technique d&#8217;INSPIRE recommande WMS 1.3. La volonté de continuer à supporter WMS 1.1.1 est logique tant la quantité de services ne supportant pas WMS 1.3 est importante. Il est également possible que ces recettes datent de l&#8217;époque où MapServer ne supportait pas encore WMS 1.3.</p>
<p>Le deuxième point qui a attiré mon attention réside dans la manière de gérer le multilinguisme. Le document n&#8217;est pas très bavard sur ce sujet. Il fait l&#8217;impasse sur la présence du paramètre LANGUAGE dans les URL des requêtes adressées aux services WMS. Par contre, il recommande de déployer autant de services que de langues à supporter. Ainsi, chaque service n&#8217;a qu&#8217;une langue à gérer. Les spécificités de chaque langue peuvent donc être gérées au niveau de chaque service déployé. Cette solution est suggérée par moment (mais pas de manière homogène) dans la version 2.12 du guide technique d&#8217;INSPIRE. Elle a l&#8217;avantage d&#8217;être facilement mise en œuvre avec les logiciels actuellement disponibles sur le marché. Cette approche du multilinguisme ne me satisfait guère et je ne serais pas étonné qu&#8217;elle disparaisse totalement du guide technique d&#8217;INSPIRE dans ses prochaines versions au bénéfice d&#8217;une solution basée sur l&#8217;emploi du paramètre LANGUAGE utilisé de manière homogène pour toutes les opérations de WMS.</p>
<p>Un dernier point qui vaut la peine d&#8217;être mentionné : pour ce qui est de la sécurité et de l&#8217;authentification des utilisateurs (dans le cas où l&#8217;accès à certaines opérations ou données ne doit pas être libre), le document fait un rappel de quelques standards et outils qui pourraient être employés. Aucune recommandation claire ou tranchée n&#8217;est faite sur ce sujet. Ce n&#8217;est pas très étonnant tant les solutions n&#8217;ont pas l&#8217;air d&#8217;être mûres sur le sujet (pour s&#8217;en convaincre il suffit de voir à quel point ce sujet n&#8217;avance guère du côté de l&#8217;OGC). On peut toutefois noter l&#8217;implication d&#8217;EDINA (l&#8217;un des contributeurs au livre de recettes) dans l&#8217;organisation d&#8217;un prochain test d&#8217;interopérabilité (Interoperability Experiment) de l&#8217;OGC sur l&#8217;emploi conjoint de Shibboleth et de services web géospatiaux (cf. <a href="http://www.opengeospatial.org/projects/initiatives/shibbolethie">ici</a>).</p>
<p>Une lecture intéressante qui laisse tout de même une légère impression d&#8217;inachevé. Celle-ci n&#8217;est pas uniquement imputable aux auteurs. En effet, reconnaissons que certains sujets ne sont pas tout à fait mûrs à la fois du côté de la Commission Européenne et du côté des solutions logicielles (pour ne pas citer l&#8217;OGC, les éditeurs et les projets libres). Les auteurs en sont conscients puisqu&#8217;ils insistent sur le fait que ce document est destiné à évoluer. Ils annoncent également qu’un livre de recettes pour WFS devrait voir le jour en 2010 ou 2011.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/497/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>4e Journée française de l’interopérabilité géospatiale</title>
		<link>http://www.neogeo-online.net/blog/archives/382/</link>
		<comments>http://www.neogeo-online.net/blog/archives/382/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 07:26:36 +0000</pubDate>
		<dc:creator>Benjamin Chartier</dc:creator>
				<category><![CDATA[OGC, ISO & INSPIRE]]></category>
		<category><![CDATA[INSPIRE]]></category>
		<category><![CDATA[ISO]]></category>
		<category><![CDATA[OGC]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=382</guid>
		<description><![CDATA[Vendredi dernier a eu lieu la Journée de l&#8217;interopérabilité organisée par le Forum français de l&#8217;OGC dans les locaux de Météo-France. Cette journée a lieu tous les ans et cette fois-ci elle succédait aux réunions du Comité Technique de l&#8217;OGC qui s&#8217;étaient déroulées dans le même lieu les quatre jours précédents. L&#8217;objectif de ces journées [...]]]></description>
			<content:encoded><![CDATA[<p>Vendredi dernier a eu lieu la <a href="http://www.forumogcfrance.org/spip.php?rubrique28">Journée de l&#8217;interopérabilité</a> organisée par le <a href="http://www.forumogcfrance.org/">Forum français de l&#8217;OGC</a> dans les locaux de Météo-France. Cette journée a lieu tous les ans et cette fois-ci elle succédait aux réunions du Comité Technique de l&#8217;OGC qui s&#8217;étaient déroulées dans le même lieu les quatre jours précédents. L&#8217;objectif de ces journées de l&#8217;interopérabilité est de promouvoir les travaux de l&#8217;OGC auprès de la communauté des utilisateurs, producteurs et éditeurs intéressés par l&#8217;information géographique. L&#8217;essentiel de ces journées consiste en des présentations des travaux de l&#8217;OGC ainsi que des retours d&#8217;expérience en provenance des utilisateurs.</p>
<p>Quelques points qui ont éveillé mon intérêt :</p>
<ul>
<li>le Forum Français de l&#8217;OGC (avec l&#8217;aide de l&#8217;AFIGEO) a commencé un travail de rédaction de fiches en français sur les standards de l&#8217;OGC afin de démystifier la chose. La première fiche, consacrée à WMS, a été produite et est disponible <a href="http://www.forumogcfrance.org/IMG/pdf/Fiche_WMS.pdf">ici</a> ;</li>
<li>des clefs USB du <a href="http://www.thegigasforum.eu/project/project.html">projet GIGAS</a> étaient disponibles en libre-service. Elles contiennent l&#8217;ensemble des résultats de ce projet Européen visant à émettre des recommandations quant à l&#8217;emploi des standards de l&#8217;information géographique. Ces recommandations sont basées sur l&#8217;analyse des standards, exigences et retours d&#8217;expérience de différents projets (dont INSPIRE, GMES et GEOSS). Très intéressant même si la quantité d&#8217;information est importante (et en anglais) ;</li>
<li>une vidéo réalisée par une dizaine d&#8217;éditeurs de services et clients WMS membres du Forum français de l&#8217;OGC montrant le niveau d&#8217;interopérabilité que l&#8217;on peut atteindre à l&#8217;aide de leurs outils favoris (des produits libres faisaient également partie de la démonstration). Chaque éditeur disposait de 5 minutes pour démontrer le niveau d&#8217;interopérabilité de sa solution (en exploitant à la fois les couches de données qu&#8217;il publiait et celles publiées par les autres éditeurs).  Cette vidéo est intéressante : elle brosse un rapide paysage des solutions disponibles sur le marché français tout en introduisant de manière concrète les travaux de l&#8217;OGC. C&#8217;est le premier exercice de ce genre mené par le Forum français. Gageons que l&#8217;exercice se poursuivra l&#8217;année prochaine avec des ambitions encore plus élevées ;</li>
<li>une présentation des Technical Guidances des View Services d&#8217;INSPIRE faite par Didier Richard de l&#8217;IGN : l&#8217;idée générale était de présenter les recommandations d&#8217;implémentation des services de visualisation d&#8217;INSPIRE (dans le cas d&#8217;une mise en œuvre sur la base de services WMS 1.3.0) et de souligner les différences entre les spécifications de l&#8217;OGC et les recommandations d&#8217;INSPIRE.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/382/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Technical Guidance to implement INSPIRE View Services</title>
		<link>http://www.neogeo-online.net/blog/archives/357/</link>
		<comments>http://www.neogeo-online.net/blog/archives/357/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 21:29:22 +0000</pubDate>
		<dc:creator>Benjamin Chartier</dc:creator>
				<category><![CDATA[OGC, ISO & INSPIRE]]></category>
		<category><![CDATA[INSPIRE]]></category>
		<category><![CDATA[ISO]]></category>
		<category><![CDATA[OGC]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=357</guid>
		<description><![CDATA[Une version 2.12 du guide d&#8217;implémentation des services de visualisation d&#8217;INSPIRE (datée du 16 juin 2010) est disponible ici. Ce document intéressera ceux qui s&#8217;interrogent sur la manière dont un service WMS peut être utilisé pour diffuser des données en respectant les attentes d&#8217;INSPIRE. Les aspects les plus pointus de ce document résident dans la [...]]]></description>
			<content:encoded><![CDATA[<p>Une version 2.12 du guide d&#8217;implémentation des services de visualisation d&#8217;INSPIRE (datée du 16 juin 2010) est disponible <a href="http://inspire.jrc.ec.europa.eu/documents/Network_Services/Technical_Guidance_View_Services_v2.12.pdf">ici</a>. Ce document intéressera ceux qui s&#8217;interrogent sur la manière dont un service WMS peut être utilisé pour diffuser des données en respectant les attentes d&#8217;INSPIRE. Les aspects les plus pointus de ce document résident dans la manière de gérer le multilinguisme ainsi que les métadonnées associées aux services et aux couches de données.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/357/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mapserver et GDAL, duo magique</title>
		<link>http://www.neogeo-online.net/blog/archives/283/</link>
		<comments>http://www.neogeo-online.net/blog/archives/283/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 11:26:29 +0000</pubDate>
		<dc:creator>Guillaume</dc:creator>
				<category><![CDATA[GeoHacks]]></category>
		<category><![CDATA[Web mapping]]></category>
		<category><![CDATA[GDAL]]></category>
		<category><![CDATA[Mapserver]]></category>
		<category><![CDATA[OSM]]></category>
		<category><![CDATA[TileCache]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=283</guid>
		<description><![CDATA[La dernière version de GDAL, la 1.7.1, améliore encore l&#8217;utilisation de sources de données distantes de type WMS. La documentation reste toutefois succinte et ne dévoile pas les possibilités offertes par les &#171;&#160;minidrivers&#160;&#187;. Rappelons le principe de base : il s&#8217;agit de pouvoir considérer une ressource distante (WMS, TMS) comme une source de données GDAL [...]]]></description>
			<content:encoded><![CDATA[<p>La dernière version de GDAL, la 1.7.1, améliore encore l&#8217;utilisation de sources de données distantes de type WMS. La <a href="http://www.gdal.org/frmt_wms.html" target="_blank">documentation</a> reste toutefois succinte et ne dévoile pas les possibilités offertes par les &laquo;&nbsp;minidrivers&nbsp;&raquo;. Rappelons le principe de base : il s&#8217;agit de pouvoir considérer une ressource distante (WMS, TMS) comme une source de données GDAL standard et de pouvoir la manipuler comme s&#8217;il s&#8217;agissait d&#8217;un raster en local. Ca peut déjà rendre service avec le WMS. Mais l&#8217;intérêt principal réside en sa capacité à exploiter des ressources tuilées. Qui n&#8217;a jamais été frustré de ne pas pouvoir exploiter un service WMS-C ou TMS car la projection proposée ne correspondait pas à son besoin ? Les &laquo;&nbsp;minidrivers&nbsp;&raquo; permettent de contourner cet obstacle. Comment ? Assez simplement en fait. GDAL va considérer le résultat que vous lui demandez (étendue géographique, projection&#8230;), récupérer les tuiles correspondantes, en découper le superflu,  les assembler en une seule image et reprojeter le tout dans ce que vous aurez demandé.  La configuration de l&#8217;accès au service se fait via un petit fichier XML <span style="text-decoration: line-through;">simple</span> à renseigner :</p>
<pre>&lt;GDAL_WMS&gt;
  &lt;Service name="WMS"&gt; --&gt; Description du type de service (WMS, TMS...)
    &lt;Version&gt;1.1.1&lt;/Version&gt; --&gt; Version du service
    &lt;ServerUrl&gt;http://labs.metacarta.com/wms-c/Basic.py?&lt;/ServerUrl&gt;
                    --&gt; Url d'accès au service
      &lt;Layers&gt;basic&lt;/Layers&gt; --&gt; Couches à récupérer
  &lt;/Service&gt;
  &lt;DataWindow&gt; --&gt; Configuration plus générale de la données distante
    &lt;UpperLeftX&gt;-180.0&lt;/UpperLeftX&gt; --&gt; Sur ces quatres lignes, la bbox
    &lt;UpperLeftY&gt;90.0&lt;/UpperLeftY&gt;
    &lt;LowerRightX&gt;180.0&lt;/LowerRightX&gt;
    &lt;LowerRightY&gt;-90.0&lt;/LowerRightY&gt;
    &lt;TileLevel&gt;19&lt;/TileLevel&gt; --&gt; Le nombre de niveaux dans le cache
    &lt;TileCountX&gt;2&lt;/TileCountX&gt; --&gt; Le nombre de tuiles en X à la plus
                                   faible résolution (niveau 0)
    &lt;TileCountY&gt;1&lt;/TileCountY&gt; --&gt; Le nombre de tuiles en Y à la plus
                                   faible résolution (niveau 0)
  &lt;/DataWindow&gt;
  &lt;Projection&gt;EPSG:4326&lt;/Projection&gt; --&gt; Projection de la source de données
  &lt;BlockSizeX&gt;256&lt;/BlockSizeX&gt; --&gt; Largeur des tuiles
  &lt;BlockSizeY&gt;256&lt;/BlockSizeY&gt; --&gt; Hauteur des tuiles
  &lt;BandsCount&gt;3&lt;/BandsCount&gt; --&gt; Canaux de couleur dans l'image
                                 (ici, 3 pour RGB)
&lt;/GDAL_WMS&gt;</pre>
<p>Avec ces informations, GDAL se retrouve capable de traiter la ressource distante comme une donnée locale. Mais ce n&#8217;est pas tout. MapServer pouvant utiliser un tel fichier de configuration XML comme source de données d&#8217;un LAYER, on peut connecter le service distant à un contexte MapServer particulier, et créer un service WMS non tuilé exploitant des données distantes tuilées. Pratique pour les outils SIG bureautiques par exemple, qui restent incapables d&#8217;exploiter le WMS-C !</p>
<p>La configuration d&#8217;un tel LAYER dans MapServer est assez basique :</p>
<pre>LAYER
 NAME test_wms_c
 DATA "wms_c.xml"
 METADATA
   "ows_title"    "Couche WMS-C réassemblée"
 END
 TYPE raster
 PROCESSING "OVERSAMPLE_RATIO=1" --&gt; Ne pas récupérer
                                     plus de tuiles que
                                     nécessaire (directive pour GDAL)
 PROCESSING "RESAMPLE=BILINEAR" --&gt; rééchantillonner l'image
 STATUS ON
 PROJECTION
 "init=epsg:4326"
 END
END</pre>
<p>On peut alors reprojeter la ressource initiale, ainsi que l&#8217;exploiter sur des échelles intermédiaires non prévues dans le tuilage. Attention quand-même à ne pas trop en faire, car les tuiles reprojetées et rééchantillonnées ne seront pas forcément très belles à voir. L&#8217;idéal reste quand-même de conserver au moins la projection initiale.</p>
<p>En résumé nous avons donc :</p>
<pre>  ressource distante tuilée, définie sur certaines échelles
                             et une projection spécifique
     |
     |
  GDAL : calcule les requêtes à effectuer,
         récupère les tuiles, les assemble,
         reprojette si demandé,
         découpe si nécessaire
     |
     |
  MapServer : publie la nouvelle ressource pseudo-locale
              en toute liberté (projection, échelles...) mais
              avec une qualité du rendu potentiellement
              dégradée (en fonction des transformations effectuées).</pre>
<p>Pour les obsessionnels, oui, on peut aussi mettre en cache la ressource MapServer locale. Mais pas besoin de TileCache pour cela. Les &laquo;&nbsp;minidrivers&nbsp;&raquo; intègrent un mécanisme de cache qui permet à GDAL de stocker localement les tuiles récupèrées et ainsi de pouvoir les réutiliser plus tard. Pour ce faire, il suffit de rajouter un bloc &laquo;&nbsp;cache&nbsp;&raquo; dans le fichier XML (voir la doc pour cela).</p>
<p>Mais je sens déjà la question venir chez tous les habitués des caches&#8230; Comment GDAL fait-il pour déterminer les résolutions et la grille à utiliser ? Ah, bonne question. Pour les résolutions, autant le dire tout de suite, il suppose unilatéralement que chaque niveau vaut la moitié du précédent, ou que chaque tuile se subdivise en quatre si vous préférez. C&#8217;est l&#8217;approche standard, mais si on vous demande du 25k, 20k,15k,10k,5k, ça ne va pas être possible.</p>
<p>Pour les limites de la grille, l&#8217;exemple plus haut se base sur une grille standard WGS sur le monde entier, et le TileCount permet de calculer l&#8217;emprise des tuiles du premier niveau, puis des niveaux suivants. Pour des emprises plus spécifiques, on peut aussi utiliser TileX et TileY, qui représentent des valeurs à ajouter pour gérer un décalage de la grille sans toucher à l&#8217;extent globale.</p>
<p>Les domaines d&#8217;application sont nombreux. On peut citer d&#8217;emblée :</p>
<ul>
<li>L&#8217;intégration de données tuilées dans des clients non prévus pour cela</li>
<li>La reprojection de données tuilées</li>
<li>L&#8217;utilisation de données tuilées à des zooms spécifiques non disponibles</li>
<li>L&#8217;alignement des grilles de deux ressources tuilées configurées différemment</li>
<li>L&#8217;exploitation en pur WMS de données lourdes à générer (Open Street Map par exemple)</li>
<li>Et sans doute bien d&#8217;autres problèmes d&#8217;exploitation que l&#8217;on rencontre.</li>
</ul>
<p>Ainsi, ce petit exemple illustre bien, une fois de plus, les étonnantes possiblités offertes par MapServer et GDAL quand ils sont utilisés de concert. Plus que le strict respect des normes, c&#8217;est la liberté qu&#8217;ils donnent aux utilisateurs pour résoudre leurs problèmes qui est précieuse.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/283/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WMS 1.3 et gestion des coordonnées</title>
		<link>http://www.neogeo-online.net/blog/archives/191/</link>
		<comments>http://www.neogeo-online.net/blog/archives/191/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 16:29:59 +0000</pubDate>
		<dc:creator>Guillaume</dc:creator>
				<category><![CDATA[News of the GeoWorld]]></category>
		<category><![CDATA[Mapserver]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=191</guid>
		<description><![CDATA[Comme tout un chacun féru de nouveautés, l&#8217;intégration d&#8217;une nouvelle version d&#8217;un standard international (le WMS de l&#8217;OGC) dans un quasi-standard des serveurs cartographiques (MapServer 5.4) me donne envie de l&#8217;essayer. Tout le problème fut de trouver un client compatible WMS 1.3. C&#8217;est le côté contraignant de l&#8217;inter-opérabilité, il faut trouver des agents capables d&#8217;utiliser [...]]]></description>
			<content:encoded><![CDATA[<p>Comme tout un chacun féru de nouveautés, l&#8217;intégration d&#8217;une nouvelle version d&#8217;un standard international (le WMS de l&#8217;OGC) dans un quasi-standard des serveurs cartographiques (MapServer 5.4) me donne envie de l&#8217;essayer. Tout le problème fut de trouver un client compatible WMS 1.3. C&#8217;est le côté contraignant de l&#8217;inter-opérabilité, il faut trouver des agents capables d&#8217;utiliser la même norme, et ce n&#8217;est pas toujours le cas.</p>
<p>Autodesk proposant un <a href="http://geospatialfrance.typepad.com/geospatialfrance/2009/06/tlcharger-gratuitement-les-versions-dvaluations-dautocad-map-3d-2010-dautodesk-mapguide-enterprise-2010-et-dautocad-raster-d.html">téléchargement gratuit d&#8217;Autocad Map 2010</a> en version 30 jours, je me suis lancé (ou plutôt assis avec un café car le fichier à télécharger fait 2.1 Go !). Je n&#8217;avais pas vu Autocad Map depuis la version 2002, j&#8217;ai dû avoir la même sensation que le pilote de Caravelle qui se retrouve aux commandes d&#8217;un A 380&#8230; Rien que le nombre de barres d&#8217;outils vous donne l&#8217;envie de signer fissa pour une formation accélérée. C&#8217;est peut-être pour ça que c&#8217;est en téléchargement d&#8217;ailleurs.</p>
<p>Après quelques recherches je trouve la fonction d&#8217;ajout de couche WMS (il faut cliquer sur DATA dans les pratiques outils de gestion des cartes au dessus de la liste des couches&#8230;), avec dans la configuration du serveur un choix de version intégrant le 1.3.0. On touche au but donc. Je saisis ce qu&#8217;il faut, choisis une couche en projection Lambert (je ne dirais pas laquelle, pour ne pas raviver de querelle entre les anciens et les modernes, ce n&#8217;est pas mon propos). Résultat impeccable, bravo. Je refais un autre test avec une couche non projetée cette fois. Echec, rapport d&#8217;erreur un peu obscur&#8230; Après de longues recherches, je tombe <a href="http://mapserver.org/development/rfc/ms-rfc-30.html" target="_blank">sur le loup</a>. La norme WMS 1.3.0 impose aux coordonnées de la bounding box d&#8217;être en lat,lon pour les systèmes de référence non projetés, et non plus en lon,lat comme pour la version 1.1.1 et comme c&#8217;est encore le cas pour les systèmes projetés en WMS 1.3.0. Donc mon AutoCad, qui n&#8217;a sans doute pas pris cette subtilité en considération, ou mal, a soumis à MapServer une requête incohérente quant à la BBOX utilisée dans le contexte EPSG:4326. Et l&#8217;inter-opérabilité pris fin.</p>
<p>Autre nouveauté du WMS 1.3.0 l&#8217;utilisation du paramètres CRS= plutôt que SRS= dans la désignation du système de coordonnées, bien que MapServer accepte encore les deux, avec priorité au SRS. Celui-ci peut d&#8217;ailleurs s&#8217;affranchir du registre EPSG, le WGS 84 pouvant être désigné par CRS:84 plutôt que EPSG:4326. Ces diverses subtilités n&#8217;ont pas manqué de provoquer quelques <a href="http://www.mail-archive.com/mapserver-users@lists.umn.edu/msg06761.html" target="_blank">saines réactions</a> sur la liste MapServer-users dès 2006 !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/191/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>MapServer, substitution de variable et mise en cache.</title>
		<link>http://www.neogeo-online.net/blog/archives/181/</link>
		<comments>http://www.neogeo-online.net/blog/archives/181/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 14:35:26 +0000</pubDate>
		<dc:creator>Guillaume</dc:creator>
				<category><![CDATA[News of the GeoWorld]]></category>
		<category><![CDATA[Mapserver]]></category>
		<category><![CDATA[TileCache]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/?p=181</guid>
		<description><![CDATA[Vous le savez sans doute, MapServer permet de réaliser du &#171;&#160;runtime substitution&#160;&#187;, soit de la substitution dynamique de variable à l&#8217;exécution. En clair, votre requête, CGI ou WMS (ce qui revient peu ou prou au même), intègre un paramètre complémentaire dont la valeur va être interprétée au sein du fichier .map. Pour être plus clair, [...]]]></description>
			<content:encoded><![CDATA[<p>Vous le savez sans doute, MapServer permet de réaliser du <a href="http://mapserver.org/cgi/runsub.html" target="_blank">&laquo;&nbsp;runtime substitution&nbsp;&raquo;</a>, soit de la substitution dynamique de variable à l&#8217;exécution. En clair, votre requête, CGI ou WMS (ce qui revient peu ou prou au même), intègre un paramètre complémentaire dont la valeur va être interprétée au sein du fichier .map.</p>
<p>Pour être plus clair, imaginons que vous  cartographiez les trajets routiers effectués par des utilisateurs. Chaque utilisateur ne doit voir que ses propres trajets parce qu&#8217;on est pas chez Big Brother. En rajoutant un paramètre user_id à la requête envoyée à MapServer, on peut filtrer le contenu renvoyé par le fichier .map. La chaîne SQL de récupération des données devient alors :</p>
<p>DATA &laquo;&nbsp;the_geom from trajets WHERE user_id = %user_id%&nbsp;&raquo;</p>
<p>C&#8217;est tout simple donc. En intégrant entre pourcentages le même paramètre que celui envoyé dans la requête, MapServer lui substitue la valeur associée, et le contenu renvoyé est ainsi filtré. On peut aussi ajouter des expressions régulières pour valider les valeurs envoyées et éviter une bonne grosse SQL injection.</p>
<p>Tout cela est connu et très pratique. Ca tord un peu le coup à l&#8217;aspect normalisé quand c&#8217;est utilisé en WMS, mais les normes ça sert aussi à être dépassé. Néanmoins, il reste un obstacle à la mise en cache des résultats. TileCache par exemple, qui joue un rôle de proxy, ne fait suivre au serveur WMS que les attributs de la norme WMS, et génère alors une erreur car %user_id% sans rien y subsitituer n&#8217;est pas utilisable en SQL. C&#8217;est pourtant pratique de mettre aussi ce type de résultat en cache.</p>
<p>Mais il y a une solution ! <a href="http://www.aoos.org/">L&#8217;Alaska Ocean Observation System</a> publie un <a href="https://db.aoos.org/wiki/index.php/AOOS_OpenLayers#AOOS_Upgrades">patch</a> qui permet de faire suivre au travers de TileCache n&#8217;importe quel attribut complémentaire pour peu qu&#8217;il soit déclaré dans le tilecache.cfg (fichier de configuration du cache). Ils l&#8217;ont fait pour faire du WMS-T (WMS temporel, enrichi d&#8217;une variable temporelle pour récupérer des observations par exemple), et étendu à tout attribut complémentaire, ce qui mérite d&#8217;être salué.</p>
<p>Une des complications impliquée par ce genre de techique est la multiplication des arborescence, puisqu&#8217;un cache spécifique sera créé pour chaque valeur du paramètre. Avec des milliers d&#8217;utilisateurs dans mon exemple, ça peut rapidement poser problème. Mais pourquoi alors ne pas utiliser un cache mémoire (Tilecache avec MemCache), d&#8217;une taille pré-définie ? Avec quelques giga-octets, on pourra y stocker un bon nombre de tuiles, sans jamais surcharger le système. Les plus récemment créées remplaceront les plus anciennes quand le cache sera plein. Cette méthode s&#8217;adapte aussi assez bien au temps (presque) réel, puisqu&#8217;on peut paramétrer le durée de vie des données stockées par MemCache. Pour un suivi de conditions de circulation (bouchons&#8230;), on peut ainsi quand-même profiter d&#8217;un cache qui dure le temps de la validité de la donnée. Mais même 10 minutes, si de nombreux utilisateurs se connectent, c&#8217;est un considérable allégement de la charge système.</p>
<p>Petit résumé :</p>
<p>Dans OpenLayers :</p>
<pre style="padding-left: 30px;">layer = new OpenLayers.Layer.WMS("Couche dynamique en cache",
"http://serveur.com/tilecache/",
{layers: 'layer_test',format:'PNG',user_id:myUserId},
{isBaseLayer:true,visibility:true});</pre>
<p>on a donc surchargé la définition de la couche avec un paramètre user_id qui prend la valeur de la variable javascript myUserId.</p>
<p>Dans Tilecache.cfg :</p>
<p style="padding-left: 30px;">on ajoute à la définition du layer WMS : extra_params=user_id</p>
<p>Dans le MapFile :</p>
<p style="padding-left: 30px;">On intègre le paramètre à la chaîne DATA (ou FILTER, ou EXPRESSION, ou CONNECTION selon les besoins) : DATA &laquo;&nbsp;the_geom FROM trajets WHERE user_id = %user_id%&nbsp;&raquo;</p>
<p style="padding-left: 30px;">on ajoute une ligne dans le bloc METADATA de la couche pour valider le user_id:</p>
<p style="padding-left: 60px;">&#8216;user_id_validation_string&#8217; <span>&#8216;^[0-9]{1,2}$&#8217; qui impose un entier fait de deux chiffres au maximum.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/181/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Optimisation de TileCache</title>
		<link>http://www.neogeo-online.net/blog/archives/84/</link>
		<comments>http://www.neogeo-online.net/blog/archives/84/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 17:59:14 +0000</pubDate>
		<dc:creator>Guillaume</dc:creator>
				<category><![CDATA[GeoHacks]]></category>
		<category><![CDATA[Optimisation & performances]]></category>
		<category><![CDATA[Web mapping]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Mapserver]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TileCache]]></category>
		<category><![CDATA[WMS]]></category>

		<guid isPermaLink="false">http://www.neogeo-online.net/archives/84/</guid>
		<description><![CDATA[TileCache est un logiciel qui permet de créer un cache local d&#8217;une ressource WMS locale ou distante (du point de vue d&#8217;un serveur), afin d&#8217;en optimiser l&#8217;accès. Il est d&#8217;une simplicité déconcertante et d&#8217;une efficacité redoutable. Si l&#8217;installation et la mise en route sont faciles, il faut quand-même faire quelques réglages pour obtenir des performances [...]]]></description>
			<content:encoded><![CDATA[<p><strong> </strong><a title="Le site de tileCache" href="http://www.tilecache.org/" target="_blank"><strong>TileCache</strong></a> est un logiciel qui permet de créer un cache local d&#8217;une ressource WMS locale ou distante (du point de vue d&#8217;un serveur), afin d&#8217;en optimiser l&#8217;accès. Il est d&#8217;une simplicité déconcertante et d&#8217;une efficacité redoutable. Si l&#8217;installation et la mise en route sont faciles, il faut quand-même faire quelques réglages pour obtenir des performances optimales. Je vous propose donc un petit résumé de ces étapes, inspiré d&#8217;un <a title="Tutoriel TileCache" href="http://docs.codehaus.org/display/GEOSDOC/TileCache+Tutorial" target="_blank">tutoriel</a> en anglais et de mon expérience personnelle.</p>
<ol type="I">
<li>
<p style="margin-bottom: 0cm" align="justify"><strong>L&#8217;installation</strong></p>
</li>
</ol>
<p align="justify">Simplissime ! Récupérez une archive des sources sur le site  de tilecache (<a href="http://www.tilecache.org/">http://www.tilecache.org/</a>), et décompressez-la dans un répertoire publié sur le web (/tilecache dans ce qui suit).</p>
<p style="margin-bottom: 0cm" align="justify">Autorisez l&#8217;exécution des cgi pour ce répertoire :</p>
<p style="margin-left: 2.01cm; margin-bottom: 0cm" align="justify">&lt;Directory /usr/local/apache2/htdocs/tilecache&gt;<br />
AddHandler cgi-script .cgi<br />
Options +ExecCGI<br />
&lt;/Directory&gt;</p>
<p style="margin-bottom: 0cm" align="justify">
<p style="margin-bottom: 0cm" align="justify">Editez le fichier tilecache.cfg et spécifiez un répertoire de stockage des dalles, par exemple :</p>
<p style="margin-bottom: 0cm" align="justify">base=/usr/local/apache2/htdocs/tileFolder</p>
<p style="margin-bottom: 0cm" align="justify">(NB : ce répertoire doit exister et être accessible en écriture à l&#8217;utilisateur apache).</p>
<p style="margin-bottom: 0cm" align="justify">Vous pouvez déjà tester en chargeant la page http://nom_du_serveur/tilecache/. Vous devriez voir apparaître une interface OpenLayers avec une carte du monde. Vérifiez le contenu de votre répertoire de stockage, vous devriez y voir un sous-répertoire « basic », nom de la couche WMS chargée par défaut, contenant des sous-répertoires numérotés.</p>
<p style="margin-bottom: 0cm" align="justify">Arrivé là, vous êtes déjà en train de mettre en cache les couches WMS que vous exploitez. Le reste n&#8217;est donc plus qu&#8217;une question d&#8217;optimisation.</p>
<p style="margin-bottom: 0cm" align="justify">
<ol type="I">
<li>
<p style="margin-bottom: 0cm" align="justify"><strong>La configuration des ressources WMS.</strong></p>
</li>
</ol>
<p style="margin-bottom: 0cm" align="justify">Vous avez sans doute d&#8217;autres données à exploiter que les données proposées par défaut. Pour cela, il faut rajouter ces entrées dans le fichier tilecache.cfg, en commençant par le nom de la ressource (layername) entre crochets. A noter que le nom que vous donnez à la ressource est complètement libre, mais que c&#8217;est lui que vous devrez utiliser lors des appels à TileCache, depuis OpenLayers par exemple. Voici un exemple complet de configuration d&#8217;une ressource :</p>
<p style="margin-bottom: 0cm" align="justify"><span><span style="font-size: x-small;">[geosignal]<br />
type=WMS<br />
url=http://www.geosignal.org/cgi-bin/wmsmap<br />
bbox=-50000,1200000,1400000,2700000<br />
extent_type=loose<br />
extension=png<br />
layers=RASTER4000K,RASTER1000K,RASTER500K,RASTER250K,\<br />
RASTER100K,RASTER50K,RASTER25K,RASTER5K<br />
resolutions=2116.666666667,1058.333333333,529.166666667,\<br />
264.583333333,132.291666667,66.145833333,26.458333333,\<br />
13.229166668,6.614583334,2.645833334,1.322916667<br />
levels=11<br />
srs=EPSG:27572</span></span></p>
<p style="margin-bottom: 0cm" align="justify">La pluplart des paramètres sont facilement compréhensibles. Après la bbox cependant, on trouve un extent_type=loose. Il sert à autoriser la création de dalles en dehors de la bbox. Pratique pour éviter les dalles roses dans OpenLayers, quand l&#8217;étendue de la carte est plus grande que celle de votre ressource. L&#8217;omettre pour forcer les requêtes à se situer dans la bbox. Quant aux résolutions, c&#8217;est une manière d&#8217;exprimer les échelles. On peut les calculer assez facilement (hmmm&#8230;) : les dalles par défaut font 256&#215;256 px. Si les images issues du serveur WMS sont en 96 dpi, chaque dalle fera donc (256/96) = 2,666666667 pouces, soit 2,666666667 x 2.54 = 6,773333333 cm. Au 100000e, cela représente donc  6773,333333 mètres, ce qui ramène à  (6773,333333/256) = 26,458333333 m/pixel. La résolution pour le 100000e est donc de 26,45833333, et on peut alors facilement calculer les autres par simple péréquation.</p>
<p style="margin-bottom: 0cm" align="justify">Une autre option peut s&#8217;avérer utile, c&#8217;est metaTile=true. Elle permet d&#8217;envoyer des requêtes sur de larges extents, qui sont ensuite redécoupées en 256 x 256. C&#8217;est pratique à plus d&#8217;un titre. D&#8217;une part c&#8217;est souvent plus rapide de faire une requête que 25 (la metaTile fait 5 x 5 dalles de base par défaut), même si l&#8217;image est plus grosse. D&#8217;autre part ça diminue le problème du chevauchement des labels entre dalles contigües, puisque cet effet de bord n&#8217;apparaît plus désormais qu&#8217;en frontières des grandes tuiles, donc 5 fois moins souvent (20 faces externes au lieu de 100). Elle nécessite cependant l&#8217;installation (si ce n&#8217;est pas déjà le cas) de la librairie Image de Python (<a href="http://www.pythonware.com/products/pil/">http://www.pythonware.com/products/pil/</a>) qui fait le travail de découpe. Malheureusement, elle ne gère pas les PNG entrelacés, et cette option ne pourra donc pas fonctionner si la ressource WMS diffuse ses images dans ce format. Pour <a href="http://mapserver.gis.umn.edu/docs/faq/faqsection_view?section=Map%20Output" target="_blank">MapServer</a>, il faut ajouter un FORMATOPTION &laquo;&nbsp;INTERLACE=OFF&nbsp;&raquo; dans la définition de l&#8217;outputformat PNG.</p>
<ol type="I">
<li>
<p style="margin-bottom: 0cm" align="justify"><strong>Optimisation 	1, utiliser mod_python.</strong></p>
</li>
</ol>
<p style="margin-bottom: 0cm" align="justify">TileCache est un programme en python, configuré par défaut pour être exécuté en mode cgi, c&#8217;est-à-dire qu&#8217;Apache charge à chaque requête l&#8217;exécutable python qui traite le fichier tilecache.cgi. C&#8217;est un peu lent. Il vaut mieux charger python dans Apache avec mod_python (à activer dans la liste des modules du httpd.conf, ou à compiler et installer directement) car le fichier est alors directement interprété par l&#8217;extension python d&#8217;Apache, résidente en mémoire.</p>
<p style="margin-bottom: 0cm" align="left">Donc ajoutez à votre fichier httpd.conf :</p>
<p style="margin-bottom: 0cm" align="left">LoadModule python_module        modules/mod_python.so</p>
<p style="margin-bottom: 0cm" align="justify">Pas de tilecache.py dans votre répertoire tilecache ? Il suffit en fait de renommer le fichier tilecache.cgi en .py . Il faut par contre aussi adapter votre httpd.conf. La configuration du répertoire tilecache devient :</p>
<p style="margin-bottom: 0cm" align="justify">&lt;Directory /usr/local/apache2/htdocs/tilecache&gt;<br />
AddHandler python-program .py<br />
PythonHandler TileCache.Service<br />
PythonOption TileCacheConfig /usr/local/apache2/htdocs/tilecache/tilecache.cfg<br />
&lt;/Directory&gt;</p>
<p style="margin-bottom: 0cm" align="justify">Petite précaution : maintenant que python et tilecache.py sont résidents en mémoire, il vous faudra redémarrer Apache à chaque modification du fichier de configuration de TileCache, qui est devenu une sorte de prolongement d&#8217;Apache&#8230; Il vaut donc mieux avoir bien configuré toutes ses ressources avant cette étape.</p>
<p style="margin-bottom: 0cm" align="justify">Comparez à présent le fonctionnement de votre TileCache, les performances devraient être sensiblement supérieures.</p>
<p style="margin-bottom: 0cm" align="justify">
<ol type="I">
<li>
<p style="margin-bottom: 0cm" align="justify"><strong>Optimisation 	2, pré-remplir le cache.</strong></p>
</li>
</ol>
<p style="margin-bottom: 0cm" align="justify">L&#8217;intérêt de cette étape dépend du nombre d&#8217;échelles de vos données WMS, ainsi que de leur utilisation. Inutile de pré-générer la France au 5000e si peu d&#8217;utilisateurs s&#8217;en servent. Mais il est souvent agréable d&#8217;avoir les 2-3 premiers niveaux pré-générés. Pour ce faire, utilisez le petit programme tilecache_seed.py ainsi :</p>
<p style="margin-bottom: 0cm" align="justify">python tilecache_seed.py &#8216;url_du_serveur_WMS&#8217; nom_de_la_ressource niveau_de_depart niveau_de_fin</p>
<p style="margin-bottom: 0cm" align="justify">ce qui donne pour notre ressource définie plus haut :</p>
<p style="margin-bottom: 0cm" align="justify">python tilecache_seed.py &#8216;http://www.geosignal.org/cgi-bin/wmsmap&#8217; geosignal 0 2</p>
<p style="margin-bottom: 0cm" align="justify">Cela générera toutes les dalles pour les niveaux 0,1 et 2 de la ressource « geosignal », soit les trois premières résolutions décrites dans le fichier tilecache.cfg. Il faut bien veiller à utliser le même nom de ressource que dans le  tilecache.cfg.</p>
<p style="margin-bottom: 0cm" align="justify">Une fois la pré-génération réalisée, l&#8217;affichage sur ces premiers niveaux devrait être beaucoup plus fluide.</p>
<p style="margin-bottom: 0cm" align="justify">
<ol type="I">
<li>
<p style="margin-bottom: 0cm" align="justify"><strong>Optimisation 	3, forcer le cache client.</strong></p>
</li>
</ol>
<p style="margin-bottom: 0cm" align="justify">Vous remarquerez toutefois qu&#8217;en revenant sur un niveau de zoom déjà consulté, les images sont le plus souvent rechargées depuis le serveur. Dommage puisqu&#8217;elles sont déjà dans le cache client.     Mais celui-ci (le navigateur) ne sait pas qu&#8217;elles sont encore valides. Il faut donc l&#8217;aider à le savoir. Pour ce faire, il faut utiliser le module Apache mod_expires. Il n&#8217;est pas chargé par défaut, mais peut l&#8217;être facilement en dé-commentant ou ajoutant un LoadModule mod_expires dans le httpd.conf si vous avez un version packagée. Par contre, si vous avez compilé Apache vous-même, il faudra le recompiler avec les options &#8211;enable-headers &#8211;enable-expires. Oui, j&#8217;aurais pu le dire avant&#8230; Mais Apache est votre ami, lors d&#8217;une réinstallation, le make install n&#8217;écrase que les exécutables et préserve le fichier de configuration, les modules et le contenu de cgi-bin. Donc tout va bien.</p>
<p style="margin-bottom: 0cm" align="justify">Une fois l&#8217;installation réalisée, il faut régler la durée de mise en cache dans la configuration Apache du répertoire tilecache. Rééditez donc à nouveau le httpd.conf et ajoutez dans la section Directory concernant tilecache :</p>
<p style="margin-bottom: 0cm" align="justify">ExpiresActive on<br />
ExpiresDefault &laquo;&nbsp;access plus 6 months&nbsp;&raquo;</p>
<p style="margin-bottom: 0cm" align="justify">La durée de mise en cache peut se régler finement. Voir la documentation du module Expires pour cela. Tout dépend de la durée de vie des données sources. Si elles sont soumises à une mise à jour quotidienne, on pourra se contenter d&#8217;un ExpiresDefault &laquo;&nbsp;access plus 6 hours&nbsp;&raquo; . A noter que ceci n&#8217;a aucune incidence sur le contenu du cache serveur. Donc si les données sont mises à jour quotidiennement, il faut également purger le cache serveur tous les jours !</p>
<p style="margin-bottom: 0cm" align="justify">A l&#8217;issue de cette dernière étape, comment dire, après quelques allers-retours entre niveaux de zooms différents, l&#8217;affichage devient quasi-instantané !</p>
<ol type="I">
<li>
<p style="margin-bottom: 0cm" align="justify"><strong>Optimisation 	4, simuler plusieurs serveurs.</strong></p>
</li>
</ol>
<p style="margin-bottom: 0cm" align="justify">La plupart des navigateurs n&#8217;effectuent pas plus de deux requêtes simultanées sur un même serveur, mais peuvent par contre en effectuer beaucoup plus vers plusieurs serveurs. En déclarant auprès de votre hébergeur de nouveaux noms de domaines (data1.myserveur.com, data2.myserveur.com, data3.myserveur.com&#8230;) pointant tous vers la même IP, les navigateurs pourront alors charger les dalles beaucoup plus vite, pour peu que l&#8217;application web que vous utilisez prenne en charge ce genre de requête. Avec OpenLayers il suffit de déclarer non plus une URL, mais un tableau d&#8217;URL :</p>
<pre style="text-align: justify">wms_sigma = new OpenLayers.Layer.WMS( "TIGER",
["http://sigma4.openplans.org/tilecache-1.3/tilecache.py?",
"http://sigma3.openplans.org/tilecache-1.3/tilecache.py?",
"http://sigma2.openplans.org/tilecache-1.3/tilecache.py?",
"http://sigma1.openplans.org/tilecache-1.3/tilecache.py?"],
{layers: 'sigma' }, {numZoomLevels: 17});</pre>
<p style="margin-bottom: 0cm" align="justify">Si avec tout ça vous allez encore moins vite que GoogleMaps, il ne vous reste plus qu&#8217;à acheter un serveur avec 36 Go de RAM et charger votre cache directement dedans. Car TileCache en est également capable !</p>
<p style="margin-bottom: 0cm" align="justify"><a title="Version PDF" href="http://www.neogeo-online.net/blog/wp-content/uploads/2008/tilecache.pdf" target="_blank">Version PDF.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neogeo-online.net/blog/archives/84/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
	</channel>
</rss>

