{"id":835,"date":"2019-06-24T14:14:29","date_gmt":"2019-06-24T12:14:29","guid":{"rendered":"https:\/\/geekcommunicant.com\/blog\/?p=835"},"modified":"2019-06-24T14:16:08","modified_gmt":"2019-06-24T12:16:08","slug":"carte-interactive-rues-sans-megots-leaflet","status":"publish","type":"post","link":"https:\/\/geekcommunicant.com\/blog\/2019\/06\/24\/carte-interactive-rues-sans-megots-leaflet\/","title":{"rendered":"Carte interactive des rues sans m\u00e9gots avec Leaflet"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p>Cette <a rel=\"noreferrer noopener\" aria-label=\"carte interactive des rues sans m\u00e9gots de Paris (opens in a new tab)\" href=\"https:\/\/geekcommunicant.com\/demos\/carte-interactive-rues-sans-megots-paris-leaflet.html\" target=\"_blank\">carte interactive des rues sans m\u00e9gots de Paris<\/a> a \u00e9t\u00e9 r\u00e9alis\u00e9e suite \u00e0 la suite de la consultation de la page d\u2019actualit\u00e9s de la ville de Paris concernant cette action de propret\u00e9, qui ne contenait qu\u2019une image pour pr\u00e9senter la cartographie des diff\u00e9rentes rues concern\u00e9es par cette op\u00e9ration.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Sources des donn\u00e9es<\/h1>\n\n\n\n<p>La liste des rues ou sections de rues proviennent de la <a href=\"https:\/\/www.paris.fr\/actualites\/rendez-vous-dans-des-rues-sans-megots-6746\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"page d\u2019actualit\u00e9s (opens in a new tab)\">page d\u2019actualit\u00e9s<\/a>.<\/p>\n\n\n\n<p>Le trac\u00e9 des rues provient de <a href=\"https:\/\/opendata.paris.fr\/explore\/dataset\/voie\/information\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Paris Data (opens in a new tab)\">Paris Data<\/a>, le site d\u2019open data de la Ville de Paris.<\/p>\n\n\n\n<p>Je suis parti des donn\u00e9es en CSV, pour en extraire plus facilement les rues participantes. Pour les rues concern\u00e9es seulement en partie j\u2019ai ensuite supprim\u00e9 manuellement les sections inutiles, en passant par <a href=\"http:\/\/geojson.io\/#map=2\/20.0\/0.0\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"geojson.io (opens in a new tab)\">geojson.io<\/a> pour m\u2019assurer que je ne supprimais pas des parties couvertes par l\u2019op\u00e9ration.<\/p>\n\n\n\n<p>Chaque <em>feature<\/em> de\nrue a au moins une propri\u00e9t\u00e9 \u00ab&nbsp;name&nbsp;\u00bb. Pour les rues ne participant\nque sur une section je rajoute une propri\u00e9t\u00e9 \u00ab&nbsp;between&nbsp;\u00bb pour\nindiquer cette section.<\/p>\n\n\n\n<p>Ces donn\u00e9es ont ensuite \u00e9t\u00e9 rassembl\u00e9es dans une <em>FeatureCollection<\/em> de <em>LineString<\/em>s dans un fichier GeoJSON.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h1 class=\"wp-block-heading\">Code de la carte<\/h1>\n\n\n\n<p>Pour cette carte, j\u2019ai utilis\u00e9 le fond de carte <a rel=\"noreferrer noopener\" aria-label=\"World Light Gray Base (opens in a new tab)\" href=\"https:\/\/server.arcgisonline.com\/arcgis\/rest\/services\/Canvas\/World_Light_Gray_Base\/MapServer\" target=\"_blank\">World Light Gray Base<\/a> disponible sur ArcGIS Online, via le plugin <a href=\"http:\/\/esri.github.io\/esri-leaflet\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Esri Leaflet (opens in a new tab)\">Esri Leaflet<\/a>.<\/p>\n\n\n\n<p>L\u2019initialisation de la carte se fait \u00e0 la m\u00eame position et au m\u00eame niveau de zoom que pr\u00e9c\u00e9demment.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nvar center = &#x5B;48.8502, 2.3488];\nvar zoom = 12;\n\nvar map = L.map(&#039;map&#039;,{\n\tcenter: center,\n\tzoom: zoom\n});\n\nL.esri.basemapLayer(&#039;Gray&#039;).addTo(map);\n<\/pre><\/div>\n\n\n<p>Cette carte contient \u00e9galement un encart.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nvar info = L.control();\n\ninfo.onAdd = function (map) {\n\tthis._div = L.DomUtil.create(&#039;div&#039;, &#039;info&#039;);\n\tthis.update();\n\treturn this._div;\n};\n\ninfo.update = function (props) {\n\tif(props) {\n\t  var infoTxt = &#039;&lt;p&gt;&#039; + props.name;\n\t    if(props.between) infoTxt += &#039;, &#039; + props.between; \/\/ si on est sur une section de rue\n\t    infoTxt += &#039;&lt;\/p&gt;&#039;;\n\t    this._div.innerHTML = infoTxt;\n\t} else {\n\t\tthis._div.innerHTML = &#039;&lt;p&gt;Survoler un \u00e9l\u00e9ment&lt;\/p&gt;&#039;;\n\t}\n};\n\ninfo.addTo(map);\n<\/pre><\/div>\n\n\n<p>Cette fois-ci, les donn\u00e9es seront charg\u00e9es directement depuis un fichier GeoJSON et non plus depuis un objet GeoJSON dans un fichier JavaScript. Ce chargement se fait en utilisant le plugin <a href=\"https:\/\/github.com\/calvinmetcalf\/leaflet-ajax\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Leaflet AJAX (opens in a new tab)\">Leaflet AJAX<\/a>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nvar rues = new L.GeoJSON.AJAX(&#039;\/assets\/files\/js\/rues_sans_megots.geojson&#039;,{\n\tonEachFeature: onEachStreet,\n\tstyle: function(feature) {\n\t\treturn {color: &#039;#f7364b&#039;};\n\t}\n}).addTo(map);\n<\/pre><\/div>\n\n\n<p>La fonction appel\u00e9e par \u00ab&nbsp;onEachFeature&nbsp;\u00bb attache \u00e0 nos trac\u00e9s 3 \u00e9v\u00e9nements&nbsp;: \u00ab&nbsp;mouseover&nbsp;\u00bb, \u00ab&nbsp;mouseout&nbsp;\u00bb et \u00ab&nbsp;click&nbsp;\u00bb.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nfunction onEachStreet(feature, layer) {\n\tlayer.on({\n\t\tmouseover: updateInfo,\n\t\tmouseout: resetInfo,\n\t\tclick: zoomToStreet\n\t});\n}\n<\/pre><\/div>\n\n\n<p>Les deux premiers \u00e9v\u00e9nements se comportent de la m\u00eame\nmani\u00e8re&nbsp;: ils permettent la mise \u00e0 jour de l\u2019encart et le surlignage de la\n<em>feature<\/em> survol\u00e9e.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nfunction updateInfo(e) {\n\tvar layer = e.target;\n\tlayer.setStyle({weight: 5});\n\tinfo.update(layer.feature.properties);\n}\n\nfunction resetInfo(e) {\n\trues.resetStyle(e.target);\n\tinfo.update();\n}\n<\/pre><\/div>\n\n\n<p>Le dernier \u00e9v\u00e9nement permet de zoomer sur la rue cliqu\u00e9e.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nfunction zoomToStreet(e) {\n\tmap.fitBounds(e.target.getBounds());\n}\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Et voil\u00e0&nbsp;! Notre carte est pr\u00eate.<\/p>\n\n\n\n<p>Le plus long dans cette histoire a \u00e9t\u00e9 d\u2019isoler les trac\u00e9s\ndes rues et sections de rues participant \u00e0 l\u2019op\u00e9ration.<\/p>\n\n\n\n<p>Alors Paris.fr, pourquoi n\u2019avoir pas pris le temps de le\nfaire&nbsp;?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cette carte interactive des rues sans m\u00e9gots de Paris a \u00e9t\u00e9 r\u00e9alis\u00e9e suite \u00e0 la suite de la consultation de la page d\u2019actualit\u00e9s de la ville de Paris concernant cette action de propret\u00e9, qui ne contenait qu\u2019une image pour pr\u00e9senter &hellip; <a href=\"https:\/\/geekcommunicant.com\/blog\/2019\/06\/24\/carte-interactive-rues-sans-megots-leaflet\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[19],"tags":[14,45],"class_list":["post-835","post","type-post","status-publish","format-standard","hentry","category-javascript","tag-carte-interactive","tag-leaflet"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2IoOb-dt","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":848,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/01\/carte-interactive-rues-sans-megots-openlayers\/","url_meta":{"origin":835,"position":0},"title":"Carte interactive des rues sans m\u00e9gots avec OpenLayers","author":"geekc","date":"01\/07\/2019","format":false,"excerpt":"Bon, je suppose que vous commencez \u00e0 avoir l\u2019habitude que je vous pr\u00e9sente la mani\u00e8re de cr\u00e9er une carte interactive \u00e0 l\u2019aide des deux librairies majeures OpenLayers et Leaflet. Apr\u00e8s avoir rapidement cr\u00e9\u00e9 la carte des rues et sections de rue concern\u00e9es par l\u2019op\u00e9ration \u00ab\u00a0Des rues sans m\u00e9gots\u00a0\u00bb avec Leaflet,\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":856,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/08\/carte-controle-calques-leaflet\/","url_meta":{"origin":835,"position":1},"title":"Carte avec contr\u00f4le de calques avec Leaflet","author":"geekc","date":"08\/07\/2019","format":false,"excerpt":"Cette semaine encore, nous allons encore voir la cr\u00e9ation d\u2019une carte interactive avec la librairie Leaflet. La carte pr\u00e9sent\u00e9e aujourd\u2019hui utilise les groupes de calques, ainsi que le contr\u00f4le de calques, afin de r\u00e9aliser une carte historique de la ligne 2 du tramway d\u2019\u00cele-de-France. Bref historique Afin d\u2019expliquer le d\u00e9coupage\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":808,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/06\/11\/carte-interactive-metro-paris-leaflet\/","url_meta":{"origin":835,"position":2},"title":"Carte interactive du m\u00e9tro de Paris avec Leaflet","author":"geekc","date":"11\/06\/2019","format":false,"excerpt":"Si on vous parle de solution pour int\u00e9grer une carte sur votre site, la premi\u00e8re qui vous vient \u00e0 l\u2019esprit est surement Google Maps. Mais il existe plusieurs solutions open-source et gratuites. Je vous ai d\u00e9j\u00e0 parl\u00e9 d\u2019OpenLayers, avec laquelle j\u2019ai d\u00e9j\u00e0 refait une carte r\u00e9alis\u00e9e pr\u00e9c\u00e9demment avec jQuery. Mais\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":832,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/06\/17\/carte-interactive-metro-paris-openlayers\/","url_meta":{"origin":835,"position":3},"title":"Carte interactive du m\u00e9tro de Paris avec OpenLayers","author":"geekc","date":"17\/06\/2019","format":false,"excerpt":"Apr\u00e8s vous avoir cr\u00e9\u00e9 une carte interactive du m\u00e9tro de Paris avec la librairie Leaflet (voir mon pr\u00e9c\u00e9dent article), j\u2019ai d\u00e9cid\u00e9 de recr\u00e9er cette carte avec l\u2019autre libraire majeure de cartographie en ligne\u00a0: OpenLayers (que j\u2019ai d\u00e9j\u00e0 utilis\u00e9e pour ma carte utilisant un fond statique). Donn\u00e9es utilis\u00e9es Les donn\u00e9es utilis\u00e9es\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1271,"url":"https:\/\/geekcommunicant.com\/blog\/2024\/11\/11\/marqueur-personnalise-leaflet\/","url_meta":{"origin":835,"position":4},"title":"Un marqueur personnalis\u00e9 avec Leaflet","author":"geekc","date":"11\/11\/2024","format":false,"excerpt":"Lors de mon tutoriel sur la carte du m\u00e9tro de Paris avec Leaflet, j\u2019ai d\u00e9j\u00e0 personnalis\u00e9 les marqueurs de cette carte, mais comme dans le cadre du tutoriel c\u2019\u00e9tait assez secondaire, je n\u2019ai pas d\u00e9taill\u00e9 ce point. Aujourd\u2019hui est venu le temps de revenir sur la mani\u00e8re d\u2019utiliser nos propres\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":860,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/15\/carte-interactive-openlayers-controle-calques\/","url_meta":{"origin":835,"position":5},"title":"Carte interactive OpenLayers avec contr\u00f4le de calques","author":"geekc","date":"15\/07\/2019","format":false,"excerpt":"Apr\u00e8s avoir r\u00e9alis\u00e9 une carte historique de la ligne 2 du tramway d\u2019\u00cele-de-France avec Leaflet (voir le tutoriel), je me suis attaqu\u00e9 \u00e0 la cr\u00e9ation de cette m\u00eame carte avec OpenLayers. Bien que plus complet sur certains points, OpenLayers n\u2019inclus pas nativement deux fonctionnalit\u00e9s utilis\u00e9es dans la carte\u00a0: Le contr\u00f4le\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/comments?post=835"}],"version-history":[{"count":0,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/835\/revisions"}],"wp:attachment":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/media?parent=835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/categories?post=835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/tags?post=835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}