MonkCode

Exploring the digital world!

Dedicated to exploring the digital world with a focus on data extraction and visualization using tools like Leaflet and D3.

Leaflet

Displaying GeoJSON data of the great loop

D3

Displaying data of the States in D3

Leaflet great loop map code:

import L from "leaflet"
import greatloop from "../GeoJSON/greatloop.json"
import home from "../GeoJSON/homeIcon.svg"
// JSX for my react application
// first "invisible" icon
var smallIcon = new L.Icon({
  iconUrl: home,
  iconSize: [0.0, 0.0],
  iconAnchor: [0, 0],
})

this.map = L.map("home_map", {
  center: [37.9404, -77.8943],
  zoom: 3,
  layers: [
    L.tileLayer("http://{s}.tile.osm.org/{z}/{x}/{y}.png", {
      attribution:
        '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
    }),
  ],
})

L.geoJSON(greatloop, {
  pointToLayer: function (feature, latlng) {
    return L.marker(latlng, { icon: smallIcon })
  },
}).addTo(this.map)
// JSX for my react template
<div id="home_map" style={{ height: "200px" }}></div>

D3 state data code:

import * as d3 from "d3"
import * as topojson from "topojson"
import us from "../GeoJSON/states-albers-10m.json"
// in the componentDidMount
const width = 975;
const height = 610;

const zoom = d3.zoom()
    .scaleExtent([1, 8])
    .on("zoom", zoomed);

const svg = d3.select(this.refs.home_graph)
    .attr("viewBox", [0, 0, width, height])
    .attr("width", width)
    .attr("height", height)
    .attr("style", "max-width: 100%; height: 200px;")
    .on("click", reset);

const path = d3.geoPath();

const g = svg.append("g");

const states = g.append("g")
    .attr("fill", "#444")
    .attr("cursor", "pointer")
  .selectAll("path")
  .data(topojson.feature(us, us.objects.states).features)
  .join("path")
    .on("click", clicked)
    .attr("d", path);

states.append("title")
    .text(d => d.properties.name);

g.append("path")
    .attr("fill", "none")
    .attr("stroke", "white")
    .attr("stroke-linejoin", "round")
    .attr("d", path(topojson.mesh(us, us.objects.states, (a, b) => a !== b)));

svg.call(zoom);

function reset() {
  states.transition().style("fill", null);
  svg.transition().duration(750).call(
    zoom.transform,
    d3.zoomIdentity,
    d3.zoomTransform(svg.node()).invert([width / 2, height / 2])
  );
}

function clicked(event, d) {
  const [[x0, y0], [x1, y1]] = path.bounds(d);
  event.stopPropagation();
  states.transition().style("fill", null);
  d3.select(this).transition().style("fill", "red");
  svg.transition().duration(750).call(
    zoom.transform,
    d3.zoomIdentity
      .translate(width / 2, height / 2)
      .scale(Math.min(8, 0.9 / Math.max((x1 - x0) / width, (y1 - y0) / height)))
      .translate(-(x0 + x1) / 2, -(y0 + y1) / 2),
    d3.pointer(event, svg.node())
  );
}

function zoomed(event) {
  const {transform} = event;
  g.attr("transform", transform);
  g.attr("stroke-width", 1 / transform.k);
}
// template
<svg ref="home_graph"></svg>

Continuos development of the monkcode information system, a set of components that gathers data autonomously and makes content.

Leveraging what I can with as much help as I can promt from ChatGPT.

Learn how to create, store, process, and distribute information. Use github actions or bitbucket pipelines to start your own information system today. Zapier, provides automation at scale across most common accounts.

XML Sitemap