User

Lepticed7/LiliMap

< User:Lepticed7

Cette page décrit le protocole à suivre pour obtenir la carte du contributorat de Lili.

Script python

Ce script requête les données sur Lili, Wikidata, les associe et génère un fichier csv.

import requests
import re
import numpy as np
from qwikidata.sparql  import return_sparql_query_results

def fetch_lili_data():
    url = "https://lingualibre.org/bigdata/namespace/wdq/sparql"
    myobj = {"query":"""SELECT ?loc (COUNT(?loc) AS ?weight) WHERE {
      ?item prop:P2 entity:Q3.
      ?item prop:P14 ?loc.
      
      FILTER regex(?loc, "Q")
    } GROUP BY ?loc"""}
    
    x = requests.post(url, data=myobj)
    
    weights = {}
    
    for q, n in re.findall(r"(Q\d+)<\/literal>.+?integer'>(\d+)<\/literal>", x.text, re.VERBOSE | re.DOTALL):
        weights[q] = int(n)
    
    return weights

def fetch_wiki_data(locations):
    query_string = f"""
        SELECT ?loc ?coords 
        WHERE 
        {{
          ?loc wdt:P625 ?coords.
          VALUES ?loc {{ {" ".join(["wd:" + loc for loc in locations])} }}
        }}"""
    
    results = return_sparql_query_results(query_string)
    coordinates = {}
    for result in results['results']['bindings']:
        loc = result['loc']['value'].split("/")[-1]
        coords = result['coords']['value']
        coords_match = re.match("Point\((.+) (.+)\)", coords)
        x = coords_match[1]
        y = coords_match[2]
        
        coordinates[loc] = (y, x)
    return coordinates

def export_csv_file(lili_data, wiki_data):
    file = open("out.csv", "w")
    
    try:
        file.write('Lat,Lon,Weight\n')
        for loc, coords in wiki_data.items():
            file.write(f"{coords[0]},{coords[1]},{np.log(lili_data[loc]*10)}\n")
    finally:
        file.close()

lili_data = fetch_lili_data()
wiki_data = fetch_wiki_data(lili_data.keys())
export_csv_file(lili_data, wiki_data)

Visualisation

Pour visualiser les données, Kepler.gl est utilisé :

  • importer le fichier csv
  • dans les layers, choisir Heatmap
  • paramétrer les colonnes Lat, Lon et Weight avec les champs associés
  • (conseil) augmenter le rayon de la heatmap à 100%
  • (conseil) cliquer sur la barre des couleurs et activer "reversed"