Search code examples
openstreetmap

Displaying data on an Open street map on a website


I would like to display data from the Paris Open data (https://opendata.paris.fr/) on a dynamically generated Open Street map, on my website.

The dataset I am interested in is: https://opendata.paris.fr/explore/dataset/accidentologie0/analyze/?disjunctive.com_arm_code&disjunctive.victime_type&disjunctive.gravite&disjunctive.tranche_age_victime&disjunctive.iris&refine.com_arm_code=75114&refine.iris=Parc+de+Montsouris+1&refine.iris=Parc+de+Montsouris+2&refine.iris=Parc+de+Montsouris+3&refine.iris=Parc+de+Montsouris+4&refine.iris=Parc+de+Montsouris+5&refine.iris=Parc+de+Montsouris+6&refine.iris=Parc+de+Montsouris+7&refine.pim_bp=Paris+Intra+Muros&dataChart=eyJxdWVyaWVzIjpbeyJjb25maWciOnsiZGF0YXNldCI6ImFjY2lkZW50b2xvZ2llMCIsIm9wdGlvbnMiOnsiZGlzanVuY3RpdmUuY29tX2FybV9jb2RlIjp0cnVlLCJkaXNqdW5jdGl2ZS52aWN0aW1lX3R5cGUiOnRydWUsImRpc2p1bmN0aXZlLmdyYXZpdGUiOnRydWUsImRpc2p1bmN0aXZlLnRyYW5jaGVfYWdlX3ZpY3RpbWUiOnRydWUsImRpc2p1bmN0aXZlLmlyaXMiOnRydWUsInJlZmluZS5jb21fYXJtX2NvZGUiOiI3NTExNCIsInJlZmluZS5pcmlzIjpbIlBhcmMgZGUgTW9udHNvdXJpcyAxIiwiUGFyYyBkZSBNb250c291cmlzIDIiLCJQYXJjIGRlIE1vbnRzb3VyaXMgMyIsIlBhcmMgZGUgTW9udHNvdXJpcyA0IiwiUGFyYyBkZSBNb250c291cmlzIDUiLCJQYXJjIGRlIE1vbnRzb3VyaXMgNiIsIlBhcmMgZGUgTW9udHNvdXJpcyA3Il0sInJlZmluZS5waW1fYnAiOiJQYXJpcyBJbnRyYSBNdXJvcyIsImxvY2F0aW9uIjoiMTIsNDguODI2ODcsMi4zMzM5MSIsImJhc2VtYXAiOiJqYXdnLnN0cmVldHMifX0sImNoYXJ0cyI6W3siYWxpZ25Nb250aCI6dHJ1ZSwidHlwZSI6ImxpbmUiLCJmdW5jIjoiQ09VTlQiLCJ5QXhpcyI6ImNvbV9hcm1fY29kZSIsInNjaWVudGlmaWNEaXNwbGF5Ijp0cnVlLCJjb2xvciI6InJhbmdlLWN1c3RvbSJ9XSwieEF4aXMiOiJhbm5lZSIsIm1heHBvaW50cyI6IiIsInRpbWVzY2FsZSI6InllYXIiLCJzb3J0IjoiIiwic2VyaWVzQnJlYWtkb3duIjoidmljdGltZV90eXBlIiwic2VyaWVzQnJlYWtkb3duVGltZXNjYWxlIjoiIn1dLCJkaXNwbGF5TGVnZW5kIjp0cnVlLCJhbGlnbk1vbnRoIjp0cnVlLCJ0aW1lc2NhbGUiOiIifQ%3D%3D&location=12,48.82687,2.33391&basemap=jawg.streets

I would be interested in having several customisable fields (used in refine), such as:

  • pim_bp
  • com_arm_code
  • iris
  • etc.

The typical representation I would like to generate is dots based on the geolocalisation of the event (fields coordonnes or longitude and latitude) such as here: https://www.onisr.securite-routiere.gouv.fr/cartographie-des-accidents-metropole-dom-tom

Can you please help me?


Here were I am at 04.11.2023:

I am using this code to display markers:

<html><body>
  <div id="mapdiv"></div>
  <script src="http://www.openlayers.org/api/OpenLayers.js"></script>
  <script>
    map = new OpenLayers.Map("mapdiv");
    map.addLayer(new OpenLayers.Layer.OSM());

    var lonLat = new OpenLayers.LonLat(2.335867, 48.862943)
          .transform(
            new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
            map.getProjectionObject() // to Spherical Mercator Projection
          );
          
    var zoom=16;

    var markers = new OpenLayers.Layer.Markers( "Markers" );
    map.addLayer(markers);
    
    markers.addMarker(new OpenLayers.Marker(lonLat));
    
    map.setCenter (lonLat, zoom);
  </script>
</body></html>

How can I add as markers the ones retrieved from: https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/accidentologie0/records?limit=20 ?


Solution

  • I could solve my issue with the following code:

    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>OpenStreetMap</title>
        <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin=""/>
        <!-- CSS -->
        <style>
            body{
                margin:0
            }
            #maCarte{
                height: 100vh;
            }
            </style>
        </head>
        <body>
            <div id="maCarte"></div>
    
            <!-- Fichiers Javascript -->
            <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js" integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" crossorigin=""></script>
            <script>
                // On initialise la carte
                var carte = L.map('maCarte').setView([48.825487, 2.338575], 15);
                
                // On charge les "tuiles"
                L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {
                    // Il est toujours bien de laisser le lien vers la source des données
                    attribution: 'données © <a href="//osm.org/copyright">OpenStreetMap</a>/ODbL - rendu <a href="//openstreetmap.fr">OSM France</a>',
                    minZoom: 1,
                    maxZoom: 20
                }).addTo(carte);
                
                var mortIcon = L.icon({
                    iconUrl: 'mort_dot.png',
                    iconSize: [20, 20],
                    shadowSize: [20, 20],
                    shadowAnchor: [22, 94]
                });
                
                var legerIcon = L.icon({
                    iconUrl: 'leger_dot.png',
                    iconSize: [20, 20],
                    shadowSize: [20, 20],
                    shadowAnchor: [22, 94]
                });
                
                
                var graveIcon = L.icon({
                    iconUrl: 'grave_dot.png',
                    iconSize: [20, 20],
                    shadowSize: [20, 20],
                    shadowAnchor: [22, 94]
                });
    
                var inconnuIcon = L.icon({
                    iconUrl: 'inconnu_dot.png',
                    iconSize: [20, 20],
                    shadowSize: [20, 20],
                    shadowAnchor: [22, 94]
                });
                
                let xmlhttp = new XMLHttpRequest();
    
                xmlhttp.onreadystatechange = () => {
                    // La transaction est terminée ?
                    if(xmlhttp.readyState == 4){
                        // Si la transaction est un succès
                        if(xmlhttp.status == 200){
                            // On traite les données reçues
                            let donnees = JSON.parse(xmlhttp.responseText)
                            
                            // On boucle sur les données (ES8)
                            Object.entries(donnees.results).forEach(results => {
                                let marker
                                switch (results[1].gravite) {
                                case 'Blessé léger':
                                    marker = L.marker([results[1].latitude, results[1].longitude], {icon: legerIcon}).addTo(carte);
                                    break;
                                case 'Blessé hospitalisé':
                                    marker = L.marker([results[1].latitude, results[1].longitude], {icon: graveIcon}).addTo(carte);
                                    break;
                                case 'Tué':
                                    marker = L.marker([results[1].latitude, results[1].longitude], {icon: mortIcon}).addTo(carte);
                                    break;
                                default:
                                    marker = L.marker([results[1].latitude, results[1].longitude], {icon: inconnuIcon}).addTo(carte);
                                }
                                let categorie_victime
                                if (results[1].categorie == results[1].victime_type) {
                                    categorie_victime = results[1].categorie
                                } else {
                                    categorie_victime = results[1].categorie + " " + results[1].victime_type
                                }
                                marker.bindPopup("<b>" + results[1].annee + "</b> : " + categorie_victime + ", " + results[1].age + " ans (" + results[1].idusager + ")")
                            })
                        } else {
                            console.log(xmlhttp.statusText);
                        }
                    }
                }
                xmlhttp.open("GET", "https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/accidentologie0/records?refine=iris%3A%22Parc%20de%20Montsouris%201%22&refine=iris%3A%22Parc%20de%20Montsouris%202%22&refine=iris%3A%22Parc%20de%20Montsouris%203%22&refine=iris%3A%22Parc%20de%20Montsouris%204%22&refine=iris%3A%22Parc%20de%20Montsouris%205%22&refine=iris%3A%22Parc%20de%20Montsouris%206%22&refine=iris%3A%22Parc%20de%20Montsouris%207%22&refine=pim_bp%3A%22Paris%20Intra%20Muros%22&limit=100");
                // &refine=pim_bp%3A%22Paris%20Intra%20Muros%22 //
                xmlhttp.send(null);
            </script>
    

    Thank you to the example on: https://nouvelle-techno.fr/articles/openstreetmap-inserer-des-marqueurs-depuis-une-base-de-donnees