Rechercher dans le blog

Imaginer une carte de la population en 2125

C'est le mois du #30DayMapChallenge, et comme l'an dernier, nous formons une équipe avec mes collègues pour relever le défi ! Et comme l'an dernier, je me rajoute la contrainte supplémentaire de non seulement de créer une carte, mais aussi de le faire en utilisant les technologies de dév d'ArcGIS et de vous proposer un tutoriel sur ce blog.   
 
Cette année je ne fais qu'une carte, celle du jour 12 sur le thème "Map from 2125" ("Carte de 2125"). Pas facile d'imaginer ce à quoi va ressembler la Terre dans 100 ans... Et si on n'était plus seuls sur Terre ? Évidemment, lorsque l'on parle de l'avenir, on ne peut pas s'empêcher d'imaginer que l'IA va prendre une place de plus en plus importante dans nos vies. Et si demain, l'IA se développait toute seule, créait ses propres communautés, et était considérée comme une espèce à part entière ? Et si des hybrides humains / IA émergeaient ? C'est ce scénario qui m'a poussée à imaginer une carte de la population terrestre en 2125, où nous aurions maintenant à classer les habitants selon leur espèce : humain, IA, ou hybride.Vous pouvez explorer l'application en live ici
En zoomant sur des clusters, on peut imaginer ce que l'on veut : Ouest de Paris habité par les humains, Est contrôlé par les IA.  S'entendent-ils bien ou s'agit-il d'une ségrégation imposée dans la violence ? Vous pouvez interpréter la carte comme vous voulez !
Une carte de 2125, ça appelle aussi à une esthétique particulière. J'ai pu me lâcher sur les néons et des effets divers pour mon plus grand plaisir, tout en essayant de ne pas tomber dans une esthétique trop cliché et en gardant un côté très onirique. Je trouve qu'on pourrait presque se croire dans un tableau de Van Gogh, par le choix des couleurs et surtout grâce à l'effet de flux dont on va reparler.
Enfin, qui dit monde à moitié peuplé par des IA, dit que ma carte doit aussi s'adresser à elles. Avez-vous essayé de voir ce qui se passe quand vous cliquez sur le bouton  en bas à gauche? 
L'application est traduite en binaire ! Bon, pas sûre que ça soit utile vu que ce sont des IA qui m'ont aidé en premier lieu à passer du français au binaire, mais au moins comme ça elles se sentent incluses et on évite peut-être une potentielle guerre, enfin je sais pas...
 
Dans cet article, je vous propose de tout découvrir sur la fabrication de cette carte : de la préparation des données au développement de l'application en passant par le choix de la symbologie. Rassurez-vous si vous n'avez pas l'âme d'un développeur, beaucoup de choses sont accessibles sans code ! Et si c'est seulement le code qui vous intéresse, n'hésitez pas à utiliser la carte déjà paramétrée.

Préparation des données

Bon, vous vous doutez que je n'ai pas pu trouver la donnée telle quelle se baladant sur internet. Pour partir de données existantes, j'ai récupéré le Kontur Population Dataset de 2023 (que nous avions déjà utilisé dans cette application), agrégeant les données de population mondiale dans des hexagones H3 de 22km (d'autres résolutions sont disponibles mais celle-ci sera suffisante pour notre application).
Maintenant, il faut transformer cette donnée en points. Pour passer des hexagones de population à des entités ponctuelles plus faciles à manipuler, nous allons avoir besoin d'un petit script Python, utilisant notamment ArcPy. Si vous ne voulez pas avoir à utiliser ce script vous-même, vous pouvez accéder directement à la donnée transformée que j'ai partagée publiquement.
 
Le script, que vous pouvez retrouver intégralement sur mon Github, parcourt chaque hexagone du Kontur Population Dataset et, selon le nombre d’habitants, génère un ou plusieurs points placés aléatoirement à l’intérieur de celui-ci. Chaque point est possède une pondération qui nous permettra de faire varier la taille de celui-ci en fonction du nombre d'habitants qu'il représente : de 250 à 500k habitants, la pondération est de 1 ; de 500k à 1M, la pondération est de 2, et pour plus d'1M, la pondération est de 3. Un hexagone contenant 750k habitants engendrera donc la création de 2 points : un avec une pondération de 2 pour 500k habitants et un avec une pondération de 1 pour 250k habitants.
 
Une fois tous les points créés, une seconde partie du script attribue à chacun une “espèce” : Humain, IA ou Hybride. La répartition suit des proportions globales (50 % d’humains, 30 % d’IA, 20 % d’hybrides) que j'ai choisies arbitrairement (et que vous pouvez facilement modifier dans le script), mais avec des regroupements géographiques pour éviter un mélange totalement aléatoire. Certaines zones seront donc plutôt dominées par les IA, d’autres plus par les humains, tout en gardant un peu de diversité locale, pour refléter les regroupements communautaires qui s'observent assez naturellement dans la répartition des populations.
La donnée est ensuite prête à être publiée sur le portail, et nous nous retrouvons dans le MapViewer pour la suite.  

Modification de la symbologie

Fond de carte

Nous allons commencer par modifier le fond de carte, ce qui nous permettra de mieux faire ressortir nos points. Vu qu'aucun des fonds de carte proposés par défaut ne me convenait totalement, j'ai utilisé le Vector Tile Style Editor pour créer une version plus sombre et sans étiquette du fond de carte Nova. 
Vous pouvez le créer vous-même dans le style que vous voulez, ou vous servir de celui que j'ai partagé
 

Symbologie des points

Pour la symbologie des points, nous allons nous baser sur deux attributs et faire varier à la fois la couleur et la taille. Ajoutez donc "espece" et "pondération" dans le choix dans attributs du style de la couche et sélectionnez "Types et tailles" pour le style.
Pour les types, choisissez la palette de couleur de votre choix pour représenter chacune des espèces, voici ce que j'ai fait de mon côté : 
Pour les totaux et quantités, choisissez la plage des tailles qui vous convient. J'ai essayé de garder des points relativement petits de mon côté pour essayer de ne pas surcharger la carte. 
C'est l'heure des effets🪄 J'ai été suspicieusement sage sur ces derniers, car les points étant très nombreux, trop d'effets rendaient un peu trop vite la carte quelque peu... aveuglante. Nous nous contenterons donc d'un effet "Luminosité et contraste" pour apporter un peu de brillance à nos points.
Voilà le résultat pour la couche de points : 

Flux marin (optionnel)

Pour rendre la carte un peu plus chouette, nous allons rajouter une donnée de flux marin. Nous n'en avons pas vraiment besoin pour l'histoire de la carte, mais elle apporte une esthétique forte et permet aussi de créer un peu la dimension futuriste dont j'avais besoin.  
Nous allons utiliser comme source de donnée la couche HYCOM - Ocean Current Vectors. Ce service de d'imagerie de type Vector-MagDir, issu des données de courants marins de l'HYCOM,  va nous permette d'utiliser une symbologie de type flux pour habiller les océans. 
 
[Note] Cette couche nécessite un compte d'organisation ArcGIS Online pour y accéder, donc passez cette étape si vous êtes sur ArcGIS Enterprise. De la même manière, je vous invité à la tester dans le Map Viewer pour extraire de beaux visuels, mais l'utiliser dans votre application entraînera l'ajout d'une fenêtre d'authentification pour que vos utilisateurs puissent s'y connecter, donc je ne vous conseille pas de la garder pour la partie "Intégration".
 
Une fois la couche ajoutée à votre carte, choisissez le style "Flux" pour la symbologie de la couche pour voir apparaître le flux. 
Stylé, mais on va rendre ça un peu plus discret pour ne pas voler la vedette à nos points.
Dans les options de style, poussez la vitesse, la densité et la longueur au max histoire d'être un peu dynamique.  
Ensuite, choisissez "dégradé de couleur". Vous pouvez choisir plusieurs teintes pour tester, mais voici les paramètres que j'ai choisis pour que le flux reste relativement discret :  
En termes d'effets, le Néon est activé par défaut, rien à modifier de ce côté là ! Et voilà, la carte est prête :
On passe à l'intégration ? 

Développement d'une petite application 

Si vous avez lu cette série d'articles, vous savez que grâce à toute cette préparation dans le Map Viewer, intégrer cette carte va être très simple et rapide en utilisant le SDK JavaScript d'ArcGIS. Nous intégrerons ensuite des comportements personnalisés, notamment pour la traduction de l'application en langage binaire pour nos amies les IA. 
 
Comme à chaque fois, retrouvez le code complet sur mon Github ou en mode bac à sable dans CodePen.  
J'intègre la carte comme d'habitude grâce au composant <arcgis-map> et à l'itemid de la webmap : 
 <arcgis-map item-id="d865e8a38ca446798f2a1da1dc9aba5f">
Je rajoute également la légende et un bouton d'informations, ainsi qu'un bouton switch du Calcite Design System qui nous permettra de passer en "mode IA" : 
<arcgis-map item-id="d865e8a38ca446798f2a1da1dc9aba5f" theme="dark">
  <arcgis-expand slot="bottom-right" expand-tooltip="+ d'infos" collapse-tooltip="Fermer" expand-icon="information">
    <div class="expand-content" style="padding:1em; max-width:250px;">
      <h4 style="font-weight: bold; padding-top : 0%; margin-top: 0%">À propos de l'application</h4>
      <p>En 2125, le monde est partagé entre des populations humaines, IA et hybrides. La répartition de ces populations est représentée sur cette carte.</p>
      <p>Les données ont été extrapolées à partir du <a href="https://data.humdata.org/dataset/kontur-population-dataset-22km" target="_blank">Kontur Population Dataset de 2023</a>.</p>
      <p>Retrouvez toutes les étapes de création de l'application dans <a href="https://www.codethemap.fr/2025/11/carte-population-2125.html" target="_blank">cet article CodeTheMap</a>, et toutes mes autres apps sur Github <b>@<a href="https://github.com/JapaLenos" target="_blank">JapaLenos</a></b>.</p>
      <p>Cette carte a été créée à l'occasion du <b><a href="https://30daymapchallenge.com/" target="_blank">#30DayMapChallenge</a> - Jour 12 : "A Map from 2125"</b></p>
    </div>
  </arcgis-expand>

  <arcgis-expand slot="bottom-right" expand-tooltip="Légende" collapse-tooltip="Fermer la légende">
    <arcgis-legend legend-style="classic"></arcgis-legend>
  </arcgis-expand>
</arcgis-map>

<div id="switch-container">
  <h4>
    <calcite-switch id="switchbutton" unchecked></calcite-switch>
    01101101 01101111 01100100 01100101 00100000 01001001 01000001
  </h4>
</div>
Peu de choses à dire sur le script, qui attend classiquement que la carte et la vue soient prêtes avant d'interagir avec les données. Le morceaux principal gère la traduction du texte en binaire pour le mode IA :
function textToBinaryASCII(str) {
  return str
    .split("")
    .map(c => c.charCodeAt(0).toString(2).padStart(8, "0"))
    .join(" ");
}

function numberToBinary(num) {
  return parseInt(num, 10).toString(2);
}

const switchButton = document.getElementById("switchbutton");
const switchTextNode = switchButton.nextSibling;
const h1Node = document.querySelector(".titre h1");
const h3Node = document.querySelector(".titre h3");

h1Node.setAttribute("data-original", h1Node.textContent);
h3Node.setAttribute("data-original", h3Node.textContent);

switchButton.addEventListener("calciteSwitchChange", (event) => {
  const binaryMode = event.target.checked;
  h1Node.textContent = binaryMode
    ? numberToBinary(h1Node.getAttribute("data-original"))
    : h1Node.getAttribute("data-original");
  h3Node.textContent = binaryMode
    ? textToBinaryASCII(h3Node.getAttribute("data-original"))
    : h3Node.getAttribute("data-original");
  switchTextNode.nodeValue = binaryMode
    ? " Revenir au mode humain"
    : " 01101101 01101111 01100100 01100101 00100000 01001001 01000001"; // mode IA
});
Côté CSS, un assez gros travail de modification des règles du Calcite Design System pour que l'UI de notre app colle totalement au style de la carte :
calcite-shell {
  position: relative;
  --calcite-color-brand: #3fffff;
  --calcite-color-brand-hover: #efffff;
  --calcite-color-border-input: #0a3c5e;
  --calcite-color-foreground-1: #062336;
  --calcite-color-foreground-2: #020817;
  --calcite-color-foreground-current: #020817;
  --calcite-color-text-1: #efffff;
  --calcite-color-text-2: #efffff;
  --calcite-color-text-3: #efffff;
  --calcite-color-border-3: #020817;
  --calcite-color-transparent-tint: rgba(2, 8, 23, 0.7);
}
Et voilà le résultat final (à consulter ici en plein écran) :
Vous en voulez plus ? N'hésitez pas à consulter ce que j'avais fait l'an dernier pour le 30DayMapChallenge (Hexagones ; Temps et Espace et Mes Données). Vous pouvez également consulter tous les articles du blog proposant des tutoriels pour prendre en main les technologies de développement d'ArcGIS. 

Aucun commentaire:

Enregistrer un commentaire