Accueil Nos publications Blog SoBIz, Business Intelligence et cartes interactives

SoBIz, Business Intelligence et cartes interactives

Logo SoBIz

Je vous présente l’application SoBIz, la seconde application de référence en Silverlight, qui a servi de sujet à mon stage, démo accessible sur sobiz.soat.fr. Comme HappyNet, elle repose sur les bases de données d’exemple de la chaîne de magasins AdventureWorks, mais permet de s’intéresser cette fois au domaine de l’informatique décisionnelle. Pour y accéder, cliquez sur le logo et pour en savoir plus, c’est dans la suite !

Y’a quoi dedans ?

L’application en elle-même est composée de plusieurs pages :

La page d’accueil se présente sous la forme d’un tableau de bord qui propose différents indicateurs et graphiques comparatifs pertinents pour la société. Capture d'écran de la page d'accueil
L’explorateur de rapports : le coeur de l’application permet de parcourir les différentes dimensions du cube OLAP associé à l’application et d’accéder à des rapports et graphiques (cartes, histogrammes, camemberts…). Capture d'écran de l'explorateur
La page “widget carte” qui a pour but de présenter, de parcourir et de manipuler (filtrer, détailler) quelques données de ventes affichées sur une carte. Capture d'écran du widget carte

Cette application permet d’aborder brièvement deux nouveaux points techniques pour le développement d’applications orientées informatique décisionnelle en Silverlight : l’accès aux données de cubes OLAP par Analysis Services et l’utilisation du contrôle de carte Bing Maps.

Business Intelligence, cubes OLAP et ADOMD.NET

Kézako ?

En deux mots :

L’Informatique décisionnelle, ou Business Intelligence, désigne les outils et les moyens mis en oeuvre par une entreprise pour fournir une aide à la décision aux responsables de la stratégie de l’entreprise.

Ces outils s’appuient la plupart du temps sur des données centralisées et uniformisées, stockées dans des datawarehouse. Ces données constituent les dimensions et les mesures du cube.

Les mesures sont les propriétés qui contiennent les informations utiles et auxquelles on peut appliquer des calculs (moyenne, min, max…). Par exemple, les données numériques telles que les montants des ventes sont des mesures. Les dimensions (aussi appelées axes d’analyse) désignent les propriétés qui permettent de catégoriser, grouper et filtrer les données. Par exemple, la dimension temps permet d’analyser les ventes par mois, par jour…

Schéma d'un cube OLAP

Pour créer un cube OLAP que l’on peut explorer et parcourir, il faut choisir une (ou plusieurs) mesures à analyser, et au moins une dimension pour l’analyser. Dans le cube d’exemple ci-contre, on a choisi d’étudier une mesure (par exemple le nombre de clients) en fonction de 3 axes d’analyse : le temps (par exemple les différents mois), la géographie (par exemple les différents pays) et les produits (les différentes catégories). Chaque petit cube représente ainsi le nombre de clients à l’intersection des valeurs des 3 dimensions : par exemple, le nombre de clients ayant acheté un vélo (dimension produit) en juillet 2010 (dimension temps) en France (dimension géographie).

La solution que Microsoft propose pour la création et la manipulation de cubes OLAP s’appelle Analysis Services (ou SSAS pour SQL Server Analysis Services).

Et ça sert à quoi ?

Les applications BI ont plusieurs buts, mais le principal reste de permettre aux décideurs de comprendre les causes des évènements passés ou actuels de l’entreprise et d’anticiper, à l’aide des données collectées, ce qui pourrait se passer dans le futur, pour ainsi prendre des décisions appropriées et adaptées.

Comment j’accède à tout ça dans mon code ?

Comme Microsoft a pensé à tout, on dispose en C# du modèle de données ADOMD.NET qui permet de communiquer facilement avec nos cubes sous Analysis Services.

Dans le cas de SoBIz, on a besoin dans un premier temps de récupérer les différentes mesures, dimensions et hiérarchies présentes dans le cube. Pour les rapports, on a également besoin de récupérer les données associées à un certain couple dimension/mesure. Tout cela se fait dans les couches d’accès aux données de nos Web services, grâce aux classes de Microsoft.AnalysisServices.AdomdClient :


using (AdomdConnection connection = new AdomdConnection(ConfigurationManager.ConnectionStrings["SoBIzCube"].ConnectionString))
{
connection.Open();
CubeDef adventureWorksCube = connection.Cubes[ConfigurationManager.AppSettings["CubeName"]];
foreach (Microsoft.AnalysisServices.AdomdClient.Dimension dim in adventureWorksCube.Dimensions)
{
dimensions.Add(dim);
}
}

Dans cet exemple, on récupère les informations des dimensions du cube.

Bing Maps, la cartographie par Microsoft

Le contrôle Bing Maps en Silverlight est mis à notre disposition par Microsoft et nous permet d’afficher et d’utiliser des cartes Bing (à la fois les vues aériennes et les tracés des voies) dans nos applications.

Pour l’utiliser, il faut disposer d’une clé développeur (que l’on peut créer gratuitement à cette adresse), et télecharger l’installeur du contrôle . Une fois notre clé développeur stockée dans un de nos fichiers de ressources, les DLL référencées et le namespace XAML ajouté, on peut insérer une carte dans une page en XAML :


<UserControl xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl" ...>
...
<m:Map x:Name="BingMapsControl" Mode="Road" CredentialsProvider="{StaticResource BingMapsCredentials}"/>

Affichage d’éléments sur la carte

Exemple de punaise sur la carte

Pour afficher un élément géolocalisé sur la carte, il faut connaître ses coordonnées (latitude et longitude), et utiliser la propriété attachée Position, comme dans l’exemple suivant, où l’on affiche un contrôle de type “punaise” fourni avec la carte :


<m:Map x:Name="BingMapsControl" CredentialsProvider="{StaticResource BingMapsCredentials}" Mode="Aerial">
<m:Pushpin m:MapLayer.Position="48.84086,2.393580" Foreground="#FF99CF16"/>
</m:Map>

Pour afficher les éléments issus d’une collection, on utilise l’ItemsControl spécifique à la carte (pour pouvoir utiliser les propriétés attachées Position) : MapItemsControl.

<m:Map x:Name="BingMapsControl" CredentialsProvider="{StaticResource BingMapsCredentials}" Mode="Road">
<m:MapLayer x:Name="BingMapsLayer">
<m:MapItemsControl x:Name="PushpinsItemsControl" ItemsSource="{Binding Pushpins}">
<m:MapItemsControl.ItemTemplate>
<DataTemplate>
<m:Pushpin m:MapLayer.Position="{Binding Position}" />
</DataTemplate>
</m:MapItemsControl.ItemTemplate>
</m:MapItemsControl>
</m:MapLayer>
</m:Map>

Il peut être intéressant d’utiliser une liste de ViewModels pour la collection Pushpins, par exemple pour pouvoir lier des fonctionnalités métier aux indicateurs. Dans ce cas, on utilisera plutôt comme template un ContentControl dont le contenu sera bindé sur la vue associée aux ViewModels :

<m:Map x:Name="BingMapsControl" CredentialsProvider="{StaticResource BingMapsCredentials}" Mode="Road">
<m:MapLayer x:Name="BingMapsLayer">
<m:MapItemsControl x:Name="PushpinsItemsControl" ItemsSource="{Binding Pushpins}">
<m:MapItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl m:MapLayer.Position="{Binding Position}" Content="{Binding View}"/>
</DataTemplate>
</m:MapItemsControl.ItemTemplate>
</m:MapItemsControl>
</m:MapLayer>
</m:Map>

Les Web services Bing Maps

Les services Web Bing Maps (WCF) permettent de récupérer les coordonnées géographiques d’un lieu (service Geocoding) et d’effectuer différentes recherches sur une carte (service Search). Là encore, il faudra se munir de sa clé développeur Bing Maps, et ajouter à nos projets des références vers ces services.

Celui qui nous intéresse particulièrement ici est celui de Geocoding, accessible à cette adresse. Il nous permettra de placer sur la carte les différents pays et villes pour lesquels on dispose de données de vente. La classe importante à laquelle s’intéresser est GeocodeRequest :

GeocodeRequest geocodeRequest = new GeocodeRequest();

// On renseigne la clé développeur
geocodeRequest.Credentials = new Credentials();
geocodeRequest.Credentials.ApplicationId = BING_KEY;

// On renseigne le lieu que l'on recherche
geocodeRequest.Query = address;

// On ne veut que des résultats sûrs
ConfidenceFilter[] filters = new ConfidenceFilter[1];
filters[0] = new ConfidenceFilter();
filters[0].MinimumConfidence = Confidence.High;

GeocodeOptions geocodeOptions = new GeocodeOptions();
geocodeOptions.Filters = filters;

geocodeRequest.Options = geocodeOptions;

// Lancement de la requête
GeocodeServiceClient geocodeService = new GeocodeServiceClient(BING_GEOCODE_ENDPOINT);
GeocodeResponse geocodeResponse = geocodeService.Geocode(geocodeRequest);

// Traitement de la réponse
if (geocodeResponse != null &amp;amp;&amp;amp; geocodeResponse.Results != null &amp;amp;&amp;amp; geocodeResponse.Results.Count() > 0)
{
geomod = new GeolocalisationModel()
{
NamePlace = address,
Position = geocodeResponse.Results[0].Locations[0],
BestView = geocodeResponse.Results[0].BestView
};
}

Ici, on utilise simplement la propriété Query pour renseigner le nom de l’entité que l’on cherche (que ça soit une ville, un pays, une rue…). On peut aussi renseigner plus finement l’emplacement que l’on recherche grâce à la propriété Address de GeocodeRequest et la classe Address (l’une ou l’autre de ces propriétés doit être renseignée pour que la requête aboutisse).

Pour SoBIz, on utilise en plus un système de cache pour ne pas faire appel aux services Bing trop souvent : on stocke les coordonnées des lieux qui ont déjà été cherchés et au moment de faire une nouvelle requête, on regarde d’abord si on ne connaît pas déjà les coordonnées de ce lieu.

Pilotage de la carte

Le contrôle Map propose enfin plusieurs méthodes intéressantes pour piloter la carte elle-même.

Par exemple, elle permet de centrer et de zoomer la vue sur un rectangle de coordonnées données. Ca tombe bien : pour chaque recherche, les Web services Bing Maps nous permettent de récupérer un rectangle appelé “BestView” qui contient le lieu désiré. Il est donc facile de centrer la carte sur ce rectangle, grâce à la méthode SetView :

BingMapsControl.SetView(Result.BestView);

Parfois, cette vue n’est pas optimale. Par exemple, pour SoBIz, ils nous arrive d’afficher la répartition des ventes en Europe pour les 3 pays d’Europe pour lesquels on a des données : la France, l’Allemagne et le Royaume-Uni. L’approche initiale consistait à centrer la vue sur toute l’Europe pour s’assurer de bien voir toutes les données, mais ce “cadrage” était trop large et pas adapté. Heureusement, on peut créer un rectangle à partir d’une liste de coordonnées ! On peut ainsi centrer la carte sur les éléments de la collection Pushpins quand le contenu de celle-ci change :

List<Microsoft.Maps.MapControl.Location> positions = new List<Location>();
foreach (IMapPushpinViewModel pushpin in Pushpins)
{
positions.Add(pushpin.Position);
}
BingMapsControl.SetView(new LocationRect(positions));

La vue est alors plus adaptée :

Ressources supplémentaires

OLAP et Analysis Services

Bing Maps