Commit 3692b97b authored by ZettaScript's avatar ZettaScript

Add communities detection

parent bd653c8c
# WorldWotMap
WorldWotMap v0.5.0, © 2018 Pascal Engélibert, Licence GNU AGPL v3
WorldWotMap v0.6.0, © 2018 Pascal Engélibert, Licence GNU AGPL v3
Ceci est une carte affichant les comptes Ğ1 et leurs certifications. La carte peut être incomplète, car il est facultatif de renseigner sa position géographique sur Cesium+.
......@@ -16,11 +16,11 @@ Générez le cache JSON à partir de duniter.db (il vous faut un serveur Duniter
python3 gencache.py -d /chemin/vers/duniter.db -e
WorldWotMap nécessite jQuery et Leaflet. Modifiez les chemins dans le HTML en fonction de votre serveur.
WorldWotMap nécessite jQuery, Leaflet et jLouvain. Modifiez les chemins dans le HTML en fonction de votre serveur.
https://leafletjs.com/
https://jquery.com/
* https://leafletjs.com/
* https://jquery.com/
* https://github.com/upphiminn/jLouvain
C'est aussi plus joli avec une belle police, par exemple Proza Libre. https://fontlibrary.org/en/font/proza-libre
......@@ -32,6 +32,8 @@ Chaque ligne reliant deux points rouges représente une certification.
Vous pouvez sélectionner une personne en cliquant sur son point. Les certifications qu'elle a reçues s'affichent en rouges, celles qu'elle a émises en vert. (si il y a un chevauchement entre une certification reçue et une émise, une seule couleur peut apparaître **(bug à corriger)**) Pour n'afficher que les certifications liées à cette personne, cochez la case "_Afficher uniquement ses certifications_".
Le menu en haut à droite dans la carte permet d'afficher ou de cacher certaines couches de données. La couche _Communautés_ regroupe les communautés de certifications par couleurs (avec l'algorithme Louvain).
Cherchez un compte en entrant sa clé publique en entier ou que le début, son titre Cesium+ ou son UID dans le champ de recherche.
### Paramètres GET
......@@ -57,9 +59,10 @@ Dans le code :
* Afficher des statistiques (nombre de certifs, moyenne par membre, données de distance géographique, découpages en régions par communautés géographiques ou de certifications)
* Éventuellement créer un programme pour générer un JSON cache et éviter de surcharger les serveurs Cesium+.
* Améliorer l'interface du menu ?
* Choisir les couches à afficher dans les paramètres GET
* Trouver un algo pour générer une liste de couleurs pas trop limitée pour les communautés
Sinon :
* Héberger une instance chez vous et publier le lien
* Proposer de l'aide pour la traduction (dans ce cas il faudra songer à implémenter un système de traduction) (après tout, c'est une carte du monde, pas que de la francophonie)
* De l'aide pour la détection de communautés (algos, théorie des graphes)
* Suggestions ?
* Suggestions ? (si vous n'avez pas de compte GitLab, contactez-moi sur Cesium ou le forum Duniter)
......@@ -81,6 +81,7 @@ a, a:visited {
}
</style>
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/jLouvain.js"></script>
<script type="text/javascript" src="/js/leaflet/leaflet.js"></script>
<script type="text/javascript" src="utils.js"></script>
</head>
......@@ -89,7 +90,7 @@ a, a:visited {
<div id="header-text">
<h1>WorldWotMap</h1>
<a href="#map">&#11015; Voir la map &#11015;</a>
<p>WorldWotMap v0.5.0, &copy; 2018 <a href="https://zettascript.org/contact.php">Pascal Engélibert</a> (<a href="https://www.gnu.org/licenses/agpl.html">Licence GNU AGPL v3</a>)<br />
<p>WorldWotMap v0.6.0, &copy; 2018 <a href="https://zettascript.org/contact.php">Pascal Engélibert</a> (<a href="https://www.gnu.org/licenses/agpl.html">Licence GNU AGPL v3</a>)<br />
Dépôts Git&nbsp;: <a href="https://framagit.org/ZettaScript/worldwotmap/">Framagit</a> et <a href="https://git.duniter.org/tuxmain/worldwotmap">Duniter</a></p>
<p>Ceci est une carte affichant les comptes Ğ1 et leurs certifications. La carte peut être incomplète, car il est facultatif de renseigner sa position géographique sur Cesium+.</p>
<a href="gencache.py">Programme Python pour exporter les données de duniter.db</a>
......
/*
Copyright 2018 Pascal Engélibert
This file is part of WorldWotMap 0.5.0.
This file is part of WorldWotMap 0.6.0.
WorldWotMap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......@@ -26,7 +26,7 @@ var map_default_pos = [46.725, 2.834];
var map_default_zoom = 6;
class Account {
constructor(pubkey, title, pos, address, city, point, avatar) {
constructor(pubkey, title, pos, address, city, point, avatar, community=null) {
this.pubkey = pubkey;
this.title = title;
this.pos = pos;
......@@ -36,6 +36,7 @@ class Account {
this.certsIssued = [];
this.certsReceived = [];
this.avatar = avatar;
this.community = community;
}
mapActiveAccount() {// `this` is the Leaflet Circle, not the Account
......@@ -260,6 +261,7 @@ function alertOnMap(pos, radius=64, color="red", opacity=0.3) {
setTimeout(function(){point.removeFrom(map);}, 500);
}
var communities = {};
var ids = {};
var accounts = {};
var certs = [];
......@@ -273,10 +275,12 @@ var p_certlines = map.createPane("certlines");
var l_accounts_cert = L.layerGroup();
var l_accounts_wallet = L.layerGroup();
var l_certlines = L.layerGroup([]);
var l_communities = L.layerGroup([]);
var overlayMaps = {
"Identités": l_accounts_cert,
"Porte-feuilles": l_accounts_wallet,
"Certifications": l_certlines
"Certifications": l_certlines,
"Communautés": l_communities
};
L.control.layers({}, overlayMaps).addTo(map);
L.control.scale().addTo(map);
......@@ -318,20 +322,23 @@ $.post(cesium_data_url+"user/profile/_search", '{"query":{"bool":{"must":[{"exis
ncerts ++;
}
}
l_certlines.addTo(map);
// Change point colors
for(id in data["ids"]) {
if(id in accounts) {
if(accounts[id].certsIssued.length >= 5 && accounts[id].certsReceived.length >= 5) {
accounts[id].point.setStyle({color: "#0c0", fillColor: "#0c0"});
accounts[id].point.addTo(l_accounts_cert);
}
else {
accounts[id].point.setStyle({color: "red", fillColor: "red"});
accounts[id].point.addTo(l_accounts_cert);
}
accounts[id].point.removeFrom(l_accounts_wallet);
accounts[id].point.addTo(l_accounts_cert);
}
}
l_accounts_cert.addTo(map);
l_accounts_wallet.addTo(map);
// Select account given in URL
var url_account = getParam("a");
......@@ -344,6 +351,59 @@ $.post(cesium_data_url+"user/profile/_search", '{"query":{"bool":{"must":[{"exis
}
}
}
// Start communities detection
computeCommunities();
});
});
});
// Compute communities
class CommunityEdge {
constructor(source, target, weight=1) {
this.source = source;
this.target = target;
this.weight = weight;
}
}
class Community {
constructor(color) {
this.color = color;
}
}
function computeCommunities() {
var colors = ["#ff0000", "#00ff00", "#0000ff", "#c0c000", "#c000c0", "#00c0c0", "#d05000", "#d00050", "#50d000", "#00d050", "#d00050", "#00d050"];
var _nodes = [];
var _edges = [];
for(id in ids) {
_nodes.push(id);
}
for(cert in certs) {
_edges.push(new CommunityEdge(certs[cert].issuer, certs[cert].receiver));
}
var _communities = jLouvain().nodes(_nodes).edges(_edges)();
var i = 0;
for(a in _communities) {
if(a in accounts) {
if(!(_communities[a] in communities)) {
communities[_communities[a]] = new Community(colors[i % colors.length]);
i ++;
}
accounts[a].community = _communities[a];
var point = L.circle(accounts[a].pos, {
color: communities[_communities[a]].color,
fillColor: communities[_communities[a]].color,
fillOpacity: 0.2,
radius: 100,
pubkey: a
}).addTo(map);
point.addTo(l_communities);
}
}
l_communities.addTo(map);
l_communities.remove(map);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment