All files / owid-grapher/grapher/mapCharts MapProjections.ts

98.33% Statements 59/60
33.33% Branches 1/3
100% Functions 0/0
98.33% Lines 59/60

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 861x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x   1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                                                    
import {
    geoPath,
    geoConicConformal,
    geoAzimuthalEqualArea,
    GeoPath,
} from "d3-geo"
import { geoRobinson, geoPatterson } from "d3-geo-projection"
 
// https://github.com/d3/d3-geo-projection/issues/202
// todo: would be nice to get propert types for this and not have to run different code during testing
const projectionToUseDuringJestTesting = geoConicConformal()
 
export enum MapProjectionName {
    World = "World",
    Africa = "Africa",
    NorthAmerica = "NorthAmerica",
    SouthAmerica = "SouthAmerica",
    Asia = "Asia",
    Europe = "Europe",
    Oceania = "Oceania",
}
 
export const MapProjectionLabels: Record<MapProjectionName, string> = {
    World: "World",
    Africa: "Africa",
    NorthAmerica: "North America",
    SouthAmerica: "South America",
    Asia: "Asia",
    Europe: "Europe",
    Oceania: "Oceania",
}
 
export const MapProjectionGeos: { [key in MapProjectionName]: GeoPath } = {
    World: geoPath().projection(
        typeof geoRobinson === "undefined"
            ? projectionToUseDuringJestTesting
            : geoRobinson()
    ),
 
    Africa: geoPath().projection(
        geoConicConformal().rotate([-25, 0]).center([0, 0]).parallels([30, -20])
    ),
 
    NorthAmerica: geoPath().projection(
        geoConicConformal()
            .rotate([98, 0])
            .center([0, 38])
            .parallels([29.5, 45.5])
    ),
 
    SouthAmerica: geoPath().projection(
        geoConicConformal()
            .rotate([68, 0])
            .center([0, -14])
            .parallels([10, -30])
    ),
 
    // From http://bl.ocks.org/dhoboy/ff8448ace9d5d567390a
    Asia: geoPath().projection(
        (typeof geoPatterson === "undefined"
            ? projectionToUseDuringJestTesting
            : geoPatterson()
        )
            .center([58, 54])
            .scale(150)
            .translate([0, 0])
            .precision(0.1)
    ),
 
    // From http://bl.ocks.org/espinielli/10587361
    Europe: geoPath().projection(
        geoAzimuthalEqualArea()
            .scale(200)
            .translate([262, 1187])
            .clipAngle(180 - 1e-3)
            .precision(1)
    ),
 
    Oceania: geoPath().projection(
        geoConicConformal()
            .rotate([-135, 0])
            .center([0, -20])
            .parallels([-10, -30])
    ),
} as const