/*
fundación h-orizontal / Secretaría Distrital de Seguridad de Bogotá
Mapa de Actores e Iniciativas del Sistema de Responsabilidad Penal Adolecente
v1.0
2018
Aportes y ayuda de
- Andrew Reid: https://stackoverflow.com/questions/51411646/d3js-force-layout-on-a-map
- rioV8: https://stackoverflow.com/questions/51829097/nodes-as-list-in-force-layout-over-a-map
*/
//Tamaño de la viz
var width = screen.width;
var height = screen.height;
// ancho y alto cuadro actores
var anchoCuadroActores = (width / 100) * 16;
var altoCuadroActores = (height / 100) * 80;
//Setup del mapa leaflet en un centro específico y un "estilo" (layer) b/n
var map = L.map('map', { zoomControl:false }).setView([4.624565, -74.101109], 12);
//mapLink = L.tileLayer('https://tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png').addTo(map);
//mapLink = L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png').addTo(map);
//mapLink = L.tileLayer('http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png').addTo(map);
//mapLink = L.tileLayer('https://cartodb-basemaps-{s}.global.ssl.fastly.net/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png').addTo(map);
mapLink = L.tileLayer('https://api.mapbox.com/styles/v1/pierreee1/cjnuqt47g2juo2snde808p6xr/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoicGllcnJlZWUxIiwiYSI6ImNqazh2dWlzdjFobm4za3AyN2Q5NTAwa3oifQ.ai-LoEOZs22rAXe0br8E0g').addTo(map);
map.doubleClickZoom.disable();
//map.dragging.disable();
//map.scrollWheelZoom.disable();
//cuando ya está el mapa se agrega un svg en donde dibujar
var svgLayer = L.svg();
svgLayer.addTo(map);
//seleccion el svg del mapa y crea un grupo
var svg = d3.select("#map").select("svg");
var g = svg.select('g');
// crea los tooltip y le da las características
var tooltip = d3.select("body")
.append("div")
.style("top", ((height / 100) * 20) + "px")
.style("left", ((width / 100) * 3) + "px")
.attr("class", "tooltip")
.style("opacity", 1)
;
var tooltip_1 = d3.select("body")
.append("div")
.style("top", ((height / 100) * 63) + "px")
.style("left", ((width / 100) * 4) + "px")
.attr("class", "tooltip_1")
.style("opacity", 1)
;
var tooltip_2 = d3.select("body")
.append("div")
.style("top", ((height / 100) * 63) + "px")
.style("left", ((width / 100) * 11) + "px")
.attr("class", "tooltip_2")
.style("opacity", 1)
;
var tooltip_logo1 = d3.select("body")
.append("div")
.style("top", ((height / 100) * 71) + "px")
.style("left", ((width / 100) * 5) + "px")
.html("")
.attr("class", "tooltip_logo")
.style("opacity", 1)
;
var tooltip_logo2 = d3.select("body")
.append("div")
.style("top", ((height / 100) * 69) + "px")
.style("left", ((width / 100) * 10) + "px")
.html("
")
.attr("class", "tooltip_logo")
.style("opacity", 1)
;
//Define la simulación de fuerza
var fuerza = d3.forceSimulation()
.force("link", d3.forceLink()
.id(function(d){
return d.id;
})
)
;
//Leer datos de ambos json y llamar la funcion que dibuja todo
d3.json('proyectos y actores_v5.json', function(data){
//pasar los datos a una variable
var graph = data;
//Printea los datos para verificar
console.log("Número de Actores y Proyectos: " + graph.nodes.length)
console.log(graph.nodes);
console.log("Número de links: " + graph.edges.length)
console.log(graph.edges);
// cuadro debajo de los actores, la posicion se coloca en la funcion que actualiza todo
var cuadroActores = g.append("rect")
.attr('width', anchoCuadroActores)
.attr('height', altoCuadroActores)
.style('fill', "#fafafa")
.style('opacity', 0.95)
.attr('stroke', "#bbbbbb")
.attr('stroke-width', 2)
.attr('stroke-dasharray', '10')
;
//crea los links entre nodos con un svg y los datos de "edges"
var lineas = g.append('g')
.selectAll("line")
.data(data.edges)
.enter()
.append("path")
.attr('class', "link")
;
// decide cuales nodos van en el proceso, cuales en el mapa y cuales de los actores
function isNodeOnLegend(d) {
return d.tipo === "actor";
}
function isNodeOnMap(d){
return d.tipo === "iniciativa" || d.tipo === "iniciativa_juvenil";
}
//funcion donde se pintan los nodos
function constructNodes(nodeList, className) {
//crea el grupo donde pintar los nodos
var nodes = g
.append("g")
.attr("class", className)
.selectAll(".nodos")
.data(nodeList)
.enter()
.append("g")
.attr("class", "gnode")
;
//pinta la nodos, características y tooltip
nodes.append("circle")
.attr('class', function(d){
if (isNodeOnLegend(d)) {
if(d.nuevos == "gestion_nuevos" || d.nuevos == "acompañamiento_nuevos" || d.nuevos == "investigacion_nuevos" || d.nuevos == "judicializacion_nuevos" || d.nuevos == "internacional_nuevos" || d.nuevos == "civil_nuevos"){
return "nodos " + d.nuevos;
} else {
return "nodos " + d.bloque;
}
}
if (isNodeOnMap(d)) return "nodos " + d.tipo;
})
.attr('r', 5)
.attr("pointer-events","visible")
.on("click", connectedNodes)
.on('mouseover', function(d){
tooltip
.html(function(){
if (d.tipo == "iniciativa" || d.tipo == "iniciativa_juvenil"){
return "