BUILD 2015 : Nouveautés autour de la cartographie

logo-build 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 :windows8.1maps

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 !

windows10maps

La plateforme Maps sous Windows se résume en 1 image :maps platform

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.
mapservicetoken

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);
            }
        }
    }
}

Le résultat :
scene

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
                };
            }
        }
    }
}

Le résultat :
streetside

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

Nombre de vue : 58

AJOUTER UN COMMENTAIRE