Programmation Web :Programmation Web :API Google Maps v.3API Google Maps v.3
Couches cartographiquesCouches cartographiques
Jérôme CUTRONAJérôme CUTRONA
[email protected]@univ-reims.fr
05:06:2805:06:28 Programmation Web 2014-2015Programmation Web 2014-2015 11
Site Google MapsSite Google Maps
Google MapsGoogle Maps http://maps.google.frhttp://maps.google.fr Cartes et plans interactifs HTML / AJAX / JavaScriptCartes et plans interactifs HTML / AJAX / JavaScript Initié par Google en 2004 aux Etats Unis, couvre Initié par Google en 2004 aux Etats Unis, couvre
aujourd’hui tout le globe (ainsi que la lune et mars…)aujourd’hui tout le globe (ainsi que la lune et mars…)
2205:06:2805:06:28 Programmation Web 2014-2015Programmation Web 2014-2015
API Google MapsAPI Google Maps
API Maps: Application Programming InterfaceAPI Maps: Application Programming Interface Fournie par GoogleFournie par Google Bibliothèque de fonctionnalités en JavaScriptBibliothèque de fonctionnalités en JavaScript Intégration de cartes dans des pages webIntégration de cartes dans des pages web Permet le paramétrage des cartes Permet le paramétrage des cartes Fonctionnalités / vues personnalisées possiblesFonctionnalités / vues personnalisées possibles
JavaScriptJavaScript : programmation pour navigateur : programmation pour navigateur (Firefox, Internet Explorer, Opera, Safari, …)(Firefox, Internet Explorer, Opera, Safari, …)
Page web intégrant une carte Page web intégrant une carte : document HTML : document HTML contenant un programme d’interactioncontenant un programme d’interaction
3305:06:2805:06:28 Programmation Web 2014-2015Programmation Web 2014-2015
Intégration des cartes dans un siteIntégration des cartes dans un site
L’API permet l’L’API permet l’intégration de cartes intégration de cartes dans un sitedans un site PersonnalisationPersonnalisation possible : possible :
Types de carte Google (plan, satellite, relief)Types de carte Google (plan, satellite, relief) Calcul d’itinéraires routiersCalcul d’itinéraires routiers Ajout de (quelques) marqueurs / polygonesAjout de (quelques) marqueurs / polygones Couches de cartographie personnaliséesCouches de cartographie personnalisées
4405:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
Le monde selon mon GPSLe monde selon mon GPS
5505:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
Positionnement bidimensionnel sur le globePositionnement bidimensionnel sur le globe Latitude Latitude φφ et longitude et longitude λλ
Source de l’illustration:Source de l’illustration:http://commons.wikimedia.orghttp://commons.wikimedia.org
Le monde selon Google MapsLe monde selon Google Maps
6605:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
Espace tridimensionnel d’imagesEspace tridimensionnel d’images Image Image 2 dimensions (x et y) 2 dimensions (x et y) Grandissement Grandissement 3 3èmeème dimension (z) dimension (z)
Dallage de la surface terrestreDallage de la surface terrestre Images 256 pixels × 256 pixels = DallesImages 256 pixels × 256 pixels = Dalles Coordonnées en pixelsCoordonnées en pixels
Niveaux de grandissementNiveaux de grandissement Multiplication ou division par 2Multiplication ou division par 2 1 image 256×256 au grandissement 1 image 256×256 au grandissement zz
= 4 images 256×256 au grandissement = 4 images 256×256 au grandissement z+1 z+1
Le monde selon Google MapsLe monde selon Google Maps
7705:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
z=0 (grandissement)z=0 (grandissement)
Dalle 0, 0Dalle 0, 0
256 pixels256 pixels
256 pixels
256 pixels
Le monde selon Google MapsLe monde selon Google Maps
8805:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
z=1z=1
Dalle 0, 0Dalle 0, 0
Dalle 0, 0Dalle 0, 0 Dalle 1, 0Dalle 1, 0
Dalle 0, 1Dalle 0, 1 Dalle 1, 1Dalle 1, 1
256 pixels256 pixels
256 pixels
256 pixels
256 pixels256 pixels
256 pixels
256 pixels
Le monde selon Google MapsLe monde selon Google Maps
9905:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
z=2z=2
256 p256 p
2, 02, 0 3, 03, 0
2, 12, 1 3, 13, 1
0, 20, 2 1, 21, 2 2, 22, 2 3, 23, 2
0, 30, 3 1, 31, 3 2, 32, 3 3, 33, 3
256 p256 p 256 p256 p 256 p256 p
256 p
256 p
256 p
256 p
256 p
256 p
256 p
256 p
1, 01, 0
0, 10, 1 1, 11, 1
0, 00, 0
Le monde selon Google MapsLe monde selon Google Maps
101005:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
Quantité de données et résolutionQuantité de données et résolution
ZoomZoom X,YX,Y DallesDalles MPixelsMPixels
00 11 11 0,10,1
11 22 44 0,30,3
22 44 1616 1,01,0
33 88 6464 4,24,2
44 1616 256256 16,816,8
55 3232 1 0241 024 67,167,1
66 6464 4 0964 096 268268
77 128128 16 38416 384 1 0741 074
88 256256 65 53665 536 4 2954 295
99 512512 262 144262 144 17 18017 180
1010 1 0241 024 1 048 5761 048 576 68 71968 719
ZoomZoom X,YX,Y DallesDalles MPixelsMPixels
1111 2 0482 048 4 194 3044 194 304 274 878274 878
1212 4 0964 096 16 777 21616 777 216 1 099 5121 099 512
1313 8 1928 192 67 108 86467 108 864 4 398 0474 398 047
1414 16 38416 384 268 435 456268 435 456 17 592 18617 592 186
1515 32 76832 768 1 073 741 8241 073 741 824 70 368 74470 368 744
1616 65 53665 536 4 294 967 2964 294 967 296 281 474 977281 474 977
1717 131 072131 072 17 179 869 18417 179 869 184 1 125 899 9071 125 899 907
1818 262 144262 144 68 719 476 73668 719 476 736 4 503 599 6274 503 599 627
1919 524 288524 288 274 877 906 944274 877 906 944 18 014 398 50918 014 398 509
2020 1 048 5761 048 576 1 099 511 627 7761 099 511 627 776 72 057 594 03872 057 594 038
2121 2 097 1522 097 152 4 398 046 511 1044 398 046 511 104 288 230 376 152288 230 376 152
Lien coordonnées Google Maps / GPSLien coordonnées Google Maps / GPS
111105:06:2905:06:29 Programmation Web 2014-2015Programmation Web 2014-2015
Projection des points du globe sur un planProjection des points du globe sur un plan Projection de MercatorProjection de Mercator XX = ( = (λλ + 180) / 360 + 180) / 360 YY=0,5 - log((1+sin(=0,5 - log((1+sin(φφ/180×/180×ππ)) / (1-sin()) / (1-sin(φφ/180×/180×ππ))) /4×))) /4×ππ
Projection des points du plan sur le globeProjection des points du plan sur le globe λλ=360 × =360 × XX - 180 - 180 φφ=360 × atan(exp(=360 × atan(exp(ππ×(1-2××(1-2×YY))) /))) / π π – 90 – 90
Adaptation à Google MapsAdaptation à Google Maps Prise en compte du grandissement Prise en compte du grandissement zz Introduction d’un facteur Introduction d’un facteur 22zz
Objets proposés pour les conversionsObjets proposés pour les conversions
/* Classe abstraite de gestion d'un point 2D aux /* Classe abstraite de gestion d'un point 2D aux coordonnées entières */coordonnées entières */
abstractabstract classclass Point Point {{……/* Dalle cartographique *//* Dalle cartographique */classclass Tile Tile extendsextends Point Point {{……/* Un pixel vu par ses coordonnées *//* Un pixel vu par ses coordonnées */classclass Pixel Pixel extendsextends Point Point {{……/* Pixel dans une dalle cartographique *//* Pixel dans une dalle cartographique */classclass PixelInTile PixelInTile {{……/* Coordonnées GPS *//* Coordonnées GPS */classclass LatLng LatLng {{……
121205:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe PointPoint
/*/* * Classe abstraite de gestion d'un point 2D aux coordonnées * Classe abstraite de gestion d'un point 2D aux coordonnées entièresentières */ */abstractabstract classclass Point Point {{ /*/* * @var int abscisse * @var int abscisse */ */ protectedprotected $$_x_x ; ; /*/* * @var int ordonnée * @var int ordonnée */ */ protectedprotected $$_y_y ; ;
/*/* * Constructeur * Constructeur * @param $x abscisse * @param $x abscisse * @param $y ordonnée * @param $y ordonnée */ */ publicpublic functionfunction __construct__construct(($$xx==00, , $$yy==00)) {{ $$thisthis->->setset(($$xx, , $$yy)) ; ; }}
131305:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe PointPoint
/*/* * Réaffecteur * Réaffecteur * @param $x abscisse * @param $x abscisse * @param $y ordonnée * @param $y ordonnée * @return void * @return void */ */ publicpublic functionfunction set set(($$xx, , $$yy)) {{ $$thisthis->->_x _x == ((intint)) $$xx ; ; $$thisthis->->_y _y == ((intint)) $$yy ; ; }}
/*/* * Accesseur abscisse * Accesseur abscisse * @return int * @return int */ */ publicpublic functionfunction getX getX()() {{ returnreturn $$thisthis->->_x ;_x ; }}
141405:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
/*/* * Accesseur ordonnée * Accesseur ordonnée * @return int * @return int */ */ publicpublic functionfunction getY getY()() {{ returnreturn $$thisthis->->_y ;_y ; }}
/*/* * Conversion en chaîne * Conversion en chaîne * de caractères* de caractères */ */ publicpublic abstractabstract functionfunction __tostring__tostring()() ; ;}}
Classe Classe TileTile
/*/* * Dalle cartographique * Dalle cartographique */ */classclass Tile Tile extendsextends Point Point {{ /*/* * @var int Largeur d'une dalle * @var int Largeur d'une dalle */ */ privateprivate staticstatic $$_tileWidth_tileWidth == 256256 ; ; /*/* * @var int Hauteur d'une dalle * @var int Hauteur d'une dalle */ */ privateprivate staticstatic $$_tileHeight_tileHeight == 256256 ; ;
/*/* * Conversion en chaîne de caractères * Conversion en chaîne de caractères */ */ publicpublic functionfunction __tostring__tostring()() {{ returnreturn " "Tile[Tile[{{$$thisthis->->_x_x}}, , {{$$thisthis->->_y_y}}]]" ;" ; }}
151505:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe TileTile
/*/* * Accesseur à la largeur d'une dalle * Accesseur à la largeur d'une dalle * @return int * @return int */ */ publicpublic staticstatic functionfunction getWidth getWidth()() {{ returnreturn selfself::$::$_tileWidth_tileWidth ; ; }}
/*/* * Réaffecteur de la largeur d'une dalle * Réaffecteur de la largeur d'une dalle * @param $tileWidth Nouvelle largeur * @param $tileWidth Nouvelle largeur */ */ publicpublic staticstatic functionfunction setTileWidth setTileWidth(($$tileWidthtileWidth)) {{ selfself::$::$_tileWidth_tileWidth == ((intint)) $$tileWidthtileWidth ; ; }}
161605:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe TileTile
/*/* * Accesseur à la hauteur d'une dalle * Accesseur à la hauteur d'une dalle * @return int * @return int */ */ publicpublic staticstatic functionfunction getHeight getHeight()() {{ returnreturn selfself::$::$_tileHeight_tileHeight ; ; }}
/*/* * Réaffecteur de la hauteur d'une dalle * Réaffecteur de la hauteur d'une dalle * @param $tileWidth Nouvelle largeur * @param $tileWidth Nouvelle largeur */ */ publicpublic staticstatic functionfunction setTileHeight setTileHeight(($$tileHeighttileHeight)) {{ selfself::$::$_tileHeight_tileHeight == ((intint)) $$tileHeighttileHeight ; ; }}}}
171705:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe PixelPixel
/*/* * Un pixel vu par ses coordonnées * Un pixel vu par ses coordonnées */ */classclass Pixel Pixel extendsextends Point Point {{ /*/* * Conversion en chaîne de caractères * Conversion en chaîne de caractères */ */ publicpublic functionfunction __tostring__tostring()() {{ returnreturn " "Pixel[Pixel[{{$$thisthis->->_x_x}}, , {{$$thisthis->->_y_y}}]]" ;" ; }}}}
181805:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe PixelInTilePixelInTile
/*/* * Pixel dans une dalle cartographique * Pixel dans une dalle cartographique */ */classclass PixelInTile PixelInTile {{ /*/* * @var Tile Dalle cartographique * @var Tile Dalle cartographique */ */ privateprivate $$_tile_tile ; ; /*/* * @var Pixel Pixel par rapport à la dalle cartographique * @var Pixel Pixel par rapport à la dalle cartographique */ */ privateprivate $$_pixel_pixel ; ;
/*/* * Conversion en chaîne de caractères * Conversion en chaîne de caractères */ */ publicpublic functionfunction __tostring__tostring()() {{ returnreturn " "PixelInTile{PixelInTile{{{$$thisthis->->_tile_tile}}, , {{$$thisthis->->_pixel_pixel}}}}" ;" ; }}
191905:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe PixelInTilePixelInTile
/*/* * Constructeur * Constructeur * @param $tx abscisse de la dalle * @param $tx abscisse de la dalle * @param $ty ordonnée de la dalle * @param $ty ordonnée de la dalle * @param $px abscisse du pixel * @param $px abscisse du pixel * @param $py ordonnée du pixel * @param $py ordonnée du pixel */ */ publicpublic functionfunction __construct __construct(($$txtx==00, , $$tyty==00, , $$pxpx==00, , $$pypy==00)) {{ $$thisthis->->_tile _tile == newnew Tile Tile(($$txtx, , $$tyty)) ; ; $$thisthis->->_pixel _pixel == newnew Pixel Pixel(($$pxpx, , $$pypy)) ; ; }}
/*/* * Réaffecteur de la dalle * Réaffecteur de la dalle * @param $tile Nouvelle dalle * @param $tile Nouvelle dalle */ */ publicpublic functionfunction setTile setTile((Tile Tile $$tiletile)) {{ $$thisthis->->_tile _tile == $$tiletile ; ; }}
202005:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe PixelInTilePixelInTile
/*/* * Réaffecteur du pixel * Réaffecteur du pixel * @param $tile Nouveau pixel * @param $tile Nouveau pixel */ */ publicpublic functionfunction setPixel setPixel((Pixel Pixel $$pixelpixel)) {{ $$thisthis->->_pixel _pixel == $$pixelpixel ; ; }} /*/* * Accesseur à la dalle * Accesseur à la dalle * @return Tile * @return Tile */ */ publicpublic functionfunction getTile getTile()() {{ returnreturn $$thisthis->->_tile ;_tile ; }} /*/* * Accesseur au pixel * Accesseur au pixel * @return au Pixel * @return au Pixel */ */ publicpublic functionfunction getPixel getPixel()() {{ returnreturn $$thisthis->->_pixel ;_pixel ; }}
212105:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe PixelInTilePixelInTile
/*/* * Coordonnées GPS du pixel par Rapport à la dalle à un certain * Coordonnées GPS du pixel par Rapport à la dalle à un certain niveau de zoomniveau de zoom * @param $zoom Le niveau de zoom * @param $zoom Le niveau de zoom * @return LatLng * @return LatLng */ */ publicpublic functionfunction toLatLng toLatLng(($$zoomzoom)) {{ $$degree_per_pixeldegree_per_pixel == 360360.. // ((11 <<<< $$zoomzoom)) // Tile Tile::::getWidthgetWidth()() ; ; $$longitudelongitude == $$thisthis->->_pixel_pixel->->getXgetX()() ** $$degree_per_pixeldegree_per_pixel ++ $$thisthis->->_tile_tile->->getXgetX()() ** ((360360.. // ((11 <<<< $$zoomzoom)))) ; ; $$longitudelongitude -=-= 180180 ; ;
$$iyiy == $$thisthis->->_tile_tile->->getYgetY()() ++ ((floatfloat))$$thisthis->->_pixel_pixel->->getYgetY()() // Tile Tile::::getHeightgetHeight()() ; ; $$iyiy == pipi()() ** ((11 -- 22 ** $$iyiy // ((floatfloat)) ((11 <<<< $$zoomzoom)))) ; ; $$latitudelatitude == atanatan((expexp(($$iyiy)))) ** 360360.. // pipi()() -- 9090.. ; ;
returnreturn newnew LatLng LatLng(($$latitudelatitude, , $$longitudelongitude)) ; ; }}}}
222205:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe LatLngLatLng
/*/* * Coordonnées GPS * Coordonnées GPS */ */classclass LatLng LatLng {{ /*/* * @var int Latitude * @var int Latitude */ */ privateprivate $$_lat_lat ; ; /*/* * @var int Longitude * @var int Longitude */ */ privateprivate $$_lng_lng ; ; /*/* * Constructeur * Constructeur * @param $lat Latitude * @param $lat Latitude * @param $lng Longitude * @param $lng Longitude */ */ publicpublic functionfunction __construct__construct(($$latlat==00, , $$lnglng==00)) {{ $$thisthis->->setset(($$latlat, , $$lnglng)) ; ; }}
232305:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe LatLngLatLng
/*/* * Accesseur à la latitude * Accesseur à la latitude * @return int * @return int */ */ publicpublic functionfunction getLat getLat()() {{ returnreturn $$thisthis->->_lat ;_lat ; }} /*/* * Accesseur à la longitude * Accesseur à la longitude * @return int * @return int */ */ publicpublic functionfunction getLng getLng()() {{ returnreturn $$thisthis->->_lng ;_lng ; }} /*/* * Conversion en chaîne de caractères * Conversion en chaîne de caractères */ */ publicpublic functionfunction __tostring__tostring()() {{ returnreturn " "GPS[GPS[{{$$thisthis->->getLat()getLat()}}, , {{$$thisthis->->getLng()getLng()}}]]" ;" ; }}
242405:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe LatLngLatLng
/*/* * Réaffecteur * Réaffecteur * @param $lat latitude * @param $lat latitude * @param $lon longitude * @param $lon longitude * @return void * @return void */ */ publicpublic functionfunction set set(($$latlat, , $$lnglng)) {{ $$thisthis->->_lat _lat == ((floatfloat)) $$latlat ; ; $$thisthis->->_lng _lng == ((floatfloat)) $$lnglng ; ; }}
/*/* * Conversion en dalle * Conversion en dalle * @return Tile * @return Tile */ */ publicpublic functionfunction toTile toTile(($$zoomzoom)) {{ returnreturn newnew Tile Tile((floorfloor(($$thisthis->->xRealxReal(($$zoomzoom)))),, roundround(($$thisthis->->yRealyReal(($$zoomzoom)))))) ; ; }}
252505:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe LatLngLatLng
/*/* * Conversion en pixel dans une dalle * Conversion en pixel dans une dalle * @return PixelInTile * @return PixelInTile */ */ publicpublic functionfunction toPixelInTile toPixelInTile(($$zoomzoom)) {{ $$pitpit == newnew PixelInTile PixelInTile()() ; ;
$$tileXRealtileXReal == $$thisthis->->xRealxReal(($$zoomzoom)) ; ; $$tileXtileX == floorfloor(($$tileXRealtileXReal)) ; ; $$pixelXpixelX == floorfloor(((($$tileXRealtileXReal -- $$tileXtileX)) ** Tile Tile::::getWidthgetWidth())()) ; ;
$$tileYRealtileYReal == $$thisthis->->yRealyReal(($$zoomzoom)) ; ; $$tileYtileY == roundround(($$tileYRealtileYReal)) ; ; $$pixelYpixelY == floorfloor(((($$tileYRealtileYReal -- $$tileYtileY)) ** Tile Tile::::getHeightgetHeight())()) ; ;
$$pitpit->->getTilegetTile()()->->setset(($$tileXtileX, , $$tileYtileY)) ; ; $$pitpit->->getPixelgetPixel()()->->setset(($$pixelXpixelX, , $$pixelYpixelY)) ; ;
returnreturn $$pitpit ; ; }}
262605:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe LatLngLatLng
/*/* * Conversion en pixel dans une dalle de référence * Conversion en pixel dans une dalle de référence * @param $tile Dalle de référence * @param $tile Dalle de référence * @param $zoom niveau de zoom * @param $zoom niveau de zoom * @return Pixel * @return Pixel */ */ publicpublic functionfunction toPixelFromReferenceTile toPixelFromReferenceTile((Tile Tile $$tiletile, , $$zoomzoom)) {{ $$pitpit == $$thisthis->->toPixelInTiletoPixelInTile(($$zoomzoom)) ; ; returnreturn newnew Pixel Pixel((TileTile::::getWidthgetWidth()() ** (($$pitpit->->getTilegetTile()()->->getXgetX()() -- $$tiletile->->getXgetX())()) ++ $$pitpit->->getPixelgetPixel()()->->getXgetX()(),, Tile Tile::::getHeightgetHeight()() ** (($$pitpit->->getTilegetTile()()->->getYgetY()() -- $$tiletile->->getYgetY())()) ++ $$pitpit->->getPixelgetPixel()()->->getYgetY())()) ; ; }}
272705:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Classe Classe LatLngLatLng
/*/* * Calcul de l'abscisse réelle dans le système Mercator * Calcul de l'abscisse réelle dans le système Mercator * @return float * @return float */ */ privateprivate functionfunction xReal xReal(($$zoomzoom)) {{ returnreturn ((((floatfloat)) $$thisthis->->_lng _lng ++ 180180..)) // 360360.. ** ((11 <<<< $$zoomzoom)) ; ; }}
/*/* * Calcul de l'ordonnée réelle dans le système Mercator * Calcul de l'ordonnée réelle dans le système Mercator * @return float * @return float */ */ privateprivate functionfunction yReal yReal(($$zoomzoom)) {{ $$latitudelatitude == ((floatfloat)) $$thisthis->->_lat _lat // 180180.. ** pipi()() ; ; $$tyty == 0.50.5 -- loglog((((11.. ++ sinsin(($$latitudelatitude)))) // ((11.. -- sinsin(($$latitudelatitude)))))) // ((44.. ** pipi())()) ; ; returnreturn $$tyty ** ((11 <<<< $$zoomzoom)) ; ; }}}}
282805:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Conversions Mercator vers GPSConversions Mercator vers GPS
TrouverTrouver les les coordonnées GPS coordonnées GPS d’un point d’un point à partir à partir des des coordonnées d’un pixel dans une dalle coordonnées d’un pixel dans une dalle à un niveau de à un niveau de zoom donnézoom donné
// Construction du PixelInTile// Construction du PixelInTile$$pitpit == newnew PixelInTile PixelInTile(($$tile_xtile_x, , $$tile_ytile_y,, $$pixel_xpixel_x, , $$pixel_xpixel_x)) ; ;
// Conversion en coordonnées GPS// Conversion en coordonnées GPS$$latLnglatLng == $$pitpit->->toLatLngtoLatLng(($$zz)) ; ;
// Utilisation des coordonnées GPS// Utilisation des coordonnées GPS$$latitudelatitude == $$latLnglatLng->->getLat() ;getLat() ;$$longitudelongitude == $$latLnglatLng->->getLng() ;getLng() ;
292905:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Conversions GPS vers MercatorConversions GPS vers Mercator
TrouverTrouver les les coordonnées Mercator coordonnées Mercator d’un point à un d’un point à un niveau de zoom donné niveau de zoom donné à partir à partir des des coordonnées GPS coordonnées GPS
// Construction des coordonnées GPS// Construction des coordonnées GPS$$latLng latLng == newnew LatLng LatLng(($$latitudelatitude, , $$longitudelongitude)) ; ;// Conversion en PixelInTile// Conversion en PixelInTile$$pitpit == $$latLnglatLng->->toPixelInTiletoPixelInTile(($$zz)) ; ;
// Récupération de la dalle// Récupération de la dalle$$tiletile == $$pitpit->->getTilegetTile()() ; ;// Utilisation des coordonnées de la dalle// Utilisation des coordonnées de la dalle$$tile_xtile_x == $$tiletile->->getXgetX()() ; ; // tile_x compris entre 0 et 2^$z // tile_x compris entre 0 et 2^$z $$tile_ytile_y == $$tiletile->->getYgetY()() ; ; // tile_y compris entre 0 et 2^$z // tile_y compris entre 0 et 2^$z
// Récupération du pixel// Récupération du pixel$$pixelpixel == $$pitpit->->getPixelgetPixel()() ; ;// Utilisation des coordonnées du pixel// Utilisation des coordonnées du pixel$$pixel_xpixel_x == $$pixelpixel->->getXgetX()() ; ; // pixel_x compris entre 0 et 255 // pixel_x compris entre 0 et 255 $$pixel_ypixel_y == $$pixelpixel->->getYgetY()() ; ; // pixel_y compris entre 0 et 255 // pixel_y compris entre 0 et 255
303005:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Conversions GPS vers MercatorConversions GPS vers Mercator
TrouverTrouver les les coordonnées Mercator coordonnées Mercator d’un point d’un point (coordonnées d’un pixel par rapport à une dalle de (coordonnées d’un pixel par rapport à une dalle de référence) à un niveau de zoom donné référence) à un niveau de zoom donné à partir à partir des des coordonnées GPS coordonnées GPS
// Construction des coordonnées GPS// Construction des coordonnées GPS$$latLng latLng == newnew LatLng LatLng(($$latitudelatitude, , $$longitudelongitude)) ; ;
// Construction de la dalle de référence// Construction de la dalle de référence$$tiletile == newnew Tile Tile(($$tile_xtile_x, , $$tile_ytile_y)) ; ;
// Conversion en PixelInTile// Conversion en PixelInTile$$pixelpixel == $$latLnglatLng->->toPixelFromReferenceTiletoPixelFromReferenceTile(($$tiletile, , $$zz)) ; ;
// Utilisation des coordonnées du pixel// Utilisation des coordonnées du pixel$$xx == $$pixelpixel->->getXgetX()() ; ; // x peut être <0 ou >255// x peut être <0 ou >255$$yy == $$pixelpixel->->getYgetY()() ; ; // y peut être <0 ou >255// y peut être <0 ou >255
313105:06:3005:06:30 Programmation Web 2014-2015Programmation Web 2014-2015
Créer ses propres cartesCréer ses propres cartes
323205:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Remplacer les fonds de cartes de Google Remplacer les fonds de cartes de Google Maps ou ajouter des couchesMaps ou ajouter des couches
Créer ses propres fonds de cartes / couchesCréer ses propres fonds de cartes / couches A partir de coordonnées GPSA partir de coordonnées GPS A partir d’images (cartes anciennes, cartes A partir d’images (cartes anciennes, cartes
géologiques, cartes de densité, logo, …)géologiques, cartes de densité, logo, …) A partir de ce que l’on souhaite du moment A partir de ce que l’on souhaite du moment
où cela peut être dessiné dans une imageoù cela peut être dessiné dans une image Travail à réaliserTravail à réaliser
Fabriquer des images 256px × 256px (dalles)Fabriquer des images 256px × 256px (dalles)
Fabriquer des dallesFabriquer des dalles
333305:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Programmes sur le serveur Web SIGProgrammes sur le serveur Web SIG Capable de fournir des images (dalles)Capable de fournir des images (dalles)
Pré-calculéesPré-calculées Construites dynamiquementConstruites dynamiquement
Les images dépendent du :Les images dépendent du : numéro de la dalle (X, Y)numéro de la dalle (X, Y) niveau de grandissement Zniveau de grandissement Z
Relations entre (X,Y,Z) et (latitude, longitude)Relations entre (X,Y,Z) et (latitude, longitude) Interrogation d’une base de donnéesInterrogation d’une base de données
Exemples de dallesExemples de dalles
343405:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Superposition des couchesSuperposition des couches
Fond de carteFond de carteFond de carteFond de carte
Coordonnées dallesCoordonnées dallesCoordonnées dallesCoordonnées dalles
BâtimentsBâtimentsBâtimentsBâtiments
Position IUTPosition IUTPosition IUTPosition IUT
Direction IUTDirection IUTDirection IUTDirection IUT
Gestion de la transparenceGestion de la transparence
Principe de téléchargement d’une dallePrincipe de téléchargement d’une dalle
Lorsque l’API JavaScript demande une dalle, Lorsque l’API JavaScript demande une dalle, celle-ci dépend de la couche, du niveau de celle-ci dépend de la couche, du niveau de zoom et des coordonnées de la dallezoom et des coordonnées de la dalle
Les paramètres nécessaires au téléchargement Les paramètres nécessaires au téléchargement de la dalle sont donc :de la dalle sont donc : L’L’URLURL du générateurdu générateur Les coordonnées Les coordonnées XX et et YY de la dalle de la dalle Le niveau de zoom Le niveau de zoom ZZ
Ainsi, l’URL de la dalle téléchargée est Ainsi, l’URL de la dalle téléchargée est habituellement de la forme :habituellement de la forme :urlurl?x=?x=valeur_Xvaleur_X&y=&y=valeur_Yvaleur_Y&z=&z=zoomzoom
353505:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Intégration d’une couche (JavaScript)Intégration d’une couche (JavaScript)
// Création d'une couche// Création d'une couchevarvar couche = couche = {{ // Méthode donnant l'URL d'une dalle// Méthode donnant l'URL d'une dalle getTileUrl: getTileUrl: functionfunction((tileCoord tileCoord /* coordonnées *//* coordonnées */,, zoom zoom /* niveau de zoom *//* niveau de zoom */)) {{ returnreturn "tile.php?""tile.php?" + + "x=""x=" + tileCoord.x + tileCoord.x + + "&y=""&y=" + tileCoord.y + tileCoord.y + + "&z=""&z=" + zoom ; + zoom ; }},, // Taille de la dalle// Taille de la dalle tileSize: tileSize: newnew google.maps.Size google.maps.Size(256(256, , 256)256),, // Image PNG ?// Image PNG ? isPng: isPng: truetrue,,}}// Création d'un type carte// Création d'un type cartevarvar typeTile = typeTile = newnew google.maps.ImageMapType google.maps.ImageMapType((couchecouche)) ; ;// Ajout du type de carte// Ajout du type de cartemap.overlayMapTypes.insertAtmap.overlayMapTypes.insertAt(0(0, typeTile, typeTile)) ; ;
363605:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Calcul dynamique de dalles (PHP)Calcul dynamique de dalles (PHP)
<?php<?phprequire_oncerequire_once ' 'projection.class.phpprojection.class.php' ;' ;require_oncerequire_once ' 'gdimage.class.phpgdimage.class.php' ;' ;
// Constantes utiles// Constantes utilesdefinedefine((''posxposx', ', 1010)) ; ;definedefine((''posyposy', ', 1010)) ; ;definedefine((''fontfont', ', 44)) ; ;definedefine((''alphaalpha', ', 00)) ; ;
trytry {{ // Contrôle de présence des paramètres// Contrôle de présence des paramètres ifif ((!isset!isset(($$_GET_GET[[''xx'']], , $$_GET_GET[[''yy'']], , $$_GET_GET[[''zz'']))])) {{ throwthrow newnew ExceptionException((""Problème de paramètresProblème de paramètres"")) ; ; }}
$$xx == ((intint)) $$_GET_GET[[''xx'']] ; ; $$yy == ((intint)) $$_GET_GET[[''yy'']] ; ; $$zz == ((intint)) $$_GET_GET[[''zz'']] ; ;
373705:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Calcul dynamique de dalles (PHP)Calcul dynamique de dalles (PHP)
// Valeur maximale des coordonnées de dalle au zoom $z// Valeur maximale des coordonnées de dalle au zoom $z $$tilestiles == 11<<$<<$zz ; ; $$xx == (($$xx%$%$tilestiles+$+$tilestiles))%$%$tilestiles ; ; $$yy == (($$yy%$%$tilestiles+$+$tilestiles))%$%$tilestiles ; ;
// Création d'un image aux dimensions d'une dalle// Création d'un image aux dimensions d'une dalle $$imim == GDImage GDImage::::createFromSizecreateFromSize((TileTile::::getWidthgetWidth()(),, Tile Tile::::getHeightgetHeight())()) ; ;
// Gestion de la transparence// Gestion de la transparence $$imim->->saveAlphasaveAlpha((truetrue)) ; ; $$imim->->alphaBlendingalphaBlending((falsefalse)) ; ; $$couleur_textecouleur_texte == $$imim->->colorAllocatecolorAllocate((255255, , 255255, , 255255)) ; ; $$couleur_fondcouleur_fond == $$imim->->colorAllocateAlphacolorAllocateAlpha((00, , 00, , 00, , 127127)) ; ;
// Remplissage// Remplissage $$imim->->filledRectanglefilledRectangle((00, , 00, , $$imim->->sxsx()()-1-1, , $$imim->->sysy()()-1-1,, $$couleur_fondcouleur_fond)) ; ; $$imim->->rectanglerectangle((00, , 00, , $$imim->->sxsx()()-1-1, , $$imim->->sysy()()-1-1,, $$couleur_textecouleur_texte)) ; ;
383805:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Calcul dynamique de dalles (PHP)Calcul dynamique de dalles (PHP)
$$ii == 00 ; ;
// Coordonnées de la dalle// Coordonnées de la dalle $$textetexte == " "dalle (dalle ($$xx, , $$yy) @) @$$zz" ;" ; $$imim->->stringstring((font,font, posx, posy posx, posy ++ $$ii++++ ** GDImage GDImage::::fontHeightfontHeight((fontfont)),, $$textetexte, , $$couleur_textecouleur_texte)) ; ;
// Coordonnées GPS de la dalle// Coordonnées GPS de la dalle $$pitpit == newnew PixelInTile PixelInTile(($$xx, , $$yy, , 00, , 00)) ; ; $$latLnglatLng == $$pitpit->->toLatLngtoLatLng(($$zz)) ; ; $$textetexte == " "coord (coord ({{$$latLnglatLng->->getLat()getLat()}}, , {{$$latLnglatLng->->getLng()getLng()}}))" ;" ; $$imim->->stringstring((font,font, posx, posy posx, posy ++ $$ii++++ ** GDImage GDImage::::fontHeightfontHeight((fontfont)),, $$textetexte, , $$couleur_textecouleur_texte)) ; ;
/* Recalcul des coordonnées de dalle à partir des coordonnées /* Recalcul des coordonnées de dalle à partir des coordonnées GPS pour valider les transformations */GPS pour valider les transformations */ $$pit2pit2 == $$latLnglatLng->->toPixelInTiletoPixelInTile(($$zz)) ; ; $$tiletile == $$pit2pit2->->getTilegetTile()() ; ;
393905:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Calcul dynamique de dalles (PHP)Calcul dynamique de dalles (PHP)
$$textetexte == " "pixel (pixel ({{$$tiletile->->getX()getX()}}, , {{$$tiletile->->getY()getY()}}))" ;" ; $$imim->->stringstring((font,font, posx, posy posx, posy ++ $$ii++++ ** GDImage GDImage::::fontHeightfontHeight((fontfont)),, $$textetexte, , $$couleur_textecouleur_texte)) ; ;
// Envoi de l'image// Envoi de l'image headerheader((''Content-Type: image/pngContent-Type: image/png'')) ; ; $$imim->->pngpng()() ; ;}}catchcatch ((ExceptionException $$ee)) {{ echoecho $$ee->->getMessagegetMessage()() ; ;}}
404005:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Affichage dynamique d’informationsAffichage dynamique d’informations
L’API JavaScript permet d’obtenir, et donc L’API JavaScript permet d’obtenir, et donc d’afficher, des d’afficher, des informations utiles informations utiles comme :comme : Le Le niveau de zoom niveau de zoom actuelactuel Les Les coordonnées GPS coordonnées GPS sous le curseur de la sourissous le curseur de la souris Les Les coordonnées de la dalle coordonnées de la dalle sous le curseur de la sous le curseur de la
sourissouris
Ces informations peuvent être rafraîchies à Ces informations peuvent être rafraîchies à chaque mouvement de souris :chaque mouvement de souris :google.maps.google.maps.eventevent.addListener.addListener((map,map,"mousemove""mousemove", , functionfunction((eventevent)) {{… }… }
414105:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Affichage dynamique d’informationsAffichage dynamique d’informations
Déplacement de la souris :Déplacement de la souris :google.maps.google.maps.eventevent.addListener.addListener((map, map, "mousemove""mousemove",, functionfunction((eventevent)) {{ ???? == event event.latLng.lat.latLng.lat()().toFixed.toFixed(6)(6) ; ; ???? == event event.latLng.lng.latLng.lng()().toFixed.toFixed(6)(6) ; ; varvar worldCoordinate = worldCoordinate = map.getProjectionmap.getProjection()()
.fromLatLngToPoint .fromLatLngToPoint((eventevent.latLng.latLng));; varvar pixelCoordinate = pixelCoordinate = newnew google.maps.Point google.maps.Point(( worldCoordinate.x * Math.powworldCoordinate.x * Math.pow(2(2, map.getZoom, map.getZoom())()),, worldCoordinate.y * Math.powworldCoordinate.y * Math.pow(2(2, map.getZoom, map.getZoom()))()));;???? == Math.floorMath.floor((pixelCoordinate.x / pixelCoordinate.x / 256)256) ; ;???? == Math.floorMath.floor((pixelCoordinate.y / pixelCoordinate.y / 256)256) ; ;}})) ; ;
424205:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Affichage dynamique d’informationsAffichage dynamique d’informations
Changement de niveau de zoom :Changement de niveau de zoom :google.maps.google.maps.eventevent.addListener.addListener((map,map,
"zoom_changed""zoom_changed", , functionfunction()() {{
?? ?? = map.getZoom= map.getZoom()() ; ;
}})) ; ;
Autres événements déclenchés sur la carte :Autres événements déclenchés sur la carte :http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#Maphttp://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#Map
434305:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
DémonstrationDémonstration
444405:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Ajout de couches sur le fond de carteAjout de couches sur le fond de carte
DémonstrationDémonstration
454505:06:3105:06:31 Programmation Web 2014-2015Programmation Web 2014-2015
Ajout de couches sur le fond de carteAjout de couches sur le fond de carte
DémonstrationDémonstration
464605:06:3205:06:32 Programmation Web 2014-2015Programmation Web 2014-2015
Ajout de couches sur le fond de carteAjout de couches sur le fond de carte