Le blog francophone consacré
aux technologies Esri

Passer ses fonds de cartes en niveaux de gris - 3/4


Je poursuis ma série d'articles consacrés à l'utilisation de fonds de cartes en nuances de gris dans les applications web ArcGIS. Aujourd'hui, je vais me focaliser sur les applications Silverlight et WPF.

Silverlight (et WPF) permet de modifier le rendu des pixels pour tout élément d'interface (UI Element) avant qu'il soit affiché dans l'application. Pour cela, on doit utiliser une notion spécifique à Silverlight/WPF: les Shader Effects. Ces derniers permettent, par exemple, d'appliquer des effets comme des ombrages, des flous, des nuances de gris, etc... Silverlight (et WPF) possède des effets par défaut, tels que Shadow (ombrage) et Blur (flou), qui peuvent être appliqués directement à un élément dans la partie XAML. Mécanisme très puissant, en créant des objets PixelShader et en jouant sur les algorithmes, vous pouvez obtenir à peu près n'importe quel rendu.

Lors de l'affichage d'une carte, le contrôle de carte de l'API ArcGIS for Silverlight (ou WPF) reçoit des images issues du service (dynamique ou tuilé) ArcGIS Server. Esri a prévu la possibilité pour les couches de type ArcGISImageServiceLayer, ArcGISDynamicMapServiceLayer et ArcGISTiledMapServiceLayer, de pouvoir leur appliquer ce type d'effet (System.Windows.Media.Effects.Effect). On notera également le contrôle de carte de l'API ArcGIS propose la propriété Effect, ce qui permet d'appliquer un effet à l'ensemble de la carte.

La méthode est donc relativement simple, votre application devra dans un premier temps créer votre propre classe héritant de ShaderEffects en décrivant la transformation de pixel à appliquer. Ensuite, il suffira d'appliquer cet effet aux couches souhaitées dans votre application.

Installer le SDK Direct X et créer le Shader Effect

Pour pouvoir créer des Shader Effects, vous devez préalablement installer le SDK DirectX (que vous trouverez ici). Une fois installé, vous allez pouvoir créer dans votre solution Silverlight (ou WPF) un nouveau projet (MyShader) de type Class Library pour définir votre effet.


Dans ce projet, vous ajouterez les références suivantes : PresentationCore, PresentationFramework, et WindowsBase. La description de l'algorithme nécessite l'usage du langage HLSL (High Level Shader Language) qui est un des composants du SDK DirectX. La vidéo suivante décrit cette étape.


Ci-dessous le contenu du fichier myShaderEffect.fx pour obtenir un effet de nuance de gris. Les coefficients peuvent être modifiés pour obtenir des variantes:


Dans Visual Studio, sélectionnez le projet MyShader et modifiez les propriétés du projet pour inclure une commande de pré compilation. Cela permettra de compiler le fichier .fx (en fichier .ps) pour être utiliser lors de l'exécution de l'application.

Modifier le Pre-build event command en mettant la ligne de commande suivante :
"$(DXSDK_DIR)Utilities\Bin\x86\fxc.exe" /T ps_2_0 /E main /Fo"$(SolutionDir)MyShader\myshadereffect.ps" "$(SolutionDir)MyShader\myshadereffect.fx"


Dans le projet MyShader, il ne vous plus qu'à modifier le code C# de la classe MyShader de la manière suivante:


Utiliser le Shader Effect

Le Pixel Shader Effect étant prêt, il reste à l'utiliser dans notre application Silverlight. Dans le projet Silverlight (ou WPF) de votre application SIG, vous ajouterez une référence au projet MyShader, puis vous modifierez la déclaration XAML de votre fond de carte de la manière suivante (ici on ajoute l'effet sur un service de type ArcGISTiledMapServiceLayer):


Votre application propose désormais un fond de carte en nuances de gris. Je vous propose ci-dessous deux applications d'illustration. La première est basée sur le fond de carte FranceRaster et un service dynamique (lignes de bus sur Besançon). La seconde est basée sur un fond de carte ArcGIS Online World Street Map et un second service tuilé (Corine Land Cover) que l'on a laissé en couleur. Le code source de cette dernière est disponible ici.




Partager cet article:

Rejoindre la discussion

    Les commentaires à propos de cet article:

3 comments :

fcebron a dit…

Y a t il moyen de faire quelque chose de similaire sous ArcGIS Desktop ?

Gaëtan Lavenu a dit…

Bonjour,

Oui, des solutions peuvent s'imaginer pour obtenir ce genre de rendu dans ArcGIs for Desktop. Cependant, leur implémentation est plus complexe car il vous faudra développer une "custom layer" c'est à dire un nouveau type de couche permettant de définir ses propres comportements sur la couche comme, par exemple, appliquer une transformation des pixels au moment de l'affichage. L'aide en ligne du SDK ArcObjects explique la notion de "custom layer" ici:
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Creating_custom_layers/0001000003v4000000/

Gaëtan Lavenu a dit…

Si vous disposez d'ArcGIS Desktop 10, une solution intéressante et sans développement est proposée sur le blog Mapping Center d'Esri:

http://blogs.esri.com/Support/blogs/mappingcenter/archive/2011/11/18/Creating-a-Grayscale-Version-of-Any-ArcGIS-Online-Basemap.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+MappingCenter+%28Mapping+Center%29