A travers cette session nous allons aborder les bases de l’exploitation de la cartographie au sein des périphériques Windows Phone 8 et Windows 8 pour comprendre comment exploiter ses capacités de présentation et de visualisation avancées au sein de contrôles interactifs. Nous suivrons un cas concret et pratique que nous implémenterons en scénario de mobilité et que nous étendrons en termes de fonctionnalités à l’aide de traitements serveur spécifiques et répondre ainsi à des cas d’usage réels tels que la gestion de livraison et l’optimisation de tournée, la recherche dans des zones de chalandise, de recherche le long d’un itinéraire. Cas pratiques, architecture et implémentation technique, cette session s’adresse aux développeurs et aux décideurs souhaitant aller beaucoup plus loin et compléter l’expérience locale dans les applications mobiles.
Speakers : Jonathan Antoine (MVP), Nicolas Boonaert (MVP)
L’atout cartographie en mobilité : implémentation pratique et cas concrets
1.
2. L'atout cartographie en
mobilité
implémentation pratique et cas concrets
Jonathan Antoine
MVP
Infinite Square
Nicolas Boonaert
MVP
Wygwam
jantoine@infinitesquare.com
nicolas.boonaert@wygwam.com
Code/Développement
4. Agenda
• Contexte
• Grand public : Application WP8
• Central d’appel : Application Windows 8.1
• Dépanneur : Application WP8
• Conclusions
#mstechdays
Code/Développement
5. Infinite Square stand 19
Société de conseil, expertise, réalisation, formation, spécialisée dans le développement d’applications logicielles
innovantes sur les technologies Microsoft
100% des consultants certifiés Microsoft, parmi lesquels 10 MVP et 2 Nokia Champions
GOLD CertifiedPartner sur 5 domaines de compétences
Centre de formation agrée
#mstechdays
Infinite Square aux TechDays 2014
6. Wygwam stand 40
Wygwam est un pure player Microsoft, Gold Partner délivrant des services de
Conseil/Expertise, design, développement et formation à nos clients Grands
Comptes, PME et éditeurs de logiciels.
Société à taille humaine, innovante et fondée sur des valeurs, nos
collaborateurs sont réactifs, passionnés.
Wygwam vous accompagne dans ces domaines:
Stratégies digitales et mobiles : Windows 8, e-commerce, applications et sites web,
Windows Phone
Travail collaboratif : SharePoint, Réseaux Sociaux d'Entreprise
NUI, design d'interaction, Azure, BI, ALM et cartographie.
#mstechdays
Code/Développement
8. Contexte – Présentation du scénario
Grand public
Windows Phone 8
#mstechdays
Central d’assurance
Windows 8
Code/Développement
Dépanneur
Windows Phone 8
9. Contexte – Un regard technique
Clients applicatifs
Plateforme Azure
Base de données
API d’exposition
SQL Azure (SQL Server 2012)
Hosté au sein d’un service Azure
Utilisation du type
géographique
Instance dédiée
Entity
Framework
Grand public
Windows Phone 8
Web API
Controller
Central d’assurance
Windows 8
Dépanneur
Windows Phone 8
#mstechdays
Code/Développement
11. Grand public – WP8 - Fonctionnalités
• Affichage du trafic temps réel et position de
l’utilisateur
• Déclaration d’un incident
– Mineur : l’utilisateur reste autonome
– Majeur : la centrale d’assurance assiste l’utilisateur
#mstechdays
Code/Développement
12. Utilisation de la position courante
• Configuration dans le manifest
ID_CAP_LOCATION
• Les coordonnées retournées
sont issues du système WGS84
#mstechdays
Code/Développement
13. Utilisation de la position courante
• Récupération unique
var geolocator = new Geolocator { DesiredAccuracyInMeters = 50 };
try
{
Geoposition geoposition = await geolocator.GetGeopositionAsync(
maximumAge: TimeSpan.FromMinutes(5),
timeout:
TimeSpan.FromSeconds(10));
var coordinate = geoposition.Coordinate;
}
catch (Exception ex)
{
}
#mstechdays
Code/Développement
14. Utilisation de la position courante
• Récupération régulière
var geolocator = new Geolocator { DesiredAccuracy = PositionAccuracy.High,
MovementThreshold = 100 };
geolocator.StatusChanged += (_, argsStatus) =>
// Pas sur le thread UI
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var gpsStatus = argsStatus.Status;
});
geolocator.PositionChanged += (_, argsPosition) =>
{
var coordinate = argsPosition.Position.Coordinate;
};
#mstechdays
Code/Développement
15. Affichage d’une carte
•
•
•
•
Manifest ID_CAP_MAP
Token du Store à indiquer
Contrôle XAML classique « Map »
Propriétés intéressantes
– ZoomLevel
– CartographicMode (Aerial, Terrain, Road, …)
– LandmarksEnabled, PedestrianFeaturesEnabled
#mstechdays
Code/Développement
16. Affichage d’une carte – outil utile
• Installer le Windows Phone Toolkit
• Conversion GeoCoordinate
Geocoordinate
• Ajouts simplifiés
– PushPin
– Localisation de l’utilisateur
– Etc.
#mstechdays
Code/Développement
17. Manipulation d’une carte
• Ajout de punaise personnalisée
<toolkit:Pushpin GeoCoordinate="{Binding InterventionLocation}"
Background="{StaticResource TdBlueBrush}"
Visibility="{Binding IsXX,Converter={StaticResource BooleanToVisibilityConverter}}">
<Image Source="/Assets/Images/SinisterPushPinContent.png" />
</toolkit:Pushpin>
• Ajout de polygones
var dynamicPolyline = new MapPolygon {
StrokeColor = Color.FromArgb(255, 62, 181, 50),
Path = geoCoordinateCollection,
};
Map.MapElements.Add(dynamicPolyline);
#mstechdays
Code/Développement
18. Cartes statiques
• La plateforme Bing Maps propose des
cartes statiques délivrées sous formes
d’images
• Très pratiques pour les affichages de tuiles
imageUriFormat
= "http://dev.virtualearth.net/REST/v1/Imagery/Map/" +
"Road/" + // Type de carte
"{0},{1}/" + // Coordonnées
"14?" + // Zoom
"mapSize={2}" + // Dimensions de l'image
"&mapLayer=TrafficFlow" + // une seule valeur possible
"&format=jpeg" +
"&pp={0},{1};97;" + // Pushpin
"&key=CeNeSontPasLesApiKeysQueTuRecherches";
#mstechdays
Code/Développement
19. Cartes statiques – Epinglage sur l’accueil
var ftd = new FlipTileData(){Title=«centre.Title »};
ftd.WideBackgroundImage = new Uri( string.Format(
imageUriFormat, c.Location.Latitude, c.Location.Longitude, "691,336"),
UriKind.Absolute);
ShellTile.Create(new Uri("/Views/HomePage.xaml", UriKind.Relative), ftd, true);
#mstechdays
Code/Développement
20. Utilisation des protocoles d’application
• Lancement de l’application de guidage
– En voiture : (Lancement de Here Drive par défaut)
ms-drive-to:
?destination.latitude=50.2546&destination.longitude=3.5646&destination.name=Pal
ais%20des%20Congrés,Paris,France
– A pied : (Lancement de Here Maps par défaut)
ms-walk-to:
?destination.latitude=50.2546&destination.longitude=3.5646&destination.latitude
=50,2656&destination.longitude=3,456
#mstechdays
Code/Développement
21. Utilisation des protocoles d’application
• Les launchers simplifiés
– Disponible en ligne :
https://github.com/nokia-developer/here-launchers
– Package Nuget : HereLauncher
– Simplifie l’utilisation des applications de Nokia :
new Nokia.Phone.HereLaunchers.GuidanceDriveTask()
{
Destination = selectedCenter.Location.GeoCoordinate,
Title = selectedCenter.Title
}.Show();
#mstechdays
Code/Développement
24. Central d’appel - W8 - Fonctionnalités
• Visualisation des incidents
• Recherche par isochrone
• Affectation des missions
#mstechdays
Code/Développement
25. Affichage d’une carte
• Les solutions possibles :
Contrôle Natif - C++/.Net
Contrôle JavaScript - WinJS
Code en C++/C#/VB.Net
Code HTML+JavaScript
Intégration en XAML
Développement basé sur l’API JS v7
Basé sur un moteur accéléré pour le
rendu
Basé sur les capacités du navigateur
• Le SDK .Net disponible dans la galerie :
– http://bit.ly/1elE1XL
#mstechdays
Code/Développement
26. Recherche basée sur le temps de
parcours
• Appel à la plateforme Here Location
Platform
http://route.st.nlp.nokia.com/routing/6.2/calculateisoline.json?mo
– Requête :
de=fastest;car;traffic:enabled&start=geo!50.5308609,3.3846903&time
=P0Y0M0DT0H15M0S
– Réponse :
#mstechdays
Code/Développement
27. Recherche par temps de parcours
• Requête à la base de données via Entity
Framework et le type géographique
var polygon = DbGeographyHelper.CreatePolygon(wkt);
partners = ctx.Partners.Include(m => m.Incidents).Include(m => m.PartnerEquipments)
.Where(i => i.Location.Intersects(polygon)).Take(limit)
.ToList();
#mstechdays
Code/Développement
28. Recherche par temps de parcours
• Affichage de la carte
– En XAML, l’ajout du contrôle :
<maps:Map Credentials="BINGMAPSKEY"
Width="966"
MapType="Road"
ShowTraffic="True"
ShowBuildings="True"
ShowBreadcrumb="True"
ShowScaleBar="True"
Height="600"
x:Name="Map"></maps:Map>
#mstechdays
Code/Développement
29. Recherche par temps de parcours
• Ajout du calque des entités :
// Add a shape layer
var layer = new MapShapeLayer();
this.Map.ShapeLayers.Add(layer);
• Ajout du polygone :
// Create and add the polygon
var polygon = new MapPolygon() { Locations = locationCollection };
polygon.FillColor = Color.FromArgb(75, 50, 158, 181);
polygon.Visible = true;
layer.Shapes.Add(polygon);
#mstechdays
Code/Développement
30. Recherche par temps de parcours
• Création et ajout du contour :
layer.Shapes.Add(new MapPolyline()
{
Width = 5,
Locations = locationCollection,
Color = Color.FromArgb(255, 50, 158, 181),
Visible = true
});
• Positionnement de la vue :
this.Map.SetView(new LocationRect(locationCollection));
#mstechdays
Code/Développement
31. Recherche par temps de parcours
• Affichage des résultats
foreach (var partner in o.Partners)
{
Pushpin p = new Pushpin()
{
Text = (i++).ToString()
};
MapLayer.SetPosition(p, new Location() {
Latitude = partner.Latitude,
Longitude = partner.Longitude
});
this.Map.Children.Add(p);
}
#mstechdays
Code/Développement
34. Background agent – Cas d’usage
• Récupération et notification des missions
affectées
• Détection du départ après intervention sans
rapport
• Enregistrement de la position pour rapport
en fin de journée sur les distances
parcourues
#mstechdays
Code/Développement
35. Dépanneur - WP8 – Background Agent
• L’application n’est plus désactivée
• Permet de suivre le déplacement de
l’utilisateur
#mstechdays
Code/Développement
36. Background agent – Prérequis techniques
• Activer la capability LOCATION
• Spécifier l’exécution en background dans le
manifest
<DefaultTask Name ="_default" NavigationPage="MainPage.xaml">
<BackgroundExecution>
<ExecutionType Name="LocationTracking" />
</BackgroundExecution>
</DefaultTask>
• S’abonner aux événements du Geolocator
#mstechdays
Code/Développement
37. Background agent – Utilisation
• Evénements du Geolocator
_geoloc = new Geolocator();
_geoloc.PositionChanged += geoloc_PositionChanged;
_geoloc.StatusChanged += _geoloc_StatusChanged;
• Les gestionnaires d’événements sont
appelés lorsque la position change même
lorsque l’application n’est pas au premier
plan.
#mstechdays
Code/Développement
38. Background agent – Calcul de la distance
• Configuration du Geolocator
_geoloc.DesiredAccuracyInMeters = 50; //10%
_geoloc.DesiredAccuracy = PositionAccuracy.Default; // Sauvegarde batterie
_geoloc.MovementThreshold = 500; // Les unités sont en mètres.
_geoloc.ReportInterval = 1000; // Intervalle de notification de déplacement
• Simple addition
// Possible d'utiliser la méthode "Haversine" aussi (win8).
var distanceSinceLastPosition = (long)LastPositionGeoCoordinate
.GetDistanceTo(args.Position.Coordinate.ToGeoCoordinate());
TotalDistanceOfTheDay += distanceSinceLastPosition;
#mstechdays
Code/Développement
39. Background agent – Détection du
comportement
• Détecter l’arrivée sur intervention
if (_goingToIntervention &&
InterventionLocation.GetDistanceTo(e.Coordinate.ToGeoCoordinate()) <= 500)
• Détecter l’oubli de rapport de fin
if (_trackingExitOfIntervention &&
d’intervention
InterventionLocation.GetDistanceTo(e.Coordinate.ToGeoCoordinate()) > 500)
{
_trackingExitOfIntervention =_goingToIntervention = false;
// Afficher un rappel à l'utilisateur
}
#mstechdays
Code/Développement
40. Background agent – Afficher un message
• L’application est au premier plan
– Message box classique dans l’interface graphique
• L’application est au second plan
– Toasts, Tuiles, Lockscreen, TextToSpeech…
#mstechdays
Code/Développement
41. Background agent – Application en premier
plan
• RunningInBackground sur
<shell:PhoneApplicationService
PhoneApplicationService
RunningInBackground="PhoneApplicationService_OnRunningInBackground"
/>
• private void Application_Activated(object sender, ActivatedEventArgs e)
Evénement Activated : premier-plan
{
IsRunningInBackground = false;
}
#mstechdays
Code/Développement
…
42. Background agent – Toast et message
• Affichage du message concrètement
const string titre = "Attention";
const string contenu = "Vous avez oublié de signaler la fin d'intervention.";
if (App.IsRunningInBackground)
{
MessageBox.Show(contenu, titre, MessageBoxButton.OK);
}
else
{
var toast = new ShellToast { Title = titre, Content = contenu };
toast.Show();
}
#mstechdays
Code/Développement
43. Background agent – ça marche tout le
temps ?
• Coupure « automatique « :
–
–
–
–
–
L’économiseur de batterie s’active
Une autre application GPS est lancée (Nokia Drive)
La mémoire du téléphone devient insuffisante
L’application fonctionne depuis 4H sans interactions de l’utilisateur
L’application est quittée
• Coupure manuelle
– Désabonnement des handlers sur le Geolocator
– Appel à la méthode « Stop » du Geolocator
#mstechdays
Code/Développement
44. Background agent – détection de coupure
• L’événement Deactivated est levé
private void Application_Deactivated(object sender, DeactivatedEventArgs e){
if (e.Reason != DeactivationReason.UserAction)
new ShellToast { … }.Show();
}
• La raison de la coupure est indiquée
#mstechdays
Code/Développement
47. Conclusions
• L’information géographique peut apporter une dimension
importante dans de nombreuses applications
• Windows Phone et Windows 8.1 offrent des réelles
possibilités d’interaction et scénarii riches et de récupération
d’informations
• Les plateformes peuvent compléter les fonctionnalités de
base pour répondre aux besoins avancés dans les
applications
#mstechdays
Code/Développement
48. Conclusions – Pour aller plus loin
• Le code des exemples :
– PROCHAINEMENT
• Les liens utiles :
MSDN - Bing Maps for W8.1 :
http://msdn.microsoft.com/en-us/library/hh846481.aspx
MSDN – Map Control for WP8 :
http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207045(v=vs.105).aspx
Here developer portal: http://developer.here.com/
#mstechdays
Code/Développement
49. Donnez votre avis !
Depuis votre smartphone sur :
http://notes.mstechdays.fr
De nombreux lots à gagner toute les heures !!!
Claviers, souris et jeux Microsoft…
Merci de nous aider à améliorer les Techdays !
#mstechdays
Code/Développement