Skip to Content

moteur.js

  1. //Variables globales
  2. var mapPanel, store, gridPanel, mainPanel, exitPanel;
  3. var map, vecLayer;
  4. var buildStyle;
  5. var popup;
  6. var selectControl;
  7. var selectedFeature;
  8. var bPrecedent;
  9. var zPrecedent;
  10. var goBoucle;
  11. var aec = "2007"; //Année en cours
  12. var valeurs = new Array();
  13. var tBoucle = 0;
  14.  
  15. function chargeDonnees(variable) {
  16. //Modification de la variable représentée, par changement du style de la couche des symboles.
  17. aec = variable;
  18. var style = vecLayer.styleMap.styles["default"].defaultStyle;
  19. if (aec != 'na') {
  20. document.getElementById('annee').innerHTML = aec;
  21. style.pointRadius = "${t"+aec+"}";
  22. } else {
  23. style.pointRadius = 4;
  24. }
  25. if (popup) {
  26. popup.feature = null;
  27. map.removePopup(popup);
  28. }
  29. vecLayer.redraw(true);
  30. };
  31.  
  32. var zoomHandler = function(button, event) {
  33. //Zoom pour afficher tous les symboles à l'écran.
  34. evl = new OpenLayers.Bounds();
  35. evl = vecLayer.getDataExtent();
  36. if (evl != null) {
  37. map.zoomToExtent(evl);
  38. }
  39. }
  40.  
  41. function apresCharge() {
  42. //Après chargement des données, zoom et information.
  43. Ext.MessageBox.hide();
  44. zoomHandler();
  45. document.getElementById('annee').innerHTML = aec;
  46. }
  47.  
  48. function getFeatureByValue(ar, na, vr) {
  49. //Recherche dans le tableau des valeurs du département selon son code, pour affichage sur la carte.
  50. var f = ar.features;
  51. for (var i=0; i<f.length; i++) {
  52. var feature = f[i];
  53. if(feature.attributes[na] == vr) {
  54. return feature;
  55. }
  56. }
  57. }
  58.  
  59. Ext.onReady(function() {
  60. //Au chargement de la page, on prépare tous les éléments.
  61. var navt;
  62.  
  63. //Carte OpenLayers, en Lambert 2 carto et avec les contrôles de navigation classiques.
  64. map = new OpenLayers.Map('map', {
  65. projection: new OpenLayers.Projection("EPSG:27572"),
  66. units: "m",
  67. maxResolution: "auto",
  68. maxExtent: new OpenLayers.Bounds(5000,1620000,1198000,2678000),
  69. controls: [
  70. new OpenLayers.Control.PanZoom()
  71. ],
  72. //On écoute le changement de zoom
  73. eventListeners: {"zoomend": modifEchelle}
  74. });
  75.  
  76. //Couche WMS des départements GeoFla IGN, diffusée par GéoSignal, avec un style TinyOWS.
  77. var base = new OpenLayers.Layer.WMS("OpenLayers WMS",
  78. "http://www.geosignal.org/cgi-bin/wmsmap?",
  79. {layers: "Regions,Departements",
  80. projection:"EPSG:27572",
  81. units: "m",
  82. maxResolution: "auto",
  83. maxExtent: new OpenLayers.Bounds(5000,1620000,1198000,2678000),
  84. sld: "http://www.tinyows.org/tracdocs/demo/OpenLayers-2.9/examples/sld.xml"
  85. }
  86. );
  87. map.addLayer(base);
  88.  
  89.  
  90. //Couche vectorielle qui va contenir les symboles.
  91. vecLayer = new OpenLayers.Layer.Vector("vector", {
  92. styleMap: buildStyle("2007"),
  93. projection: new OpenLayers.Projection("EPSG:27572")
  94. });
  95.  
  96. map.addLayer(vecLayer);
  97.  
  98. //Contrôle SelectFeature : liaison avec les fonctions d'écoute
  99. var options = {
  100. hover: true,
  101. onSelect: onFeatureSelect,
  102. onUnselect: onFeatureUnselect
  103. };
  104.  
  105. selectControl = new OpenLayers.Control.SelectFeature(vecLayer, options);
  106. map.addControl(selectControl);
  107. selectControl.activate();
  108.  
  109. map.addControl(new OpenLayers.Control.LayerSwitcher());
  110.  
  111. //On initialise la valeur du zoom, pour calculer la différence en cas de changement de niveau de zoom.
  112. zPrecedent = map.zoom;
  113.  
  114. //Dimensionnement du panneau carte.
  115. mapPanel = new GeoExt.MapPanel({
  116. title: "Carte",
  117. region: "center",
  118. height: 600,
  119. width: 700,
  120. map: map,
  121. zoom: 1
  122. });
  123.  
  124. //Le FeatureStore, lié au panneau Grid, et qui va chercher ses données en ajax après du script PHP getData.php.
  125. store = new GeoExt.data.FeatureStore({
  126. layer: vecLayer,
  127. fields: [
  128. {name: 'codgeo', type: 'string'},
  129. {name: 'nom', type: 'string'},
  130. {name: 'pop07', type: 'integer'},
  131. {name: 'pop99', type: 'integer'},
  132. {name: 'pop90', type: 'integer'},
  133. {name: 'pop82', type: 'integer'}
  134. ],
  135. proxy: new GeoExt.data.ProtocolProxy({
  136. protocol: new OpenLayers.Protocol.HTTP({
  137. url: "getData.php",
  138. format: new OpenLayers.Format.GeoJSON({
  139. 'internalProjection': new OpenLayers.Projection("EPSG:27572"),
  140. 'externalProjection': new OpenLayers.Projection("EPSG:27572")
  141. })
  142. })
  143. }),
  144. autoLoad: true
  145. });
  146. store.on('load', apresCharge, store);
  147.  
  148. //Le panneau grid, un tableau interactif des valeurs attributaires, alimenté par le FeatureStore.
  149. gridPanel = new Ext.grid.EditorGridPanel({
  150. title: "D&eacute;partements",
  151. region: "east",
  152. store: store,
  153. width: 400,
  154. clicksToEdit: 1,
  155. columns: [{
  156. header: "Code",
  157. sortable: true,
  158. width: 40,
  159. dataIndex: "codgeo"
  160. }, {
  161. header: "Nom",
  162. sortable: true,
  163. width: 120,
  164. dataIndex: "nom"
  165. }, {
  166. header: "2007",
  167. sortable: true,
  168. width: 40,
  169. dataIndex: "pop07"
  170. }, {
  171. header: "1999",
  172. sortable: true,
  173. width: 40,
  174. dataIndex: "pop99"
  175. }, {
  176. header: "1990",
  177. sortable: true,
  178. width: 40,
  179. dataIndex: "pop90"
  180. }, {
  181. header: "1982",
  182. sortable: true,
  183. width: 40,
  184. dataIndex: "pop82"
  185. }
  186. ],
  187. sm: new GeoExt.grid.FeatureSelectionModel(),
  188. listeners: {
  189. //Réaction au clic sur une ligne : sélection d'un symbole sur la carte et recentrage sur celui-ci.
  190. cellmousedown: function(panel, rowIndex, cellIndex, e) {
  191. var idDept = store.data.items[rowIndex].data.codgeo;
  192. var fs = getFeatureByValue(vecLayer, 'codgeo', idDept);
  193. var fspos = fs.geometry.getCentroid();
  194. var rpan = new OpenLayers.LonLat(fspos.x, fspos.y);
  195. map.panTo(rpan);
  196. }
  197. }
  198.  
  199. });
  200.  
  201. //Panneau principal, contenant la carte et le tableau
  202. mainPanel = new Ext.Panel({
  203. renderTo: "mainpanel",
  204. layout: "border",
  205. height: 420,
  206. width: 880,
  207. items: [mapPanel, gridPanel]
  208. });
  209.  
  210. //Réaction au clic/survol sur un symbole
  211. function onFeatureSelect(feature) {
  212. if (popup) {
  213. popup.feature = null;
  214. map.removePopup(popup);
  215. }
  216. var popupCloseBox = true;
  217. selectedFeature = feature;
  218. var locationAnnee = aec;
  219. //Remplissage de l'info-bulle avec les données attributaires adaptées.
  220. var locationValue = feature.attributes['pop' + aec.substring(2,4)];
  221. popup = new OpenLayers.Popup.FramedCloud(feature.attributes.codgeo, feature.geometry.getBounds().getCenterLonLat(), null, "<div style='font-size:.8em; font-weight: bold'>" + feature.attributes.nom + " - " + locationAnnee + "<br />Population : " + locationValue + "</div>", null, popupCloseBox, onPopupClose);
  222. feature.popup = popup;
  223. popup.feature = feature;
  224. map.addPopup(popup);
  225. }
  226.  
  227. function onPopupClose(evt) {
  228. selectControl.unselect(selectedFeature);
  229. popup.feature = null;
  230. map.removePopup(popup);
  231. }
  232.  
  233. function onFeatureUnselect(feature) {
  234. if (feature.popup) {
  235. popup.feature = null;
  236. map.removePopup(feature.popup);
  237. feature.popup.destroy();
  238. feature.popup = null;
  239. }
  240. }
  241.  
  242. //Boucle d'affichage animé des années successives de population.
  243. laBoucle = function() {
  244. var annees = new Array ("1982", "1990", "1999", "2007");
  245. var posa = annees.indexOf(aec);
  246. if (posa < 3) {
  247. goAnnee(annees[posa + 1]);
  248. } else {
  249. goAnnee('1982');
  250. }
  251. }
  252.  
  253. goBoucle = function() {
  254. var bBoucle = document.getElementById('bBoucle');
  255. if (tBoucle == 0) {
  256. bBoucle.style.fontWeight = "bold";
  257. tBoucle = setInterval("laBoucle()", 2000); //Deux secondes entre chaque années affichée.
  258. } else {
  259. clearInterval(tBoucle);
  260. bBoucle.style.fontWeight = "normal";
  261. tBoucle = 0;
  262. }
  263. }
  264.  
  265. //Gestion de l'interface (sélection du bouton de l'année en cours) et mise à jour des symboles sur la carte.
  266. goAnnee = function (ap){
  267. if ((ap != 'na') && (ap != 'tp') && (ap != 'tm') && (ap != 'boucle')) {
  268. aec = ap;
  269. if (bPrecedent) {
  270. bPrecedent.style.color = "black";
  271. bPrecedent.style.fontWeight = "normal";
  272. }
  273. var bouton = document.getElementById("b" + aec);
  274. bPrecedent = bouton;
  275. bouton.style.color = "blue";
  276. bPrecedent.style.fontWeight = "bold";
  277. }
  278. if (popup) {
  279. popup.feature = null;
  280. map.removePopup(popup);
  281. }
  282. chargeDonnees(ap);
  283. }
  284.  
  285. //Modification de la taille des symboles après clic sur les boutons de l'interface html.
  286. modifTaille = function (tm){
  287. var cm = 0;
  288. if (tm == 'tp') {
  289. cm = 1.4;
  290. } else {
  291. cm = 0.7;
  292. }
  293. for (i = 0; i < vecLayer.features.length; i++) {
  294. vecLayer.features[i].attributes['t1982'] *= cm;
  295. vecLayer.features[i].attributes['t1990'] *= cm;
  296. vecLayer.features[i].attributes['t1999'] *= cm;
  297. vecLayer.features[i].attributes['t2007'] *= cm;
  298. }
  299. if (popup) {
  300. popup.feature = null;
  301. map.removePopup(popup);
  302. }
  303. vecLayer.redraw();
  304. }
  305.  
  306. //Modification de la taille des symboles en fonction du coef. basé sur le niveau de zoom.
  307. function modifEchelle (event){
  308. if (typeof(zPrecedent) != 'undefined') {
  309. var vz = map.zoom - zPrecedent;
  310. var coef = 1;
  311. if (vz < 0) {
  312. coef = 0.5;
  313. } else {
  314. coef = 2;
  315. }
  316. zPrecedent = map.zoom;
  317. //var va = 't'+aec.substring(2,4);
  318. if (aec != 'na') {
  319. for (i = 0; i < vecLayer.features.length; i++) {
  320. vecLayer.features[i].attributes['t2007'] *= coef;
  321. vecLayer.features[i].attributes['t1999'] *= coef;
  322. vecLayer.features[i].attributes['t1990'] *= coef;
  323. vecLayer.features[i].attributes['t1982'] *= coef;
  324. }
  325. }
  326. vecLayer.redraw();
  327. }
  328. }
  329.  
  330. //Création du style par défaut d'affichage des symboles, et de la taille par défaut.
  331. function buildStyle (ap){
  332. var pubs = 0;
  333. if (ap == 'na') {
  334. popu = 4;
  335. } else {
  336. popu = '${t'+ap+'}';
  337. }
  338. var theme = new OpenLayers.Style({
  339. 'pointRadius': popu
  340. });
  341.  
  342. var orange = new OpenLayers.Rule({
  343. symbolizer: {"Point": {'fillColor': '#ff4400', 'fillOpacity': 0.8, 'strokeWidth': 1, 'strokeColor': '#DDAA00'}}
  344. });
  345. theme.addRules([orange]);
  346.  
  347. var stylemap = new OpenLayers.StyleMap({'default':theme, 'select': {'strokeColor': '#0000ff', 'fillColor': '#0000ff', 'strokeWidth': 2}});
  348. return stylemap;
  349. }
  350.  
  351. });