SlideShare une entreprise Scribd logo
1  sur  72
Télécharger pour lire hors ligne
session sept 2016 Yann Caron (c) 2014 1
IN01
Programmation Android
05 – Google Maps
Yann Caron
Et Jean-Marc Farinone
session sept 2016 Yann Caron (c) 2014 2
Sommaire - Séance 05
 Géolocalisation – Principes
 Géolocalisation – Android
 Google Maps – Mise en œuvre
 Google Maps – Utilisation
➔ Configurer, camera, markers, icon
➔ Dessins, fenêtre
 Google API
➔ Geocoding, Directions, Distance, Elevation
 Conclusion
session sept 2016 Yann Caron (c) 2014 3
IN01 – Séance 05
Géolocalisation – principes
session sept 2016 Yann Caron (c) 2014 4
GPS
 GPS == Global Positioning System
 Un total de 24 satellites (21 + 3 secours) autour du
globe répartis sur 6 orbites
 Utilise des satellites NAVSTAR (Navigation Satellite
Timing And Ranging) diffusant leur position et l'heure
 Situés à 20 184 km de la surface du globe,
parcourent leur orbite en 12 h et émettent à des
fréquences dans la bande des micro-ondes
(~1500Mhz).
Slide original (c) JMF
session sept 2016 Yann Caron (c) 2014 5
Temps de propagation
 Le GPS se synchronise puis calcule la distance avec le
satellite grâce à la différence de temps en émission et
réception
 Distance = deltaT * c (célérité du signal dans l'aire ~ vitesse
de la lumière : ~300 000 km/s)
Delta
T1
T2
session sept 2016 Yann Caron (c) 2014 6
Triangulation
 Fonctionnement par triangulation : 4 positions
sont nécessaires pour calculer la position.
 Un de plus par dimension souhaitée. 3D == 4
satellites
Avec 3 satellites : vous êtes ici !!
Sur un plan à 2 dimensions
Mais à quelle altitude ??
Avec 2 satellites :
2 points possibles
Avec 1 satellite :
circonférence
session sept 2016 Yann Caron (c) 2014 7
Triangulation - Sphères
 En 3D, il faut imaginer des sphères :
Si les 2 points
sont sur la
surface de la
Terre, il faut un
4e satellite
session sept 2016 Yann Caron (c) 2014 8
GPS - Précision
 Précision de 15 à 100 mètres
 WASS (US)/EGNOS (Eur) affinent la précision
avec des balises au sol (< 3 mètres)
Slide original (c) JMF
session sept 2016 Yann Caron (c) 2014 9
SBAS
 SBAS – Satellite-based Augmentation Systems
 Réseau de stations au sol (WMS Wide Area
reference Station) qui connaissent leur position et
la comparent aux
coordonnées calculées par
GPS. La correction est ensuite
envoyée aux satellites via des
satellites géostationnaires
session sept 2016 Yann Caron (c) 2014 10
Géolocalisation par relais
 La même chose, mais par relais téléphoniques
GSM ou Wifi
 Conseillé, car consomme moins d'énergie
(batterie) et la réception est meilleure
 Source :
http://developer.android.com/guide/topics/loca
tion/strategies.html
session sept 2016 Yann Caron (c) 2014 11
Géolocalisation CellID - GSM
 L'altitude est connue
 Fonctionne par
recouvrement et non
triangulation
 Cell-Id : évalue quels
relais sont accessibles
et déduit la zone de
recouvrement
session sept 2016 Yann Caron (c) 2014 12
IN01 – Séance 05
Géolocalisation – Android
session sept 2016 Yann Caron (c) 2014 13
Géolocalisation - Android
 Pour utiliser la géolocalisation sur Android, il
suffit de faire appel au bon service :
Context.LOCATION_SERVICE
 Deux façons de procéder :
➔ En récupérant la dernière position connue
➔ De façon évènementielle, c'est-à-dire recevoir une
mise à jour régulière via un callback (système
évènementiel)
session sept 2016 Yann Caron (c) 2014 14
Dernière position connue
LocationManager locationManager =
(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
// Initialize the location fields
if (location != null) {
float lat = (float) (location.getLatitude());
float lng = (float) (location.getLongitude());
Log.i(BaitFragment.class.getName(), String.valueOf(lat));
Log.i(BaitFragment.class.getName(), String.valueOf(lng));
} else {
Log.i(BaitFragment.class.getName(), "Provider not available");
Log.i(BaitFragment.class.getName(), "Provider not available");
}
Service
Dernière position connue
session sept 2016 Yann Caron (c) 2014 15
Géolocalisation Android - Callback
 On veut être notifié régulièrement pour traiter
les changements
➔ Par exemple pour tracer le déplacement sur une
carte, calculer la vitesse, le déplacement
 Il suffit de le demander au service et d'y
abonner un callback (évènement)
session sept 2016 Yann Caron (c) 2014 16
Géolocalisation Android - Callback
LocationManager locationManager =
(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 1,
locationListener);
Service
Appelé lorsque la position change ou périodiquement
Attache le callback
session sept 2016 Yann Caron (c) 2014 17
Géolocalisation – Permissions
 Deux providers : NETWORK_PROVIDER (GSM et
Wifi) et GPS_PROVIDER
 Il faut ajouter des autorisations à l'application
➔ ACCESS_COARSE_LOCATION : pour la
localisation à base de réseaux
➔ ACCESS_FINE_LOCATION : comme la précédente,
le GPS en plus
session sept 2016 Yann Caron (c) 2014 18
IN01 – Séance 05
Google Maps – Mise en œuvre
session sept 2016 Yann Caron (c) 2014 19
Google Maps
 L'avantage d'Android est de bénéficier d'applications
développées par Google… dont Google Maps
 Une API est mise à disposition gratuitement depuis
le SDK Manager.
 Il suffit de la télécharger et de demander une clé (API
Key)
 Référence :
https://developers.google.com/maps/documentatio
n/android
Slide original (c) JMF
session sept 2016 Yann Caron (c) 2014 20
Google Maps
 On utilise donc les Google Maps Android API v2
 Cette API permet de manipuler des cartes terrestres
 Ces classes se trouvent dans le package
com.google.android.gms.maps
 Pour afficher une carte, on utilise soit un fragment soit une vue
 Cette API gère les entrées clavier, le zoom, le toucher sur une
carte affichée
 On peut dessiner, ajouter des images, des marqueurs et des
infos sur la carte
Slide original (c) JMF
session sept 2016 Yann Caron (c) 2014 21
Google Maps
 La création d'une activity GoogleMap a été simplifié dans Android
Studio
 Pour utiliser les cartes Google, il faut suivre les étapes suivantes :
➔ 1 - Importer la bibliothèque googleMap dans le projet
➔ 2 - Écrire une activité demandant à afficher une carte Google
➔ 3 - Obtenir une clé Maps API v2 Key
➔ 4 – Configurer le manifest
 Toute la procédure est indiquée à
https://developers.google.com/maps/documentation/android/st
art
Slide original (c) JMF
session sept 2016 Yann Caron (c) 2014 22
1 - Ajouter les dépendances
 Clique droit sur le projet
 OpenModuleSettings
 Onglet Dependencies
 Bouton “+”
 Library dependency
 Choisir com.google.android.gms:
➔ play-services:[version]
➔ Play-services-maps:[version]
session sept 2016 Yann Caron (c) 2014 23
session sept 2016 Yann Caron (c) 2014 24
2 – Créer une MapsActivity
 Dans Android Studio;
file/new/google/google map activity
session sept 2016 Yann Caron (c) 2014 25
3 – Obtenir une clé
 Une fois l'activity créée il faut lancer l'application
 Dans les logs de l'application, GoogleMap indique une
erreur :
➔ Authentication failed on the server
 Suivi de l'url à contacter
➔ https://console.developers.google.com
 Et du fingerprint
➔ Un algorithme de hashage SHA-1 qui prend, entre autre, le numéro
de série de l'appareil, des données de la machine de
developpement et le nom de l'application
session sept 2016 Yann Caron (c) 2014 26
3 – Obtenir une clé
 Se rendre sur le site developpers.google.com
(URL ci-dessus)
 Activer une nouvelle API
 Choisir GoogleMap Android API
 Cliquer sur Identifiants
 Créer une clé Android
session sept 2016 Yann Caron (c) 2014 27
Google Developers Console
 Y introduire le nom du package et le fingerprint
session sept 2016 Yann Caron (c) 2014 28
3 – Optenir une clé
 Le site génère la clé
 Qu'il faut reporter
dans le manifest
de l'application :
manifests/AndroidManifest.xml
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyClOKIkn93L6B8N1nJXRzLIjZMPkg9PQMw"/>
session sept 2016 Yann Caron (c) 2014 29
GoogleMap
 Ou dans un fichier dédié :
➔ Res/values/google_maps_api.xml
 Lancer l'application
session sept 2016 Yann Caron (c) 2014 30
4 – Configurer AndroidManifest.xml
 Il faut ensuite créer quelques permissions
standard
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
session sept 2016 Yann Caron (c) 2014 31
4 – Configurer AndroidManifest.xml
 Ainsi que quelques paramètres optionnels :
➔ Pour géolocaliser
➔ Pour le rendu 3D
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:glEsVersion="0x00020000"
android:required="true"/>
session sept 2016 Yann Caron (c) 2014 32
4 – Manifest - Extrait
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true" android:icon="@drawable/ic_launcher"
android:label="@string/global_app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyAO5eGksIpKNF7kUTuG5Qe3dCCIBG_hXKc" />
</application>
</manifest>
session sept 2016 Yann Caron (c) 2014 33
Utiliser MapView
 Il est possible d'utiliser GoogleMap sous forme
d'une vue : MapView
 Attention !! Si cette vue est utilisée, il faut
relayer tous les évènements du conteneur
(Activity, Fragment) vers la vue
 C.-à-d. : onCreate(), onDestroy(), onResume() et
onPause()
 Sinon ça n'affiche rien (mauvaise expérience !!)
session sept 2016 Yann Caron (c) 2014 34
Dans le fichier XML
 On peut désormais ajouter la vue dans une
Activity ou un Fragment. Ce sera un fragment.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.google.android.gms.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
session sept 2016 Yann Caron (c) 2014 35
Dans le fichier Java
public class PlaceMapFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_map, container, false);
mapView = (MapView) v.findViewById(R.id.mapview);
mapView.onCreate(savedInstanceState);
MapsInitializer.initialize(this.getActivity());
return v;
}
@Override
public void onResume() {
mapView.onResume();
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
}
On relaye les évènements
session sept 2016 Yann Caron (c) 2014 36
Résultat
session sept 2016 Yann Caron (c) 2014 37
Fragment
 Il est également possible d'utiliser googleMap sous
la forme d'un Fragment
➔ Android Responsive; gérer les tailles d'écrans
 Pour se faire, la classe GoogleMap doit hériter de
SupportMapFragment ou MapFragment
➔ Rend l'utilisation du composant graphique réutilisable
 Attention toutefois à la méthode onCreateView où il
faut impérativement appeler la méthode surchargée
session sept 2016 Yann Caron (c) 2014 38
Fragment - code
public class MyMapFragment extends SupportMapFragment {
@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup group,
Bundle bundle) {
View view;
// TODO !!!! Invoquer le onCreateView de la super classe, sinon exception
// plutôt que : view = inflater.inflate(R.layout.map_fragment, group, false);
view = super.onCreateView(inflater, group, bundle);
this.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
}
});
return view;
}
}
Attention
session sept 2016 Yann Caron (c) 2014 39
IN01 – Séance 05
Google Maps – Utilisation
session sept 2016 Yann Caron (c) 2014 40
Types de Map
 Il existe plusieurs types de maps : NORMAL, 
HYBRID, SATELLITE, TERRAIN, NONE (juste
la grille)
 Propriété Java :
setMapType(GoogleMap.MAP_TYPE_NORMAL)
 Tag XML : mapType
 Attention ! Il faut ajouter le xml name space (xmlns)
dans la vue ou le layout XML :
xmlns:map="http://schemas.android.com/apk/res-auto"
session sept 2016 Yann Caron (c) 2014 41
Propriétés importantes
 Position initiale de la caméra :
cameraTargetLat, cameraTargetLng, 
cameraZoom, cameraBearing, cameraTilt
 Contrôles visuels : uiZoomControls, 
uiCompass
 Comportement de la gesture :
uiZoomGestures, uiScrollGestures, 
uiRotateGestures, uiTiltGestures
session sept 2016 Yann Caron (c) 2014 42
Exemple
<com.google.android.gms.maps.MapView
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
map:cameraBearing="112.5"
map:cameraTargetLat="-33.796923"
map:cameraTargetLng="150.922433"
map:cameraTilt="30"
map:cameraZoom="13"
map:mapType="hybrid"
map:uiCompass="false"
map:uiRotateGestures="true"
map:uiScrollGestures="true"
map:uiTiltGestures="true"
map:uiZoomControls="true"
map:uiZoomGestures="true" />
Namespace
session sept 2016 Yann Caron (c) 2014 43
Placer la caméra
 Un site web bien utile : http://www.gps-
coordinates.net/ pour obtenir les coordonnées
géographiques
session sept 2016 Yann Caron (c) 2014 44
Placer la caméra
 Le placement est animé
 Il faut créer un objet LatLng (un tuple latitude et longitude)
 Ou utiliser la dernière position connue (GPS ?)
MapsInitializer.initialize(this.getActivity());
// position
LatLng annemasse = new LatLng(46.193253, 6.2341579);
// positionnement initial
map.moveCamera(CameraUpdateFactory.newLatLngZoom(annemasse, 15));
// animation
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
Zoom initial
Durée de l'animation
Type d'animation et données
d'arrivée
Obligatoirement avant
session sept 2016 Yann Caron (c) 2014 45
Ajouter un marqueur
 Marqueur par défaut
 On définit une position et un titre
 La propriété snippet(), c'est le texte qui apparait
lorsque l'utilisateur clique sur le marqueur
map.addMarker(new MarkerOptions()
.position(annemasse)
.title("Ma maison")
.snippet("J'habite Annemasse")
);
session sept 2016 Yann Caron (c) 2014 46
Marqueur personnalisé
 Plusieurs propriétés permettent
de personnaliser le marqueur
➔ icon(), alpha(), 
rotation(), draggable()
map.addMarker(new MarkerOptions()
.position(annemasse)
.title("Ma maison")
.snippet("J'habite Annemasse")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
);
session sept 2016 Yann Caron (c) 2014 47
Custom info windows
 On peut personnaliser la fenêtre d'informations
(titre et snippet)
session sept 2016 Yann Caron (c) 2014 48
Custom info windows
 Comme pour toute
UI, il est possible de
tout écrire en Java
ou en XML (inflater)
 Il faut prévoir des
TextView pour le
titre et le texte du
snippet
<android.support.v7.widget.GridLayout
xmlns:android="http://schemas.android.com/apk/
res/android"
xmlns:app="http://schemas.android.com/apk/
res/fr.cnam.pecheurduleman"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:columnCount="2" >
<ImageView
android:src="@drawable/fish_green"
app:layout_rowSpan="2" />
<TextView
android:id="@+id/info_title"
android:layout_margin="5dp"
android:textSize="20dp"
android:textColor="#ff00760f" />
<TextView
android:id="@+id/info_snippet"
android:layout_margin="5dp"
android:textSize="15dp"
android:textColor="#ff303030" />
</android.support.v7.widget.GridLayout>
session sept 2016 Yann Caron (c) 2014 49
Custom info windows
 Il suffit d'implémenter l'interface InfoWindowAdapter
map.setInfoWindowAdapter(new InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public View getInfoContents(Marker marker) {
View v = inflater.inflate(R.layout.map_info_window, null);
TextView title = (TextView) v.findViewById(R.id.info_title);
title.setText(marker.getTitle());
TextView snippet = (TextView) v.findViewById(R.id.info_snippet);
snippet.setText(marker.getSnippet());
return v;
}
});
session sept 2016 Yann Caron (c) 2014 50
InfoWindowAdapter
 Deux méthodes à implémenter :
➔ getInfoWindow() : permet de customiser toute la
fenêtre
➔ getInfoContents() : permet de ne customiser que
le contenu de la fenêtre
 Attention !! Dans le cas où on implémente
getInfoContents(), la vue est chargée
comme une image statique (pas de changement
possible)
session sept 2016 Yann Caron (c) 2014 51
Plus d'informations
 setOnInfoWindowClickListener() : comme son
nom l'indique, permet de brancher un callback
sur le clic de l'info window
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Log.i(PlaceMapFragment.class.getName(),
"On a cliqué sur " +
marker.getTitle() +
" [" + marker.getSnippet() + "]");
}
});
Le marqueur
session sept 2016 Yann Caron (c) 2014 52
Dessiner sur la carte
 Il est possible de dessiner des formes géométriques
sur la carte selon des coordonnées géographiques
➔ Des cercles : addCircle()
➔ Des polygones : addPolygone()
➔ Des polylines (polygone vide) : addPolyline()
➔ Des images : addGroundOverlay()
➔ Des textures : addTileOverlay(). Ce dernier permet
de décorer ou de remplacer les images de terrain
fournies par Google. Il faut gérer les niveaux de zoom
session sept 2016 Yann Caron (c) 2014 53
Exemple de dessin
map.addCircle(new CircleOptions()
.center(annemasse)
.radius(1000) // en mètres
.strokeWidth(5).strokeColor(Color.GRAY));
map.addCircle(new CircleOptions()
.center(portChoiseul)
.radius(1000) // en mètres
.strokeWidth(5).strokeColor(Color.GRAY));
map.addPolyline((new PolylineOptions())
.add(annemasse, portChoiseul,
corsierPort, annemasse)
.width(5).color(Color.BLUE)
.geodesic(true));
Coordonnées LatLng
session sept 2016 Yann Caron (c) 2014 54
IN01 – Séance 05
Google API
session sept 2016 Yann Caron (c) 2014 55
Google API
 Depuis quelques années, Google met à
disposition des Webservices dédiés à
GoogleMap
 https://developers.google.com/maps/web-
services/
 Notablement : Geocoding, Places, Elevations,
Geolocation, Directions
session sept 2016 Yann Caron (c) 2014 56
Principe
 L'application android appel une URL
 Le serveur HTTP lui renvoie un “streaming” XML ou
JSON
 Détaillé dans le cours sur les WebServices
 URL HTTP :
➔ http://maps.googleapis.com/maps/api/geocode/output?parameters
 URL HTTPS :
➔ https://maps.googleapis.com/maps/api/geocode/output?parameters
session sept 2016 Yann Caron (c) 2014 57
Google Maps Geocoding API
 Destiné à affecter des coordonnées
géographiques à des adresses.
➔ Exemple : "1600 Amphitheatre Parkway, Mountain
View, CA"
➔ Renvoie : latitude 37.423021 and longitude
-122.083739
 Et inversement “reverse geocoding”
session sept 2016 Yann Caron (c) 2014 58
Geocoding
session sept 2016 Yann Caron (c) 2014 59
Exemple
 JSON URL :
➔ https://maps.googleapis.com/maps/api/geocode/json?
address=1600+Amphitheatre+Parkway,+Mountain+View,
+CA&key=YOUR_API_KEY
 XML URL :
➔ https://maps.googleapis.com/maps/api/geocode/xml?
address=1600+Amphitheatre+Parkway,+Mountain+View,
+CA&key=YOUR_API_KEY
 YOUR_API_KEY (bonne pratique) :
getResources().getString(R.string.google_maps_key);
session sept 2016 Yann Caron (c) 2014 60
JSON
{
"results" : [
{
"address_components" : [
{ "long_name":"1600", "short_name":"1600", "types":["street_number"]},
[...]
],
"formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA
94043, USA",
"geometry" : {
"location" : {"lat" : 37.4224764, "lng" : -122.0842499},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {"lat" : 37.4238253802915, "lng" : -122.0829009197085},
"southwest" : {"lat" : 37.4211274197085, "lng" : -122.0855988802915}
}
},
"place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
"types" : [ "street_address" ]
}
],
"status" : "OK"
}
session sept 2016 Yann Caron (c) 2014 61
XML
<GeocodeResponse>
<status>OK</status>
<result>
<type>street_address</type>
<formatted_address>1600 Amphitheatre Pkwy, Mountain View, CA 94043,
USA</formatted_address>
<geometry>
<location>
<lat>37.4217550</lat>
<lng>-122.0846330</lng>
</location>
<location_type>ROOFTOP</location_type>
<viewport>
<southwest>
<lat>37.4188514</lat>
<lng>-122.0874526</lng>
</southwest>
<northeast>
<lat>37.4251466</lat>
<lng>-122.0811574</lng>
</northeast>
</viewport>
</geometry>
<place_id>ChIJ2eUgeAK6j4ARbn5u_wAGqWA</place_id>
</result>
</GeocodeResponse>
session sept 2016 Yann Caron (c) 2014 62
Reverse Geocoding
 Address Lookup
 Determine l'addresse à partir de la position
➔ https://maps.googleapis.com/maps/api/g
eocode/json?latlng=40.714224,-
73.961452&key=YOUR_API_KEY
 Le résultat est le même que pour le Geocoding
(contient les deux informations)
session sept 2016 Yann Caron (c) 2014 63
Google Maps Geolocation
 Google Maps Geolocation donne la position de
l'appareil en se basant sur les antennes relais et
les bornes Wi-fi
 Utile si l'appareil ne connais pas sa position
 Google sait où vous êtes
 URL :
➔ https://www.googleapis.com/geolocation
/v1/geolocate?key=YOUR_API_KEY
session sept 2016 Yann Caron (c) 2014 64
Google Places API Web Service
 Permet de rechercher les lieux intéressants
 Recherche aux alentours :
➔ https://maps.googleapis.com/maps/api/p
lace/nearbysearch/json?location=-
33.8670522,151.1957362&radius=500&type
s=food&name=cruise&key=YOUR_API_KEY
 Renvoie une liste de placeID
➔ Exemple : ChIJN1t_tDeuEmsRUsoyG83frY4
session sept 2016 Yann Caron (c) 2014 65
Google Places API Web Service
 Détail du lieu :
➔ https://maps.googleapis.com/maps/api/place/detai
ls/json?
placeid=ChIJN1t_tDeuEmsRUsoyG83frY4&key=YOUR_API
_KEY
 Il faut utiliser le placeId
 Mais aussi :
➔ Ajout d'un lieu d'intérêt (modéré par Google)
➔ Accès aux photos du lieu
➔ Auto complétion (liste de lieux, selon les premières lettres saisies)
session sept 2016 Yann Caron (c) 2014 66
Google Maps API
 Elevation API : renvoie les altitudes entre deux points ou selon
un chemin
 Google Maps Roads API : renvoie les routes traversées lors
d'un trajet
 Google Maps Distance Matrix API : les distances et durées
pour plusieurs destinations
 Google Maps Directions API : Calcul l'itinéraire
 Google Maps Time Zone API : renvoie le fuseau horaire de la
position
 En plus de Geocoding, Geolocation et Places
session sept 2016 Yann Caron (c) 2014 67
Java Client for Google Maps
Services
 Une API Java (OpenSource) pour abstraire la
manipulation des web service Google
 https://github.com/googlemaps/googl
e-maps-services-java
 Exemple :
GeoApiContext context = new GeoApiContext().setApiKey("AIza...");
GeocodingResult[] results = GeocodingApi.geocode(context,
"1600 Amphitheatre Parkway Mountain View, CA 94043").await();
System.out.println(results[0].formattedAddress);
session sept 2016 Yann Caron (c) 2014 68
IN01 – Séance 05
Conclusion
session sept 2016 Yann Caron (c) 2014 69
Conclusion
 Une vue très puissante. Un grand nombre de
possibilités
 Utilisation de la géolocalisation (tracés temps réels,
enregistrement de position)
 Un grand nombre de webservices fournis par Google
 Mais d'autres sont disponibles, quelques idées :
➔ Windspot (afficher les vents), Météo, METAR (afficher les
données météo aéronautiques par aéroports)
 D'autres idées ??
session sept 2016 Yann Caron (c) 2014 70
Pour aller plus loin
 Google met à disposition StreetView dans son API :
StreetViewPanoramaFragment
 My location button setMyLocationButtonEnabled
et setOnMyLocationButtonClickListener
 Afficher les batiments : setBuildingEnabled
 Incliner la caméra :
CameraPosition.Builder.bearing, target, 
tilt et zoom
 Évènements : setOnMapClickListener
session sept 2016 Yann Caron (c) 2014 71
Batiments 3D
session sept 2016 Yann Caron (c) 2014 72
Fin
 Merci de votre attention
 Des questions ?

Contenu connexe

Tendances

Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...
Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...
Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...Simplilearn
 
Rappport PFE 2012 Ghodhbane Hani - OpenSNC
Rappport PFE 2012 Ghodhbane Hani - OpenSNCRappport PFE 2012 Ghodhbane Hani - OpenSNC
Rappport PFE 2012 Ghodhbane Hani - OpenSNCGhodbane Heni
 
réaliser une plateforme d’automatisation et de génération des rapports de test
réaliser une plateforme d’automatisation et de génération des rapports de testréaliser une plateforme d’automatisation et de génération des rapports de test
réaliser une plateforme d’automatisation et de génération des rapports de testahmed oumezzine
 
jeu de serpent (Snake)
jeu de serpent (Snake)jeu de serpent (Snake)
jeu de serpent (Snake)chamhi
 
Rapport pfe talan_2018_donia_hammami
Rapport pfe talan_2018_donia_hammamiRapport pfe talan_2018_donia_hammami
Rapport pfe talan_2018_donia_hammamiDonia Hammami
 
Rapport projet: relisation d'une app desktop
Rapport projet: relisation d'une app desktop Rapport projet: relisation d'une app desktop
Rapport projet: relisation d'une app desktop amat samiâ boualil
 
RapportPFE_IngenieurInformatique_ESPRIT
RapportPFE_IngenieurInformatique_ESPRITRapportPFE_IngenieurInformatique_ESPRIT
RapportPFE_IngenieurInformatique_ESPRITLina Meddeb
 
Analyse de sentiments dans les médias sociaux
Analyse de sentiments dans les médias sociauxAnalyse de sentiments dans les médias sociaux
Analyse de sentiments dans les médias sociauxYacine Yakoubi
 
Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec dockergcatt
 
rapport de projet de fin d'étude_PFE
rapport de projet de fin d'étude_PFErapport de projet de fin d'étude_PFE
rapport de projet de fin d'étude_PFEDonia Hammami
 
Supervision informatique
Supervision informatiqueSupervision informatique
Supervision informatiqueMarwa Boumaiz
 
Madiha harifi last updated cv nn
Madiha harifi last updated cv nnMadiha harifi last updated cv nn
Madiha harifi last updated cv nnHarifi Madiha
 
Gestion des actifs applicatifs
Gestion des actifs applicatifsGestion des actifs applicatifs
Gestion des actifs applicatifsSafaAballagh
 
Virtualisation
VirtualisationVirtualisation
VirtualisationTsubichi
 
Maaouia Hamza Rapport de stage
Maaouia Hamza Rapport de stageMaaouia Hamza Rapport de stage
Maaouia Hamza Rapport de stageMaaouia Hamza
 
Rapport pfe 2017 Système de gestion des rendez-vous médicaux
Rapport pfe 2017 Système de gestion des rendez-vous médicaux Rapport pfe 2017 Système de gestion des rendez-vous médicaux
Rapport pfe 2017 Système de gestion des rendez-vous médicaux fehmi arbi
 
Microservices Testing Strategies JUnit Cucumber Mockito Pact
Microservices Testing Strategies JUnit Cucumber Mockito PactMicroservices Testing Strategies JUnit Cucumber Mockito Pact
Microservices Testing Strategies JUnit Cucumber Mockito PactAraf Karsh Hamid
 

Tendances (20)

Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...
Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...
Virtualization Explained | What Is Virtualization Technology? | Virtualizatio...
 
Rappport PFE 2012 Ghodhbane Hani - OpenSNC
Rappport PFE 2012 Ghodhbane Hani - OpenSNCRappport PFE 2012 Ghodhbane Hani - OpenSNC
Rappport PFE 2012 Ghodhbane Hani - OpenSNC
 
réaliser une plateforme d’automatisation et de génération des rapports de test
réaliser une plateforme d’automatisation et de génération des rapports de testréaliser une plateforme d’automatisation et de génération des rapports de test
réaliser une plateforme d’automatisation et de génération des rapports de test
 
jeu de serpent (Snake)
jeu de serpent (Snake)jeu de serpent (Snake)
jeu de serpent (Snake)
 
Rapport pfe talan_2018_donia_hammami
Rapport pfe talan_2018_donia_hammamiRapport pfe talan_2018_donia_hammami
Rapport pfe talan_2018_donia_hammami
 
Rapport projet: relisation d'une app desktop
Rapport projet: relisation d'une app desktop Rapport projet: relisation d'une app desktop
Rapport projet: relisation d'une app desktop
 
Rapport tp1 j2ee
Rapport tp1 j2eeRapport tp1 j2ee
Rapport tp1 j2ee
 
Docker
DockerDocker
Docker
 
RapportPFE_IngenieurInformatique_ESPRIT
RapportPFE_IngenieurInformatique_ESPRITRapportPFE_IngenieurInformatique_ESPRIT
RapportPFE_IngenieurInformatique_ESPRIT
 
Analyse de sentiments dans les médias sociaux
Analyse de sentiments dans les médias sociauxAnalyse de sentiments dans les médias sociaux
Analyse de sentiments dans les médias sociaux
 
Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec docker
 
rapport de projet de fin d'étude_PFE
rapport de projet de fin d'étude_PFErapport de projet de fin d'étude_PFE
rapport de projet de fin d'étude_PFE
 
Supervision informatique
Supervision informatiqueSupervision informatique
Supervision informatique
 
Madiha harifi last updated cv nn
Madiha harifi last updated cv nnMadiha harifi last updated cv nn
Madiha harifi last updated cv nn
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Gestion des actifs applicatifs
Gestion des actifs applicatifsGestion des actifs applicatifs
Gestion des actifs applicatifs
 
Virtualisation
VirtualisationVirtualisation
Virtualisation
 
Maaouia Hamza Rapport de stage
Maaouia Hamza Rapport de stageMaaouia Hamza Rapport de stage
Maaouia Hamza Rapport de stage
 
Rapport pfe 2017 Système de gestion des rendez-vous médicaux
Rapport pfe 2017 Système de gestion des rendez-vous médicaux Rapport pfe 2017 Système de gestion des rendez-vous médicaux
Rapport pfe 2017 Système de gestion des rendez-vous médicaux
 
Microservices Testing Strategies JUnit Cucumber Mockito Pact
Microservices Testing Strategies JUnit Cucumber Mockito PactMicroservices Testing Strategies JUnit Cucumber Mockito Pact
Microservices Testing Strategies JUnit Cucumber Mockito Pact
 

Similaire à Programmation Android - 05 - Google map

In01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google mapIn01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google mapYann Caron
 
Programmation Android - Tp2 Travaux pratiques - Geomatique
Programmation Android - Tp2 Travaux pratiques - GeomatiqueProgrammation Android - Tp2 Travaux pratiques - Geomatique
Programmation Android - Tp2 Travaux pratiques - GeomatiqueYann Caron
 
Programmation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteProgrammation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteYann Caron
 
Programmation Android - 00 - Présentation
Programmation Android - 00 - PrésentationProgrammation Android - 00 - Présentation
Programmation Android - 00 - PrésentationYann Caron
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesYann Caron
 
Programmation Android - 02 - Android
Programmation Android - 02 - AndroidProgrammation Android - 02 - Android
Programmation Android - 02 - AndroidYann Caron
 
Chapitre HTML5 API avancés
Chapitre HTML5 API avancésChapitre HTML5 API avancés
Chapitre HTML5 API avancésManel Ben Sassi
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesYann Caron
 
Programmation Android - 01 - Introduction
Programmation Android - 01 - IntroductionProgrammation Android - 01 - Introduction
Programmation Android - 01 - IntroductionYann Caron
 
In01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiquesIn01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiquesYann Caron
 
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…ACSG Section Montréal
 
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…ACSG - Section Montréal
 
Géomatique 2016 - Ville de Shawinigan
Géomatique 2016 - Ville de ShawiniganGéomatique 2016 - Ville de Shawinigan
Géomatique 2016 - Ville de Shawinigansandrine_emonin
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidYann Caron
 
De la bonne utilisation des globes virtuels en contexte professionnel
De la bonne utilisation des globes virtuels en contexte professionnelDe la bonne utilisation des globes virtuels en contexte professionnel
De la bonne utilisation des globes virtuels en contexte professionnelGéographiques
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesYann Caron
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionYann Caron
 
Rapport pfe ingénieur ilyes issaoui
Rapport pfe ingénieur ilyes issaouiRapport pfe ingénieur ilyes issaoui
Rapport pfe ingénieur ilyes issaouiIssaoui Ilyes
 

Similaire à Programmation Android - 05 - Google map (20)

In01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google mapIn01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google map
 
Programmation Android - Tp2 Travaux pratiques - Geomatique
Programmation Android - Tp2 Travaux pratiques - GeomatiqueProgrammation Android - Tp2 Travaux pratiques - Geomatique
Programmation Android - Tp2 Travaux pratiques - Geomatique
 
Programmation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteProgrammation Android - 10 - Spatialite
Programmation Android - 10 - Spatialite
 
Programmation Android - 00 - Présentation
Programmation Android - 00 - PrésentationProgrammation Android - 00 - Présentation
Programmation Android - 00 - Présentation
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancées
 
Programmation Android - 02 - Android
Programmation Android - 02 - AndroidProgrammation Android - 02 - Android
Programmation Android - 02 - Android
 
Itinéraire sur Google Maps
Itinéraire sur Google MapsItinéraire sur Google Maps
Itinéraire sur Google Maps
 
Chapitre HTML5 API avancés
Chapitre HTML5 API avancésChapitre HTML5 API avancés
Chapitre HTML5 API avancés
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancées
 
Programmation Android - 01 - Introduction
Programmation Android - 01 - IntroductionProgrammation Android - 01 - Introduction
Programmation Android - 01 - Introduction
 
In01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiquesIn01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiques
 
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
 
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
Act 00028 parce qu'une ville moyenne peut aussi être intelligente…
 
Géomatique 2016 - Ville de Shawinigan
Géomatique 2016 - Ville de ShawiniganGéomatique 2016 - Ville de Shawinigan
Géomatique 2016 - Ville de Shawinigan
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - android
 
De la bonne utilisation des globes virtuels en contexte professionnel
De la bonne utilisation des globes virtuels en contexte professionnelDe la bonne utilisation des globes virtuels en contexte professionnel
De la bonne utilisation des globes virtuels en contexte professionnel
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM bases
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introduction
 
Mags Project
Mags ProjectMags Project
Mags Project
 
Rapport pfe ingénieur ilyes issaoui
Rapport pfe ingénieur ilyes issaouiRapport pfe ingénieur ilyes issaoui
Rapport pfe ingénieur ilyes issaoui
 

Plus de Yann Caron

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownTextYann Caron
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesYann Caron
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesYann Caron
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genYann Caron
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresYann Caron
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationYann Caron
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionYann Caron
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusionYann Caron
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemisYann Caron
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmesYann Caron
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - heroYann Caron
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introductionYann Caron
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web servicesYann Caron
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeYann Caron
 
Programmation Android - 06 - Publication
Programmation Android - 06 - PublicationProgrammation Android - 06 - Publication
Programmation Android - 06 - PublicationYann Caron
 
Programmation Android - 04 - Databases
Programmation Android - 04 - DatabasesProgrammation Android - 04 - Databases
Programmation Android - 04 - DatabasesYann Caron
 
In01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publicationIn01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publicationYann Caron
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Yann Caron
 
In01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMIIn01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMIYann Caron
 

Plus de Yann Caron (19)

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownText
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langages
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmes
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code gen
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbres
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - Compilation
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - Introduction
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusion
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemis
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmes
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - hero
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introduction
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web services
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridge
 
Programmation Android - 06 - Publication
Programmation Android - 06 - PublicationProgrammation Android - 06 - Publication
Programmation Android - 06 - Publication
 
Programmation Android - 04 - Databases
Programmation Android - 04 - DatabasesProgrammation Android - 04 - Databases
Programmation Android - 04 - Databases
 
In01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publicationIn01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publication
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014
 
In01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMIIn01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMI
 

Programmation Android - 05 - Google map

  • 1. session sept 2016 Yann Caron (c) 2014 1 IN01 Programmation Android 05 – Google Maps Yann Caron Et Jean-Marc Farinone
  • 2. session sept 2016 Yann Caron (c) 2014 2 Sommaire - Séance 05  Géolocalisation – Principes  Géolocalisation – Android  Google Maps – Mise en œuvre  Google Maps – Utilisation ➔ Configurer, camera, markers, icon ➔ Dessins, fenêtre  Google API ➔ Geocoding, Directions, Distance, Elevation  Conclusion
  • 3. session sept 2016 Yann Caron (c) 2014 3 IN01 – Séance 05 Géolocalisation – principes
  • 4. session sept 2016 Yann Caron (c) 2014 4 GPS  GPS == Global Positioning System  Un total de 24 satellites (21 + 3 secours) autour du globe répartis sur 6 orbites  Utilise des satellites NAVSTAR (Navigation Satellite Timing And Ranging) diffusant leur position et l'heure  Situés à 20 184 km de la surface du globe, parcourent leur orbite en 12 h et émettent à des fréquences dans la bande des micro-ondes (~1500Mhz). Slide original (c) JMF
  • 5. session sept 2016 Yann Caron (c) 2014 5 Temps de propagation  Le GPS se synchronise puis calcule la distance avec le satellite grâce à la différence de temps en émission et réception  Distance = deltaT * c (célérité du signal dans l'aire ~ vitesse de la lumière : ~300 000 km/s) Delta T1 T2
  • 6. session sept 2016 Yann Caron (c) 2014 6 Triangulation  Fonctionnement par triangulation : 4 positions sont nécessaires pour calculer la position.  Un de plus par dimension souhaitée. 3D == 4 satellites Avec 3 satellites : vous êtes ici !! Sur un plan à 2 dimensions Mais à quelle altitude ?? Avec 2 satellites : 2 points possibles Avec 1 satellite : circonférence
  • 7. session sept 2016 Yann Caron (c) 2014 7 Triangulation - Sphères  En 3D, il faut imaginer des sphères : Si les 2 points sont sur la surface de la Terre, il faut un 4e satellite
  • 8. session sept 2016 Yann Caron (c) 2014 8 GPS - Précision  Précision de 15 à 100 mètres  WASS (US)/EGNOS (Eur) affinent la précision avec des balises au sol (< 3 mètres) Slide original (c) JMF
  • 9. session sept 2016 Yann Caron (c) 2014 9 SBAS  SBAS – Satellite-based Augmentation Systems  Réseau de stations au sol (WMS Wide Area reference Station) qui connaissent leur position et la comparent aux coordonnées calculées par GPS. La correction est ensuite envoyée aux satellites via des satellites géostationnaires
  • 10. session sept 2016 Yann Caron (c) 2014 10 Géolocalisation par relais  La même chose, mais par relais téléphoniques GSM ou Wifi  Conseillé, car consomme moins d'énergie (batterie) et la réception est meilleure  Source : http://developer.android.com/guide/topics/loca tion/strategies.html
  • 11. session sept 2016 Yann Caron (c) 2014 11 Géolocalisation CellID - GSM  L'altitude est connue  Fonctionne par recouvrement et non triangulation  Cell-Id : évalue quels relais sont accessibles et déduit la zone de recouvrement
  • 12. session sept 2016 Yann Caron (c) 2014 12 IN01 – Séance 05 Géolocalisation – Android
  • 13. session sept 2016 Yann Caron (c) 2014 13 Géolocalisation - Android  Pour utiliser la géolocalisation sur Android, il suffit de faire appel au bon service : Context.LOCATION_SERVICE  Deux façons de procéder : ➔ En récupérant la dernière position connue ➔ De façon évènementielle, c'est-à-dire recevoir une mise à jour régulière via un callback (système évènementiel)
  • 14. session sept 2016 Yann Caron (c) 2014 14 Dernière position connue LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); String provider = locationManager.getBestProvider(criteria, false); Location location = locationManager.getLastKnownLocation(provider); // Initialize the location fields if (location != null) { float lat = (float) (location.getLatitude()); float lng = (float) (location.getLongitude()); Log.i(BaitFragment.class.getName(), String.valueOf(lat)); Log.i(BaitFragment.class.getName(), String.valueOf(lng)); } else { Log.i(BaitFragment.class.getName(), "Provider not available"); Log.i(BaitFragment.class.getName(), "Provider not available"); } Service Dernière position connue
  • 15. session sept 2016 Yann Caron (c) 2014 15 Géolocalisation Android - Callback  On veut être notifié régulièrement pour traiter les changements ➔ Par exemple pour tracer le déplacement sur une carte, calculer la vitesse, le déplacement  Il suffit de le demander au service et d'y abonner un callback (évènement)
  • 16. session sept 2016 Yann Caron (c) 2014 16 Géolocalisation Android - Callback LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) {} public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 1, locationListener); Service Appelé lorsque la position change ou périodiquement Attache le callback
  • 17. session sept 2016 Yann Caron (c) 2014 17 Géolocalisation – Permissions  Deux providers : NETWORK_PROVIDER (GSM et Wifi) et GPS_PROVIDER  Il faut ajouter des autorisations à l'application ➔ ACCESS_COARSE_LOCATION : pour la localisation à base de réseaux ➔ ACCESS_FINE_LOCATION : comme la précédente, le GPS en plus
  • 18. session sept 2016 Yann Caron (c) 2014 18 IN01 – Séance 05 Google Maps – Mise en œuvre
  • 19. session sept 2016 Yann Caron (c) 2014 19 Google Maps  L'avantage d'Android est de bénéficier d'applications développées par Google… dont Google Maps  Une API est mise à disposition gratuitement depuis le SDK Manager.  Il suffit de la télécharger et de demander une clé (API Key)  Référence : https://developers.google.com/maps/documentatio n/android Slide original (c) JMF
  • 20. session sept 2016 Yann Caron (c) 2014 20 Google Maps  On utilise donc les Google Maps Android API v2  Cette API permet de manipuler des cartes terrestres  Ces classes se trouvent dans le package com.google.android.gms.maps  Pour afficher une carte, on utilise soit un fragment soit une vue  Cette API gère les entrées clavier, le zoom, le toucher sur une carte affichée  On peut dessiner, ajouter des images, des marqueurs et des infos sur la carte Slide original (c) JMF
  • 21. session sept 2016 Yann Caron (c) 2014 21 Google Maps  La création d'une activity GoogleMap a été simplifié dans Android Studio  Pour utiliser les cartes Google, il faut suivre les étapes suivantes : ➔ 1 - Importer la bibliothèque googleMap dans le projet ➔ 2 - Écrire une activité demandant à afficher une carte Google ➔ 3 - Obtenir une clé Maps API v2 Key ➔ 4 – Configurer le manifest  Toute la procédure est indiquée à https://developers.google.com/maps/documentation/android/st art Slide original (c) JMF
  • 22. session sept 2016 Yann Caron (c) 2014 22 1 - Ajouter les dépendances  Clique droit sur le projet  OpenModuleSettings  Onglet Dependencies  Bouton “+”  Library dependency  Choisir com.google.android.gms: ➔ play-services:[version] ➔ Play-services-maps:[version]
  • 23. session sept 2016 Yann Caron (c) 2014 23
  • 24. session sept 2016 Yann Caron (c) 2014 24 2 – Créer une MapsActivity  Dans Android Studio; file/new/google/google map activity
  • 25. session sept 2016 Yann Caron (c) 2014 25 3 – Obtenir une clé  Une fois l'activity créée il faut lancer l'application  Dans les logs de l'application, GoogleMap indique une erreur : ➔ Authentication failed on the server  Suivi de l'url à contacter ➔ https://console.developers.google.com  Et du fingerprint ➔ Un algorithme de hashage SHA-1 qui prend, entre autre, le numéro de série de l'appareil, des données de la machine de developpement et le nom de l'application
  • 26. session sept 2016 Yann Caron (c) 2014 26 3 – Obtenir une clé  Se rendre sur le site developpers.google.com (URL ci-dessus)  Activer une nouvelle API  Choisir GoogleMap Android API  Cliquer sur Identifiants  Créer une clé Android
  • 27. session sept 2016 Yann Caron (c) 2014 27 Google Developers Console  Y introduire le nom du package et le fingerprint
  • 28. session sept 2016 Yann Caron (c) 2014 28 3 – Optenir une clé  Le site génère la clé  Qu'il faut reporter dans le manifest de l'application : manifests/AndroidManifest.xml <meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyClOKIkn93L6B8N1nJXRzLIjZMPkg9PQMw"/>
  • 29. session sept 2016 Yann Caron (c) 2014 29 GoogleMap  Ou dans un fichier dédié : ➔ Res/values/google_maps_api.xml  Lancer l'application
  • 30. session sept 2016 Yann Caron (c) 2014 30 4 – Configurer AndroidManifest.xml  Il faut ensuite créer quelques permissions standard <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 31. session sept 2016 Yann Caron (c) 2014 31 4 – Configurer AndroidManifest.xml  Ainsi que quelques paramètres optionnels : ➔ Pour géolocaliser ➔ Pour le rendu 3D <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
  • 32. session sept 2016 Yann Caron (c) 2014 32 4 – Manifest - Extrait <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/global_app_name" android:theme="@style/AppTheme" > <meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyAO5eGksIpKNF7kUTuG5Qe3dCCIBG_hXKc" /> </application> </manifest>
  • 33. session sept 2016 Yann Caron (c) 2014 33 Utiliser MapView  Il est possible d'utiliser GoogleMap sous forme d'une vue : MapView  Attention !! Si cette vue est utilisée, il faut relayer tous les évènements du conteneur (Activity, Fragment) vers la vue  C.-à-d. : onCreate(), onDestroy(), onResume() et onPause()  Sinon ça n'affiche rien (mauvaise expérience !!)
  • 34. session sept 2016 Yann Caron (c) 2014 34 Dans le fichier XML  On peut désormais ajouter la vue dans une Activity ou un Fragment. Ce sera un fragment. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.google.android.gms.maps.MapView android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
  • 35. session sept 2016 Yann Caron (c) 2014 35 Dans le fichier Java public class PlaceMapFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_map, container, false); mapView = (MapView) v.findViewById(R.id.mapview); mapView.onCreate(savedInstanceState); MapsInitializer.initialize(this.getActivity()); return v; } @Override public void onResume() { mapView.onResume(); super.onResume(); } @Override public void onDestroy() { super.onDestroy(); mapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mapView.onLowMemory(); } } On relaye les évènements
  • 36. session sept 2016 Yann Caron (c) 2014 36 Résultat
  • 37. session sept 2016 Yann Caron (c) 2014 37 Fragment  Il est également possible d'utiliser googleMap sous la forme d'un Fragment ➔ Android Responsive; gérer les tailles d'écrans  Pour se faire, la classe GoogleMap doit hériter de SupportMapFragment ou MapFragment ➔ Rend l'utilisation du composant graphique réutilisable  Attention toutefois à la méthode onCreateView où il faut impérativement appeler la méthode surchargée
  • 38. session sept 2016 Yann Caron (c) 2014 38 Fragment - code public class MyMapFragment extends SupportMapFragment { @Override public View onCreateView(final LayoutInflater inflater, ViewGroup group, Bundle bundle) { View view; // TODO !!!! Invoquer le onCreateView de la super classe, sinon exception // plutôt que : view = inflater.inflate(R.layout.map_fragment, group, false); view = super.onCreateView(inflater, group, bundle); this.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { } }); return view; } } Attention
  • 39. session sept 2016 Yann Caron (c) 2014 39 IN01 – Séance 05 Google Maps – Utilisation
  • 40. session sept 2016 Yann Caron (c) 2014 40 Types de Map  Il existe plusieurs types de maps : NORMAL,  HYBRID, SATELLITE, TERRAIN, NONE (juste la grille)  Propriété Java : setMapType(GoogleMap.MAP_TYPE_NORMAL)  Tag XML : mapType  Attention ! Il faut ajouter le xml name space (xmlns) dans la vue ou le layout XML : xmlns:map="http://schemas.android.com/apk/res-auto"
  • 41. session sept 2016 Yann Caron (c) 2014 41 Propriétés importantes  Position initiale de la caméra : cameraTargetLat, cameraTargetLng,  cameraZoom, cameraBearing, cameraTilt  Contrôles visuels : uiZoomControls,  uiCompass  Comportement de la gesture : uiZoomGestures, uiScrollGestures,  uiRotateGestures, uiTiltGestures
  • 42. session sept 2016 Yann Caron (c) 2014 42 Exemple <com.google.android.gms.maps.MapView xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" map:cameraBearing="112.5" map:cameraTargetLat="-33.796923" map:cameraTargetLng="150.922433" map:cameraTilt="30" map:cameraZoom="13" map:mapType="hybrid" map:uiCompass="false" map:uiRotateGestures="true" map:uiScrollGestures="true" map:uiTiltGestures="true" map:uiZoomControls="true" map:uiZoomGestures="true" /> Namespace
  • 43. session sept 2016 Yann Caron (c) 2014 43 Placer la caméra  Un site web bien utile : http://www.gps- coordinates.net/ pour obtenir les coordonnées géographiques
  • 44. session sept 2016 Yann Caron (c) 2014 44 Placer la caméra  Le placement est animé  Il faut créer un objet LatLng (un tuple latitude et longitude)  Ou utiliser la dernière position connue (GPS ?) MapsInitializer.initialize(this.getActivity()); // position LatLng annemasse = new LatLng(46.193253, 6.2341579); // positionnement initial map.moveCamera(CameraUpdateFactory.newLatLngZoom(annemasse, 15)); // animation map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); Zoom initial Durée de l'animation Type d'animation et données d'arrivée Obligatoirement avant
  • 45. session sept 2016 Yann Caron (c) 2014 45 Ajouter un marqueur  Marqueur par défaut  On définit une position et un titre  La propriété snippet(), c'est le texte qui apparait lorsque l'utilisateur clique sur le marqueur map.addMarker(new MarkerOptions() .position(annemasse) .title("Ma maison") .snippet("J'habite Annemasse") );
  • 46. session sept 2016 Yann Caron (c) 2014 46 Marqueur personnalisé  Plusieurs propriétés permettent de personnaliser le marqueur ➔ icon(), alpha(),  rotation(), draggable() map.addMarker(new MarkerOptions() .position(annemasse) .title("Ma maison") .snippet("J'habite Annemasse") .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)) );
  • 47. session sept 2016 Yann Caron (c) 2014 47 Custom info windows  On peut personnaliser la fenêtre d'informations (titre et snippet)
  • 48. session sept 2016 Yann Caron (c) 2014 48 Custom info windows  Comme pour toute UI, il est possible de tout écrire en Java ou en XML (inflater)  Il faut prévoir des TextView pour le titre et le texte du snippet <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/ res/android" xmlns:app="http://schemas.android.com/apk/ res/fr.cnam.pecheurduleman" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="2" > <ImageView android:src="@drawable/fish_green" app:layout_rowSpan="2" /> <TextView android:id="@+id/info_title" android:layout_margin="5dp" android:textSize="20dp" android:textColor="#ff00760f" /> <TextView android:id="@+id/info_snippet" android:layout_margin="5dp" android:textSize="15dp" android:textColor="#ff303030" /> </android.support.v7.widget.GridLayout>
  • 49. session sept 2016 Yann Caron (c) 2014 49 Custom info windows  Il suffit d'implémenter l'interface InfoWindowAdapter map.setInfoWindowAdapter(new InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { return null; } @Override public View getInfoContents(Marker marker) { View v = inflater.inflate(R.layout.map_info_window, null); TextView title = (TextView) v.findViewById(R.id.info_title); title.setText(marker.getTitle()); TextView snippet = (TextView) v.findViewById(R.id.info_snippet); snippet.setText(marker.getSnippet()); return v; } });
  • 50. session sept 2016 Yann Caron (c) 2014 50 InfoWindowAdapter  Deux méthodes à implémenter : ➔ getInfoWindow() : permet de customiser toute la fenêtre ➔ getInfoContents() : permet de ne customiser que le contenu de la fenêtre  Attention !! Dans le cas où on implémente getInfoContents(), la vue est chargée comme une image statique (pas de changement possible)
  • 51. session sept 2016 Yann Caron (c) 2014 51 Plus d'informations  setOnInfoWindowClickListener() : comme son nom l'indique, permet de brancher un callback sur le clic de l'info window map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { Log.i(PlaceMapFragment.class.getName(), "On a cliqué sur " + marker.getTitle() + " [" + marker.getSnippet() + "]"); } }); Le marqueur
  • 52. session sept 2016 Yann Caron (c) 2014 52 Dessiner sur la carte  Il est possible de dessiner des formes géométriques sur la carte selon des coordonnées géographiques ➔ Des cercles : addCircle() ➔ Des polygones : addPolygone() ➔ Des polylines (polygone vide) : addPolyline() ➔ Des images : addGroundOverlay() ➔ Des textures : addTileOverlay(). Ce dernier permet de décorer ou de remplacer les images de terrain fournies par Google. Il faut gérer les niveaux de zoom
  • 53. session sept 2016 Yann Caron (c) 2014 53 Exemple de dessin map.addCircle(new CircleOptions() .center(annemasse) .radius(1000) // en mètres .strokeWidth(5).strokeColor(Color.GRAY)); map.addCircle(new CircleOptions() .center(portChoiseul) .radius(1000) // en mètres .strokeWidth(5).strokeColor(Color.GRAY)); map.addPolyline((new PolylineOptions()) .add(annemasse, portChoiseul, corsierPort, annemasse) .width(5).color(Color.BLUE) .geodesic(true)); Coordonnées LatLng
  • 54. session sept 2016 Yann Caron (c) 2014 54 IN01 – Séance 05 Google API
  • 55. session sept 2016 Yann Caron (c) 2014 55 Google API  Depuis quelques années, Google met à disposition des Webservices dédiés à GoogleMap  https://developers.google.com/maps/web- services/  Notablement : Geocoding, Places, Elevations, Geolocation, Directions
  • 56. session sept 2016 Yann Caron (c) 2014 56 Principe  L'application android appel une URL  Le serveur HTTP lui renvoie un “streaming” XML ou JSON  Détaillé dans le cours sur les WebServices  URL HTTP : ➔ http://maps.googleapis.com/maps/api/geocode/output?parameters  URL HTTPS : ➔ https://maps.googleapis.com/maps/api/geocode/output?parameters
  • 57. session sept 2016 Yann Caron (c) 2014 57 Google Maps Geocoding API  Destiné à affecter des coordonnées géographiques à des adresses. ➔ Exemple : "1600 Amphitheatre Parkway, Mountain View, CA" ➔ Renvoie : latitude 37.423021 and longitude -122.083739  Et inversement “reverse geocoding”
  • 58. session sept 2016 Yann Caron (c) 2014 58 Geocoding
  • 59. session sept 2016 Yann Caron (c) 2014 59 Exemple  JSON URL : ➔ https://maps.googleapis.com/maps/api/geocode/json? address=1600+Amphitheatre+Parkway,+Mountain+View, +CA&key=YOUR_API_KEY  XML URL : ➔ https://maps.googleapis.com/maps/api/geocode/xml? address=1600+Amphitheatre+Parkway,+Mountain+View, +CA&key=YOUR_API_KEY  YOUR_API_KEY (bonne pratique) : getResources().getString(R.string.google_maps_key);
  • 60. session sept 2016 Yann Caron (c) 2014 60 JSON { "results" : [ { "address_components" : [ { "long_name":"1600", "short_name":"1600", "types":["street_number"]}, [...] ], "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA", "geometry" : { "location" : {"lat" : 37.4224764, "lng" : -122.0842499}, "location_type" : "ROOFTOP", "viewport" : { "northeast" : {"lat" : 37.4238253802915, "lng" : -122.0829009197085}, "southwest" : {"lat" : 37.4211274197085, "lng" : -122.0855988802915} } }, "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA", "types" : [ "street_address" ] } ], "status" : "OK" }
  • 61. session sept 2016 Yann Caron (c) 2014 61 XML <GeocodeResponse> <status>OK</status> <result> <type>street_address</type> <formatted_address>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</formatted_address> <geometry> <location> <lat>37.4217550</lat> <lng>-122.0846330</lng> </location> <location_type>ROOFTOP</location_type> <viewport> <southwest> <lat>37.4188514</lat> <lng>-122.0874526</lng> </southwest> <northeast> <lat>37.4251466</lat> <lng>-122.0811574</lng> </northeast> </viewport> </geometry> <place_id>ChIJ2eUgeAK6j4ARbn5u_wAGqWA</place_id> </result> </GeocodeResponse>
  • 62. session sept 2016 Yann Caron (c) 2014 62 Reverse Geocoding  Address Lookup  Determine l'addresse à partir de la position ➔ https://maps.googleapis.com/maps/api/g eocode/json?latlng=40.714224,- 73.961452&key=YOUR_API_KEY  Le résultat est le même que pour le Geocoding (contient les deux informations)
  • 63. session sept 2016 Yann Caron (c) 2014 63 Google Maps Geolocation  Google Maps Geolocation donne la position de l'appareil en se basant sur les antennes relais et les bornes Wi-fi  Utile si l'appareil ne connais pas sa position  Google sait où vous êtes  URL : ➔ https://www.googleapis.com/geolocation /v1/geolocate?key=YOUR_API_KEY
  • 64. session sept 2016 Yann Caron (c) 2014 64 Google Places API Web Service  Permet de rechercher les lieux intéressants  Recherche aux alentours : ➔ https://maps.googleapis.com/maps/api/p lace/nearbysearch/json?location=- 33.8670522,151.1957362&radius=500&type s=food&name=cruise&key=YOUR_API_KEY  Renvoie une liste de placeID ➔ Exemple : ChIJN1t_tDeuEmsRUsoyG83frY4
  • 65. session sept 2016 Yann Caron (c) 2014 65 Google Places API Web Service  Détail du lieu : ➔ https://maps.googleapis.com/maps/api/place/detai ls/json? placeid=ChIJN1t_tDeuEmsRUsoyG83frY4&key=YOUR_API _KEY  Il faut utiliser le placeId  Mais aussi : ➔ Ajout d'un lieu d'intérêt (modéré par Google) ➔ Accès aux photos du lieu ➔ Auto complétion (liste de lieux, selon les premières lettres saisies)
  • 66. session sept 2016 Yann Caron (c) 2014 66 Google Maps API  Elevation API : renvoie les altitudes entre deux points ou selon un chemin  Google Maps Roads API : renvoie les routes traversées lors d'un trajet  Google Maps Distance Matrix API : les distances et durées pour plusieurs destinations  Google Maps Directions API : Calcul l'itinéraire  Google Maps Time Zone API : renvoie le fuseau horaire de la position  En plus de Geocoding, Geolocation et Places
  • 67. session sept 2016 Yann Caron (c) 2014 67 Java Client for Google Maps Services  Une API Java (OpenSource) pour abstraire la manipulation des web service Google  https://github.com/googlemaps/googl e-maps-services-java  Exemple : GeoApiContext context = new GeoApiContext().setApiKey("AIza..."); GeocodingResult[] results = GeocodingApi.geocode(context, "1600 Amphitheatre Parkway Mountain View, CA 94043").await(); System.out.println(results[0].formattedAddress);
  • 68. session sept 2016 Yann Caron (c) 2014 68 IN01 – Séance 05 Conclusion
  • 69. session sept 2016 Yann Caron (c) 2014 69 Conclusion  Une vue très puissante. Un grand nombre de possibilités  Utilisation de la géolocalisation (tracés temps réels, enregistrement de position)  Un grand nombre de webservices fournis par Google  Mais d'autres sont disponibles, quelques idées : ➔ Windspot (afficher les vents), Météo, METAR (afficher les données météo aéronautiques par aéroports)  D'autres idées ??
  • 70. session sept 2016 Yann Caron (c) 2014 70 Pour aller plus loin  Google met à disposition StreetView dans son API : StreetViewPanoramaFragment  My location button setMyLocationButtonEnabled et setOnMyLocationButtonClickListener  Afficher les batiments : setBuildingEnabled  Incliner la caméra : CameraPosition.Builder.bearing, target,  tilt et zoom  Évènements : setOnMapClickListener
  • 71. session sept 2016 Yann Caron (c) 2014 71 Batiments 3D
  • 72. session sept 2016 Yann Caron (c) 2014 72 Fin  Merci de votre attention  Des questions ?