BUILD 2015 : Nouveautés autour de la cartographie
Après 3 jours riches en annonces, il est temps que les experts démystifient toutes les nouveautés de cette Build! Et aujourd’hui on commence par la partie cartographie qui subit une bonne mise à jour !
L’uniformisation tant attendue
Pour rappel sous Windows/Windows Phone 8.1, les services cartes c’était ca :
Il faut l’avouer entre les services bing, here et les applications en preview, il fallait toujours jongler et combiner tout cela pour en arriver à notre besoin. De plus les service n’étant pas tous disponibles sur les 2 plateformes, il était compliqué de partager son code. Mais ça, c’était avant! Aujourd,’hui avec les nouvelles API et avec l’uniformation des OS, nous avons accés à un seul et unique service/contrôle XAML disponible sur toutes les plateformes !
La plateforme Maps sous Windows se résume en 1 image :
La plateforme Maps se repose donc sur Bing et Here , et inclut toutes les fonctionnalités de ces 2 services ! Dans les nouveautés on y retrouve le mode offline pour le Desktop/Tablette qui était jusque là reservé aux téléphones, le mode 3D et Streetside qui est ni plus ni moins que le Streetview à la sauce Microsoft!
Maintenant qu’on a fait un rapide tour des nouveautés, passons aux choses sérieuses !
Back to basic : Les permissions
Commençons par la geolocalisation qui subit un changement au niveau de la gestion des permissions.
Sous Windows Phone 8.1 : L’autorisation d’utiliser la localisation se faisait lors de l’installation. (vous savez le prompt qui apparait souvent quand on installe une appli mais que personne ne lit :D) + gérer le premier accès en affichant un prompt dans l’application + gérer un toggle dans votre application + un toggle général présent dans les paramètres du téléphone !
Sous Windows 8.1 : Le système s’améliore, l’autorisation se fait automatiquement lors du premier accès à la localisation en affichant un prompt. La gestion des permissions se fait via les paramètres de l’OS.+ un toggle général. Pour gérer le cas où la personne a révoqué la permission vous utilisez un beau try/catch!
Et bah sachez que sous Windows 10, le système s’améliore encore un peu plus (surtout pour Windows Phone en fait), on se rapproche du fonctionnement de Windows 8.1 avec en plus la possibilité de connaitre le statut de la permission! La best practice pour accéder à la position est :
private async Task GetPositionAsync()
{
// Obtention de la permission et affichage d'un prompt si c'est le premier accès
var accessStatus = await Geolocator.RequestAccessAsync();
switch (accessStatus)
{
case GeolocationAccessStatus.Allowed:
//L'utilisateur a accepté l'accès a sa position
Geolocator geolocator = new Geolocator();
Geoposition pos = await geolocator.GetGeopositionAsync();
break;
case GeolocationAccessStatus.Denied:
DisplayErrorMessage();
//L'utilisateur n'a pas accepté ou a revoqué l'accès a sa position
break;
case GeolocationAccessStatus.Unspecified:
//La permisssion n'a pas été specifié encore
break;
}
}
N’oubliez pas d’ajouter la capability, au moment de l’écriture de l’article, l’interface pour le manifest n’existe pas. Il faut éditer directement le XML
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="Location"/>
</Capabilities>
On peut également rediriger l’utilisateur sur l’écran des permissions afin qu’il active le droit dans le cas ou il l’avait refusé précedemment
await Launcher.LaunchUriAsync(new Uri("ms-settings://privacy/location", UriKind.Absolute));
Il faudra donc penser à repasser sur vos apps si vous les mettez à jour en prenant en compte ce changement.
– Supprimer vos prompts ainsi que le toggle pour gérer la localisation
– Utiliser Geolocator.RequestAccessAsync() pour demander/connaitre l’état de la permission
– Proposer à l’utilisateur d’aller sur la page des permissions dans le cas ou la permission a été refusée
Quoi de neuf pour le MapsControl : Les nouvelles propriétés
Le MapsControl a été mis à jour pour bénéficier des services HERE ! De nouvelles propriétés font leur appararition :
– TransitFeaturesVisible : Permet d’afficher ou pas, les arrêts de tram/metro/rer/aeroport etc … sur la carte
– BusinessLandmarksVisible : Permet d’afficher ou pas les POIs genre musée/parc
– ActualCameraChanged/ActualCameraChanging : 2 events pour agir lorsque on effectue un pan/zoom/tilt
– ZoomInteractionMode/PanInteractionMode/RotateInteractionMode/TiltInteractionMode : Pour autoriser ou pas l’usage de ces mouvements sur la carte
– MapElementClick/MapElementPointerEntered/MapElementPointerExited : Des events pour interagir avec nos pushpins
– CollisionBehaviorDesired : Pour determiner le comportement d’affichage lorsque 2 pushpins se chevauchent
De nouvelles API concernant la 3D et StreetSide sont accessibles, j’en parlerai dans la dernière partie de l’article!
Pour obtenir votre MapServiceToken ce n’est plus via le Dev Center mais directement sur le site Bing. Il faut se rendre à l’adresse https://www.bingmapsportal.com/Application et déclarer votre application.
On a toujours la possibilité d’ouvrir l’application maps pour afficher un pushpin, tracé un itineraire via les 2 uris suivantes :
– bingmaps:?cp=40.726966~-74.006076 //pour ouvrir maps centré sur les coordonnées
– ms-drive-to:?destination.latitude=47.6451413797194&destination.longitude=-122.141964733601&destination.name=Redmond, WA // pour tracer un itineraire
Je vous conseille d’aller jeter un coup d’oeil pour connaitre tous les paramètres possibles :
– bingmaps : https://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj635237.aspx#examples
– ms-drive-to : https://msdn.microsoft.com/library/windows/apps/dn614997.aspx
Scene API et Streetside …
Passons maintenant à 2 nouvelles fonctionnalités qui font leur apparition, il s’agit de Scene API et StreetSide.
Scene API permet de manipuler la camera pour la diriger sur un point précis.
Pour l’utiliser, c’est super facile :
private async Task ShowSoatBuilding()
{
//on vérifie que le device support la 3D pour afficher la carte en 3D :)
if (myMap.Is3DSupported)
{
this.myMap.Style = MapStyle.Aerial3DWithRoads;
var status = await Geolocator.RequestAccessAsync();
if (status == GeolocationAccessStatus.Allowed)
{
var gl = new Geolocator();
var currentPosition = await gl.GetGeopositionAsync();
//on faire du geocoding pour recupérer les coordonées de l'adresse de Soat
var points = await MapLocationFinder.FindLocationsAsync("87, Quai Panhard et Levassor, 75013 Paris", currentPosition.Coordinate.Point);
if (points.Status == MapLocationFinderStatus.Success && points.Locations.Any())
{
var soatCoordinate = points.Locations[0].Point;
//on initialise la scene en spécifiant :
// - les coordonnées du batiment
// - la distance entre le batiment et notre point de vision
// - la direction du point de vue : 0 ou 360 = Nord, 90 = Est, 180 = Sud, and 270 = Ouest.
// - la hauteur du point de vue : 90 on regarde vers l'horizon et 0 on regarde vers le bas
MapScene soatBuildingScene = MapScene.CreateFromLocationAndRadius(soatCoordinate, 150, 00, 45);
//on affiche la scene sur la map avec une belle animation!
await myMap.TrySetSceneAsync(soatBuildingScene, MapAnimationKind.Bow);
}
}
}
}
Concernant Streetside je trouve que c’est LA feature qui permet d’avoir une experience cartographique riche. Et en plus, c’est hyper simple à utiliser, alors ne vous en privez pas si ça a du sens dans votre appli 🙂
private async Task ShowSoatBuildingStreetsideExperience()
{
var status = await Geolocator.RequestAccessAsync();
if (status == GeolocationAccessStatus.Allowed)
{
var gl = new Geolocator();
var currentPosition = await gl.GetGeopositionAsync();
var points = await MapLocationFinder.FindLocationsAsync("87, Quai Panhard et Levassor, 75013 Paris",
currentPosition.Coordinate.Point);
if (points.Status == MapLocationFinderStatus.Success && points.Locations.Any())
{
var soatCoordinate = points.Locations[0].Point;
//on récupére le streetside si la fonctionnalité est disponible à cette adresse
StreetsidePanorama panoramaSoatBuilding = await StreetsidePanorama.FindNearbyAsync(soatCoordinate);
if (panoramaSoatBuilding != null)
{
streetside.Visibility = Visibility.Visible;
//on affiche streetside sur la carte
streetside.CustomExperience = new StreetsideExperience(panoramaSoatBuilding)
{
OverviewMapVisible = false,
ExitButtonVisible = false,
ZoomButtonsVisible = false
};
}
}
}
}
Conclusion
En conclusion, avec l’uniformisation des OS, Microsoft nous facilite l’usage des API de la cartographie. L’unique contrôle Maps permet plus de partage de code et fournit une expérience riche à l’utilisateur notamment avec les nouvelles fonctionnalités 3D, Scene et Streetside.
Liens utiles
- http://channel9.msdn.com/Events/Build/2015/2-757 : Leveraging Maps and Location Across Phone, Tablet, and PC in Your Windows Apps
- https://github.com/Microsoft/Windows-universal-samples/tree/master/mapcontrolsample : Sample MapsControl
- https://github.com/Microsoft/Windows-universal-samples/tree/master/geolocation : Sample geolocation
Nombre de vue : 100