Mercator 10.7 ou ultérieur permet de fixer la sortie d'un rapport sous la forme d'une carte.
L'intégration est effectuée avec les cartes Bing (Microsoft). Pour disposer de cette fonctionnalité, il faut disposer d'une clé que l'on peut obtenir sur le portail de Bing. Cette clé doit être placée dans l'option "Outils > Options > Autres : Clé pour cartes Bing" (id=BING_KEY).
Pour activer ce type de rapport, il faut fixer cette propriété dans l'écran de paramétrage du reporting :
La carte est automatiquement centrée et zoomée en fonction des punaises à afficher. Il est possible d'exporter l'image ou de la copier via le menu contextuel.
Nous développons ici un exemple qui consiste à montrer sur la carte les dix clients les plus proches d'une localisation fixe. Cet exemple pré-suppose que les coordonnées de tous les clients ont été générées et stockées dans les colonnes C_LAT et C_LONG.
La requête SQL est la suivante :
declare @g geography
set @g='POINT(4.9202461 50.5901462)'
select top 10 c_id,c_lat as latitude,c_long as longitude,c_nom,c_adresse,c_adresse2,rtrim(c_codep) + ' ' + c_ville as ville
from CLI
where (c_sommeil=0) and not(c_lat=0 and c_long=0)
order by @g.STDistance(geography::Point(c_lat, c_long, 4326))
Il faut noter ceci :
- le résultat doit obligatoirement reprendre les colonnes latitude et longitude (float)
- une carte ne considère qu'une seule DataTable. Dès lors, il n'est pas utile de spécifier plusieurs select.
A ce stade, le résultat est une carte avec les punaises correctement positionnées, mais sans aucune information ni comportement supplémentaire.
La suite du paramétrage se fait dans le customizer du rapport. L'exemple ci-dessous montre comment associer un tooltip à chaque punaise, avec les coordonnées du client. Cette punaise permettra aussi par clic, d'accéder directement à la fiche du client. Ce code implémente l'interface MercatorUi.ICustomizers.INewPinInReportingMapForm.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorController;
namespace MercatorUi.Reporting
{
public class Customizer : MercatorUi.ICustomizers.INewPinInReportingMapForm
{
public void NewPinInReportingMapForm(_BaseClasses.Pin pin)
{
pin.Disposing += pin_Disposing;
pin.Click += pin_Click;
string s = pin.DataRow["c_nom"].ToString() + "\r\n" + pin.DataRow["c_adresse"].ToString();
if (!pin.DataRow["c_adresse2"].Equals(""))
s += "\r\n" + pin.DataRow["c_adresse2"].ToString();
s += "\r\n" + pin.DataRow["ville"].ToString();
pin.SetToolTip(s);
}
void pin_Disposing(object sender, EventArgs e)
{
var pin = (_BaseClasses.Pin)sender;
pin.Disposing -= pin_Disposing;
pin.Click -= pin_Click;
}
void pin_Click(object sender, EventArgs e)
{
var pin = (_BaseClasses.Pin)sender;
MercatorUi.Globals.Main.ShowSigInInThread(MercatorUi.Sig._SigEnum.CLI, pin.DataRow["c_id"].ToString());
}
}
}
Si ce code est édité dans Visual Studio, il est nécessaire d'ajouter une référence vers Microsoft.Maps.MapControl.WPF.dll qui se trouve dans le répertoire principal de Mercator.
L'exemple complet illustré ici est disponible dans le fichier zip ci-dessous.
Dans la requête SQL, il est possible de remplacer le point de coordonnées fixe par le paramètre @POSITION_1. Dès lors, Mercator demandera à l'utilisateur de saisir une information, lieu ou adresse, permettant d'obtenir des coordonnées géographiques par géocodage, qui seront utilisées.
La requête SQL devient :
select top 10 c_id,c_lat as latitude,c_long as longitude,c_nom,c_adresse,c_adresse2,rtrim(c_codep) + ' ' + c_ville as ville
from CLI
where (c_sommeil=0) and not(c_lat=0 and c_long=0)
order by @POSITION_1.STDistance(geography::Point(c_lat, c_long, 4326))
A télécharger :
0000002961.zip (4 Kb - 10/01/2020)