Skip to content

Instantly share code, notes, and snippets.

View tmcw's full-sized avatar
merging your prs

Tom MacWright tmcw

merging your prs
View GitHub Profile

There are two options for the Placemark Globe dataset:


This is "Visionscarto’s “World Atlas”, which is very well-described by the linked document. It's based on Natural Earth but includes some changes:

  • Western Sahara as the UN point of view
  • Crimea as part of Ukraine
  • Increased width of Gaza strip to avoid it being removed by simplification

These are the two main commits used to transition part of Placemark to It may make sense to reverse these: Deck caused some bugs, and while the performance was a little better, there was no way to transition fully.

import {
} from "";
import process from "node:process";
import SuperJSON from "npm:superjson@2.1.0";
SuperJSON.registerCustom<Function, string>(
isApplicable: (v: any): v is Function => typeof v === "function",
export default 42;
tmcw /
Created December 28, 2022 17:00
PMTiles to SVG

Request a single tile from PMTiles, use the vector-tiles module to read it, the d3-geo tools to turn it into a string. d3-geo is probably unnecessary.

This approach feels limited:

Requires restitching tiles if more than one. Limited attributes. Any tile-based solution is going to make compromises in favor of responsiveness and lightweight data. What this wants is completeness and non-sliced data.

import { Context } from "";
const DOMAIN = "";
const USERS = new Map([
subject: `acct:photos@${DOMAIN}`,
aliases: [],
import { Portal } from "@radix-ui/react-portal";
import clsx from "clsx";
import { useAtom } from "jotai";
import { atomWithMachine } from "jotai/xstate";
import { useRouter } from "next/router";
import { useEffect } from "react";
import { assign, createMachine } from "xstate";
import clamp from "lodash/clamp";
export function useMapKeybindings() {
const rep = usePersistence();
const historyControl = rep.useHistoryControl();
const transact = rep.useTransact();
"Command+z, Ctrl+z",
(e) => {
import { createContext, useContext } from "react";
import type { IPersistence } from "app/lib/persistence/ipersistence";
const notInContext = {} as IPersistence;
export const PersistenceContext = createContext<IPersistence>(notInContext);
export function usePersistence() {
return useContext(PersistenceContext);
export interface MomentInput {
note?: string;
putFeatures: IWrappedFeatureInput[];
deleteFeatures: IWrappedFeature["id"][];
putFolders: IFolderInput[];
deleteFolders: IFolder["id"][];
export interface IPersistence {
useHistoryControl(): (direction: "undo" | "redo") => Promise<void>;