election-helpers
Version:
Election helpers
2,394 lines (2,366 loc) • 230 kB
HTML
<!doctype html>
<html>
<head>
<meta name="generator" content="JSDoc 3.6.10">
<meta charset="utf-8">
<title>election-helpers 0.1.0 » Source: index.js</title>
<link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Karla:400,400i,700,700i" type="text/css">
<link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Noto+Serif:400,400i,700,700i" type="text/css">
<link rel="stylesheet" href="https://brick.a.ssl.fastly.net/Inconsolata:500" type="text/css">
<link href="css/baseline.css" rel="stylesheet">
</head>
<body onload="prettyPrint()">
<nav id="jsdoc-navbar" role="navigation" class="jsdoc-navbar">
<div id="jsdoc-navbar-container">
<div id="jsdoc-navbar-content">
<a href="index.html" class="jsdoc-navbar-package-name">election-helpers 0.<wbr>1.<wbr>0</a>
</div>
</div>
</nav>
<div id="jsdoc-body-container">
<div id="jsdoc-content">
<div id="jsdoc-content-container">
<div id="jsdoc-banner" role="banner">
</div>
<div id="jsdoc-main" role="main">
<header class="page-header">
<h1>Source: index.js</h1>
</header>
<article>
<pre class="prettyprint linenums"><code>/**
* Normalizes a party name string to a standardized format.
* @param {string} partyNameString - The party name string to be normalized.
* @returns {string} The normalized party name.
* @example
* const partyName = partyNameNormalizer('R') // returns 'rep'
* const partyName = partyNameNormalizer('REP') // returns 'rep'
* const partyName = partyNameNormalizer('Republican') // returns 'rep'
* const partyName = partyNameNormalizer('republican') // returns 'rep'
*/
export function partyNameNormalizer(partyNameString) {
// party names can come in as 'R' 'REP' 'Republican' 'republican'
// etc. so we need to normalize them to 'Republican'
// and so forth for the other parties
// check whether partyNameString is null or undefined
if (!partyNameString)
return console.error(
"partyNameString is null or undefined",
partyNameString
);
// check whether partyNameString is a string
if (typeof partyNameString !== "string")
return console.error("partyNameString is not a string");
// first we will make sure the party name is a string
const partyName = partyNameString.toString();
// then we will make sure it is lowercase
const lowerCasePartyName = partyName.toLowerCase();
const repStrings = ["r", "rep", "republican"];
const demStrings = ["d", "dem", "democrat"];
const otherStrings = ["o", "other"];
if (repStrings.includes(lowerCasePartyName)) return "rep";
else if (demStrings.includes(lowerCasePartyName)) return "dem";
else if (otherStrings.includes(lowerCasePartyName)) return "other";
else return "other";
}
/**
* @param {string} stateFips - The state fips code.
* @returns {string} - The state name
* @throws {Error} - If the state fips code is invalid.
* @example
* stateNameHash['01']
* // returns 'Alabama'
*
*/
const stateNameHash = {
"01": "Alabama",
"02": "Alaska",
"04": "Arizona",
"05": "Arkansas",
"06": "California",
"08": "Colorado",
"09": "Connecticut",
10: "Delaware",
11: "District of Columbia",
12: "Florida",
13: "Georgia",
15: "Hawaii",
16: "Idaho",
17: "Illinois",
18: "Indiana",
19: "Iowa",
20: "Kansas",
21: "Kentucky",
22: "Louisiana",
23: "Maine",
24: "Maryland",
25: "Massachusetts",
26: "Michigan",
27: "Minnesota",
28: "Mississippi",
29: "Missouri",
30: "Montana",
31: "Nebraska",
32: "Nevada",
33: "New Hampshire",
34: "New Jersey",
35: "New Mexico",
36: "New York",
37: "North Carolina",
38: "North Dakota",
39: "Ohio",
40: "Oklahoma",
41: "Oregon",
42: "Pennsylvania",
44: "Rhode Island",
45: "South Carolina",
46: "South Dakota",
47: "Tennessee",
48: "Texas",
49: "Utah",
50: "Vermont",
51: "Virginia",
53: "Washington",
54: "West Virginia",
55: "Wisconsin",
56: "Wyoming",
};
/**
*
* @param {string} stateAbbr - Two letter state abbreviation
* @returns {string} - The state name
* @throws {Error} - If the state abbreviation is invalid.
* @example
* getStateNameFromStateAbbr('AL')
* // returns 'Alabama'
*
*/
export function stateAbbrToName(stateAbbr) {
const stateAbbrHash = {
AL: "Alabama",
AK: "Alaska",
AS: "American Samoa",
AZ: "Arizona",
AR: "Arkansas",
CA: "California",
CO: "Colorado",
CT: "Connecticut",
DE: "Delaware",
DC: "District Of Columbia",
FM: "Federated States Of Micronesia",
FL: "Florida",
GA: "Georgia",
GU: "Guam",
HI: "Hawaii",
ID: "Idaho",
IL: "Illinois",
IN: "Indiana",
IA: "Iowa",
KS: "Kansas",
KY: "Kentucky",
LA: "Louisiana",
ME: "Maine",
MH: "Marshall Islands",
MD: "Maryland",
MA: "Massachusetts",
MI: "Michigan",
MN: "Minnesota",
MS: "Mississippi",
MO: "Missouri",
MT: "Montana",
NE: "Nebraska",
NV: "Nevada",
NH: "New Hampshire",
NJ: "New Jersey",
NM: "New Mexico",
NY: "New York",
NC: "North Carolina",
ND: "North Dakota",
MP: "Northern Mariana Islands",
OH: "Ohio",
OK: "Oklahoma",
OR: "Oregon",
PW: "Palau",
PA: "Pennsylvania",
PR: "Puerto Rico",
RI: "Rhode Island",
SC: "South Carolina",
SD: "South Dakota",
TN: "Tennessee",
TX: "Texas",
UT: "Utah",
VT: "Vermont",
VI: "Virgin Islands",
VA: "Virginia",
WA: "Washington",
WV: "West Virginia",
WI: "Wisconsin",
WY: "Wyoming",
};
return stateAbbrHash[stateAbbr];
}
/**
*
* @param {string} stateFips - The state fips code.
* @returns {string} - The state abbreviation
* @throws {Error} - If the state fips code is invalid.
* @example
* getStateAbbrFromStateFips('01')
* // returns 'AL'
*
* @example
* getStateAbbrFromStateFips('36')
* // returns 'NY'
*
* @example
* getStateAbbrFromStateFips('XX')
* // throws an error
*/
export function getStateAbbrFromStateFips(stateFips) {
if (!stateFips) {
throw new Error("stateFips is required");
}
if (stateFips.length !== 2) {
throw new Error("stateFips must be two characters");
}
if (!stateNameHash[stateFips]) {
throw new Error("stateFips is invalid");
}
return stateFipsToAbbr(+stateFips);
}
export function stateFipsToAbbr(stateFips) {
const stateFipsHash = {
1: "AL",
2: "AK",
4: "AZ",
5: "AR",
0: "CA",
8: "CO",
9: "CT",
10: "DE",
11: "DC",
12: "FL",
13: "GA",
15: "HI",
16: "ID",
17: "IL",
18: "IN",
19: "IA",
20: "KS",
21: "KY",
22: "LA",
23: "ME",
24: "MD",
25: "MA",
26: "MI",
27: "MN",
28: "MS",
29: "MO",
30: "MT",
31: "NE",
32: "NV",
33: "NH",
34: "NJ",
35: "NM",
36: "NY",
37: "NC",
38: "ND",
39: "OH",
40: "OK",
41: "OR",
42: "PA",
44: "RI",
45: "SC",
46: "SD",
47: "TN",
48: "TX",
49: "UT",
50: "VT",
51: "VA",
53: "WA",
54: "WV",
55: "WI",
56: "WY",
};
return stateFipsHash[stateFips];
}
/**
* @description Get the state code from the county fips string
* @param {string} countyFips - The county fips code.
* @returns {string} - The state fips code.
* @example
* getStateCodeFromCountyFips('01001')
* // returns '01'
* @example
* getStateCodeFromCountyFips(01000)
* // throws Error
* @example
* getStateCodeFromCountyFips('01')
* // throws Error
*
*/
export function getStateCodeFromCountyFips(countyFips) {
return countyFips.slice(0, 2);
}
/**
* @desc Given the absolute number of votes a candidate has received, and the total number of votes in the election, returns the percentage of votes the candidate has received.
* @param {number} candidateVote - The number of votes the candidate has received.
* @param {number} totalVotes - The total number of votes in the election.
* @returns {number} - The percentage of votes the candidate has received.
* @example
* getPercentageOfVotes(100, 200)
* // returns 50
*/
export function candidateVotePercentage(candidateVote, totalVote) {
const rawPercentage = (candidateVote / totalVote) * 100;
return rawPercentage.toFixed(config.votePercentDecimalPlaces);
}
/**
* @desc Given an array of candidate objects, returns a sorted array of candidate objects, sorted by the number of votes they have received with the specified sort function.
*
* @param {Array} candidates - An array of candidate objects.
* @param {Function} sortFunction - The function to use to sort the candidates (like d3.descending)
* @returns {Array} - A sorted array of candidate objects.
* @throws {Error} - If the candidates array is invalid.
*/
export function sortCandidatesByVotes(raceCandidateArray, sortFunction) {
if (!raceCandidateArray)
return console.error(
"Trying to sort candidates but didn't get anything to sort",
{
raceCandidateArray,
}
);
if (raceCandidateArray.length === 0)
return console.error(
"Trying to sort a candidate array with zero candidates"
);
if (raceCandidateArray.length === 1)
return console.log(
"Trying to sort a candidate array with only one candidate, which seems kinda weird"
);
if (sortFunction) {
return raceCandidateArray.sort(function (x, y) {
return sortFunction(+x.candidatevotes, +y.candidatevotes);
});
} else {
return raceCandidateArray;
}
}
/**
*
* @param {string} stateFips
* @returns {string} - The state name
* @throws {Error} - If the state fips code is invalid.
* @example
* stateFipsToName('01')
* // returns 'Alabama'
*
*/
export function stateFipsToName(stateFips) {
return stateNameHash[stateFips];
}
/**
* @description Get the state fips code from the abbreviation, like 'NY' to '36'
* @param {string} stateAbbreviation - The state abbreviation.
* @returns {string} - The state fips code.
* @example
* getStateFipsFromAbbreviation('NY')
* // returns '36'
*/
export function stateAbbrToFips(stateAbbr) {
const stateFips = Object.keys(stateNameHash).find(
(key) => stateNameHash[key] === stateAbbr
);
return stateFips;
}
/**
*
* @param {string} stateName
* @returns {string} - The state fips code
* @throws {Error} - If the state name is invalid.
* @example
* getStateFipsFromStateName('Alabama')
* // returns '01'
*/
export function stateNameToFips(stateName) {
return Object.keys(stateNameHash).find(
(key) => stateNameHash[key] === stateName
);
}
/**
* @param {string} raceType
* @returns {array} - An array of the available district types
* @example
* boundariesAvailableForRaceType('president')
* // returns ['state', 'county']
* @example
* boundariesAvailableForRaceType('senate')
* // returns ['state']
* @example
* boundariesAvailableForRaceType('house')
* // returns ['district']
* @example
* boundariesAvailableForRaceType(2016)
* // returns null
*/
export function boundariesAvailableForRaceType(raceType) {
const availableBoundaries = [];
if (raceType === "president") {
availableBoundaries.push("state");
availableBoundaries.push("county");
} else if (raceType === "senate") {
availableBoundaries.push("county");
} else if (raceType === "house") {
availableBoundaries.push("district");
} else return null;
return availableBoundaries;
}
/**
* @param {string} raceType - The race type, like 'president', 'house', or 'senate'
* @param {string} boundaryType - The type of boundary, like 'county', 'state', or 'district'
* @example
* isBoundaryAvailableForRaceType('president', 'county')
* // returns true
* @example
* isBoundaryAvailableForRaceType('president', 'state')
* // returns true
* @example
* isBoundaryAvailableForRaceType('president', 'district')
* // returns false
*/
export function isBoundaryAvailableForRaceType(raceType, boundaryType) {
const availableBoundaries = boundariesAvailableForRaceType(raceType);
if (!availableBoundaries) return false;
return availableBoundaries.includes(boundaryType);
}
/**
* Represents the bounds of the United States.
* @typedef {Object} USBounds
* @property {string} type - The type of the feature collection.
* @property {Array&lt;Object>} features - The features of the collection.
*/
/**
* The bounds of the United States.
* @type {USBounds}
*/
export const usBounds = {
type: "FeatureCollection",
features: [
{
type: "Feature",
properties: {
name: "us-bounds",
},
geometry: {
coordinates: [
[
[-131.73905162804652, 49.7608272024967],
[-131.73905162804652, 24.4450570581849],
[-67.3066676925451, 24.4450570581849],
[-67.3066676925451, 49.7608272024967],
[-131.73905162804652, 49.7608272024967],
],
],
type: "Polygon",
},
id: 0,
},
],
};
/**
* Represents the state planes and bounds for every state.
* @typedef {Object} StatePlaneProjections
* @property {string} proj - The projection
* @property {Array&lt;number>} rotate - The rotation of the projection.
* @property {Array&lt;number>} bounds - The bounds of the projection.
* @property {Array&lt;number>} parallels - The parallels of the projection.
*
*/
export const statePlaneProjections = {
// EPSG:26729 - http://spatialreference.org/ref/epsg/26729/
AL: {
proj: "tmerc",
rotate: [85.83333, -30.5],
bounds: [
[-0.039122, -0.079084],
[0.013939, 0.004511],
],
},
// ESRI:102006 - http://spatialreference.org/ref/esri/102006/
AK: {
proj: "albers",
rotate: [160, 0, -35],
parallels: [55, 65],
bounds: [
[0.239549, -0.48059],
[0.801862, -0.198652],
],
},
// EPSG:26748 - http://spatialreference.org/ref/epsg/26748/
AZ: {
proj: "tmerc",
rotate: [110.16667, -31],
bounds: [
[-0.06847, -0.105832],
[0.016648, -0.005817],
],
},
// EPSG:26751 - http://spatialreference.org/ref/epsg/26751/
AR: {
proj: "lcc",
rotate: [92, -34.3333],
parallels: [36.2333, 36.2333],
bounds: [
[-0.043829, -0.046094],
[0.039484, 0.028084],
],
},
// EPSG:26741 - http://spatialreference.org/ref/epsg/26741/
CA: {
proj: "lcc",
rotate: [122, -39.3333],
parallels: [41.6666, 40],
bounds: [
[-0.039842, -0.058581],
[0.151483, 0.151053],
],
},
// EPSG:26753 - http://spatialreference.org/ref/epsg/26753/
CO: {
proj: "lcc",
rotate: [105.5, -39.3333],
parallels: [39.71666, 40.783333],
bounds: [
[-0.063611, -0.038158],
[0.062054, 0.051889],
],
},
// EPSG:2234 - http://spatialreference.org/ref/epsg/2234/
CT: {
proj: "lcc",
rotate: [72.75, -40.83333],
parallels: [41.86666, 41.2],
bounds: [
[-0.016288, -0.026885],
[0.01581, -0.003503],
],
},
// EPSG:26757 - http://spatialreference.org/ref/epsg/26757/
DE: {
proj: "tmerc",
rotate: [75.4166666, -38],
bounds: [
[-0.005001, -0.032089],
[0.005024, -0.007876],
],
},
// EPSG:3785 - http://spatialreference.org/ref/epsg/3785/
DC: {
proj: "merc",
bounds: [
[-1.345994, -0.740178],
[-1.342325, -0.735617],
],
},
// EPSG:26758 - http://spatialreference.org/ref/epsg/26758/
FL: {
proj: "tmerc",
rotate: [81, -24.33333],
bounds: [
[-0.099503, -0.119249],
[0.015096, -0.003721],
],
},
// EPSG:26766 - http://spatialreference.org/ref/epsg/26766/
GA: {
proj: "tmerc",
rotate: [82.16666, -30],
bounds: [
[-0.049181, -0.087844],
[0.019638, -0.006248],
],
},
// EPSG:102007 - http://spatialreference.org/ref/epsg/102007/
HI: {
proj: "albers",
rotate: [160, 0],
parallels: [8, 18],
bounds: [
[0.005103, 0.273102],
[0.094808, 0.330188],
],
},
// EPSG:26768 - http://spatialreference.org/ref/epsg/26768/
ID: {
proj: "tmerc",
rotate: [112.16666, -41.66666],
bounds: [
[-0.063312, -0.129763],
[0.014526, -0.005756],
],
},
// EPSG:26771 - http://spatialreference.org/ref/epsg/26771/
IL: {
proj: "tmerc",
rotate: [88.33333, -36.66666],
bounds: [
[-0.04241, -0.102365],
[0.011411, -0.00535],
],
},
// EPSG:26773 - http://spatialreference.org/ref/epsg/26773/
IN: {
proj: "tmerc",
rotate: [85.66666, -37.5],
bounds: [
[-0.03348, -0.074457],
[0.011987, -0.005087],
],
},
// EPSG:26775 - http://spatialreference.org/ref/epsg/26775/
IA: {
proj: "lcc",
rotate: [93.5, -41.5],
parallels: [43.26666, 42.06666],
bounds: [
[-0.050977, -0.045923],
[0.055658, 0.02467],
],
},
// EPSG:26777 - http://spatialreference.org/ref/epsg/26777/
KS: {
proj: "lcc",
rotate: [98, -38.33333],
parallels: [39.783333, 38.716666],
bounds: [
[-0.07092, -0.038429],
[0.059354, 0.029147],
],
},
// EPSG:2798 - http://spatialreference.org/ref/epsg/2798/
KY: {
proj: "lcc",
rotate: [84.25, -37.5],
parallels: [37.96667, 38.96667],
bounds: [
[-0.09266, -0.035142],
[0.038866, 0.019769],
],
},
// EPSG:26781 - http://spatialreference.org/ref/epsg/26781/
LA: {
proj: "lcc",
rotate: [92.5, -30.66667],
parallels: [31.16667, 32.66667],
bounds: [
[-0.026135, -0.047393],
[0.064954, 0.03398],
],
},
// EPSG:26783 - http://spatialreference.org/ref/epsg/26783/
ME: {
proj: "tmerc",
rotate: [68.5, -43.83333],
bounds: [
[-0.03172, -0.063331],
[0.019186, 0.014596],
],
},
// EPSG:26785 - http://spatialreference.org/ref/epsg/26785/
MD: {
proj: "lcc",
rotate: [77, -37.83333],
parallels: [38.3, 39.45],
bounds: [
[-0.040965, -0.041293],
[0.032747, -0.001898],
],
},
// EPSG:26786 - http://spatialreference.org/ref/epsg/26786/
MA: {
proj: "lcc",
rotate: [71.5, -41],
parallels: [41.71667, 42.68333],
bounds: [
[-0.032858, -0.041736],
[0.025983, -0.005644],
],
},
// ESRI:102289 - http://spatialreference.org/ref/esri/102289/
MI: {
proj: "lcc",
rotate: [84.36667, -43.31667],
parallels: [44.18333, 45.7],
bounds: [
[-0.091788, -0.111344],
[0.032992, 0.037615],
],
},
// EPSG:26791 - http://spatialreference.org/ref/epsg/26791/
MN: {
proj: "lcc",
rotate: [93.1, -46.5],
parallels: [47.03333, 48.63333],
bounds: [
[-0.063071, -0.067919],
[0.055351, 0.072679],
],
},
// EPSG:26794 - http://spatialreference.org/ref/epsg/26794/
MS: {
proj: "tmerc",
rotate: [88.83333, -29.66667],
bounds: [
[-0.042095, -0.093163],
[0.010526, -0.008999],
],
},
// EPSG:26796 - http://spatialreference.org/ref/epsg/26796/
MO: {
proj: "tmerc",
rotate: [90.5, -35.83333],
bounds: [
[-0.06992, -0.085026],
[0.019532, -0.002833],
],
},
// EPSG:32001 - http://spatialreference.org/ref/epsg/32001/
MT: {
proj: "lcc",
rotate: [109.5, -47],
parallels: [48.71667, 47.85],
bounds: [
[-0.102896, -0.054104],
[0.094346, 0.061984],
],
},
// EPSG:32005 - http://spatialreference.org/ref/epsg/32005/
NE: {
proj: "lcc",
rotate: [100, -41.33333],
parallels: [41.85, 42.81667],
bounds: [
[-0.068593, -0.039585],
[0.08152, 0.030025],
],
},
// EPSG:32007 - http://spatialreference.org/ref/epsg/32007/
NV: {
proj: "tmerc",
rotate: [115.58333, -34.75],
bounds: [
[-0.059934, -0.127935],
[0.021683, -0.004461],
],
},
// EPSG:32110 - http://spatialreference.org/ref/epsg/32110/
NH: {
proj: "tmerc",
rotate: [71.66667, -42.5],
bounds: [
[-0.011394, -0.04899],
[0.012276, -0.00345],
],
},
// EPSG:32011 - http://spatialreference.org/ref/epsg/32011/
NJ: {
proj: "tmerc",
rotate: [74.66667, -38.83333],
bounds: [
[-0.012002, -0.044053],
[0.010178, -0.001666],
],
},
// EPSG:32012 - http://spatialreference.org/ref/epsg/32012/
NM: {
proj: "tmerc",
rotate: [104.33333, -31],
bounds: [
[-0.070352, -0.106333],
[0.018783, -0.006839],
],
},
// EPSG:32015 - http://spatialreference.org/ref/epsg/32015/
NY: {
proj: "tmerc",
rotate: [74.33333, -40],
bounds: [
[-0.070418, -0.087562],
[0.032597, -0.008658],
],
},
// EPSG:2264 - http://spatialreference.org/ref/epsg/2264/
NC: {
proj: "lcc",
rotate: [79, -33.75],
parallels: [36.16667, 34.33333],
bounds: [
[-0.089577, -0.059364],
[0.058875, -0.00211],
],
},
// ESRI:102720 - http://spatialreference.org/ref/esri/102720/
ND: {
proj: "lcc",
rotate: [100.5, -47],
parallels: [47.43333, 48.73333],
bounds: [
[-0.059447, -0.049054],
[0.066018, 0.025336],
],
},
// EPSG:32022 - http://spatialreference.org/ref/epsg/32022/
OH: {
proj: "lcc",
rotate: [82.5, -39.66667],
parallels: [40.43333, 41.7],
bounds: [
[-0.039979, -0.050964],
[0.032804, 0.02809],
],
},
// EPSG:32024 - http://spatialreference.org/ref/epsg/32024/
OK: {
proj: "lcc",
rotate: [98, -35],
parallels: [35.56667, 36.76667],
bounds: [
[-0.083112, -0.045371],
[0.06233, 0.027339],
],
},
// EPSG:2838 - http://spatialreference.org/ref/epsg/2838/
OR: {
proj: "lcc",
rotate: [120.5, -43.66667],
parallels: [46, 44.33333],
bounds: [
[-0.069245, -0.061412],
[0.063511, 0.038987],
],
},
// EPSG:32028 - http://spatialreference.org/ref/epsg/32028/
PA: {
proj: "lcc",
rotate: [77.75, -40.16667],
parallels: [40.88333, 41.95],
bounds: [
[-0.047398, -0.046685],
[0.051227, 0.009908],
],
},
// EPSG:32130 - http://spatialreference.org/ref/epsg/32130/
RI: {
proj: "tmerc",
rotate: [71.5, -41.08333],
bounds: [
[-0.004757, -0.016329],
[0.00496, -0.001108],
],
},
// EPSG:102733 - http://spatialreference.org/ref/epsg/102733/
SC: {
proj: "lcc",
rotate: [81, -31.83333],
parallels: [32.5, 34.83333],
bounds: [
[-0.038664, -0.068629],
[0.041115, -0.004133],
],
},
// EPSG:102734 - http://spatialreference.org/ref/epsg/102734/
SD: {
proj: "lcc",
rotate: [100, -43.83333],
parallels: [44.41667, 45.68333],
bounds: [
[-0.068863, -0.050651],
[0.061307, 0.029158],
],
},
// EPSG:32036 - http://spatialreference.org/ref/epsg/32036/
TN: {
proj: "lcc",
rotate: [86, -34.66667],
parallels: [35.25, 36.41667],
bounds: [
[-0.073626, -0.043194],
[0.071721, -0.006663],
],
},
// EPSG:32037 - http://spatialreference.org/ref/epsg/32037/
TX: {
proj: "lcc",
rotate: [101.5, -34],
parallels: [34.65, 36.18333],
bounds: [
[-0.093018, -0.051897],
[0.146798, 0.174877],
],
},
// EPSG:32042 - http://spatialreference.org/ref/epsg/32042/
UT: {
proj: "lcc",
rotate: [111.5, -40.33333],
parallels: [40.71667, 41.78333],
bounds: [
[-0.046864, -0.037411],
[0.045103, 0.075172],
],
},
// EPSG:32045 - http://spatialreference.org/ref/epsg/32045/
VT: {
proj: "tmerc",
rotate: [72.5, -42.5],
bounds: [
[-0.011767, -0.043955],
[0.012776, -0.00396],
],
},
// EPSG:32046 - http://spatialreference.org/ref/epsg/32046/
VA: {
proj: "lcc",
rotate: [78.5, -37.66667],
parallels: [38.03333, 39.2],
bounds: [
[-0.090317, -0.038369],
[0.054986, 0.024383],
],
},
// EPSG:2855 - http://spatialreference.org/ref/epsg/2855/
WA: {
proj: "lcc",
rotate: [120.83333, -47],
parallels: [48.73333, 47.5],
bounds: [
[-0.060942, -0.049359],
[0.06559, 0.034641],
],
},
// EPSG:32050 - http://spatialreference.org/ref/epsg/32050/
WV: {
proj: "lcc",
rotate: [79.5, -38.5],
parallels: [39, 40.25],
bounds: [
[-0.053928, -0.04614],
[0.029681, 0.027628],
],
},
// EPSG:2859 - http://spatialreference.org/ref/epsg/2859/
WI: {
proj: "lcc",
rotate: [90, -45.16667],
parallels: [46.76667, 45.56667],
bounds: [
[-0.046794, -0.044049],
[0.052058, 0.063177],
],
},
// EPSG:32055 - http://spatialreference.org/ref/epsg/32055/
WY: {
proj: "tmerc",
rotate: [105.16667, -40.66667],
bounds: [
[-0.077474, -0.078298],
[0.014664, -0.005782],
],
},
};
/**
* An array of county names with their corresponding FIPS codes.
* @typedef {Object} County
* @property {number} fips_code - The FIPS code of the county.
* @property {string} name - The name of the county.
*/
export const countyNames = [
{
fips_code: 72011,
name: "Aasco",
},
{
fips_code: 45001,
name: "Abbeville",
},
{
fips_code: 22001,
name: "Acadia",
},
{
fips_code: 51001,
name: "Accomack",
},
{
fips_code: 16001,
name: "Ada",
},
{
fips_code: 40001,
name: "Adair",
},
{
fips_code: 29001,
name: "Adair",
},
{
fips_code: 21001,
name: "Adair",
},
{
fips_code: 19001,
name: "Adair",
},
{
fips_code: 42001,
name: "Adams",
},
{
fips_code: 19003,
name: "Adams",
},
{
fips_code: 53001,
name: "Adams",
},
{
fips_code: 31001,
name: "Adams",
},
{
fips_code: 28001,
name: "Adams",
},
{
fips_code: 17001,
name: "Adams",
},
{
fips_code: 16003,
name: "Adams",
},
{
fips_code: 38001,
name: "Adams",
},
{
fips_code: 55001,
name: "Adams",
},
{
fips_code: 18001,
name: "Adams",
},
{
fips_code: 8001,
name: "Adams",
},
{
fips_code: 39001,
name: "Adams",
},
{
fips_code: 50001,
name: "Addison",
},
{
fips_code: 72001,
name: "Adjuntas",
},
{
fips_code: 72003,
name: "Aguada",
},
{
fips_code: 72005,
name: "Aguadilla",
},
{
fips_code: 72007,
name: "Aguas Buenas",
},
{
fips_code: 72009,
name: "Aibonito",
},
{
fips_code: 45003,
name: "Aiken",
},
{
fips_code: 27001,
name: "Aitkin",
},
{
fips_code: 12001,
name: "Alachua",
},
{
fips_code: 37001,
name: "Alamance",
},
{
fips_code: 6001,
name: "Alameda",
},
{
fips_code: 8003,
name: "Alamosa",
},
{
fips_code: 56001,
name: "Albany",
},
{
fips_code: 36001,
name: "Albany",
},
{
fips_code: 51003,
name: "Albemarle",
},
{
fips_code: 26001,
name: "Alcona",
},
{
fips_code: 28003,
name: "Alcorn",
},
{
fips_code: 2013,
name: "Aleutians East",
},
{
fips_code: 2016,
name: "Aleutians West",
},
{
fips_code: 37003,
name: "Alexander",
},
{
fips_code: 17003,
name: "Alexander",
},
{
fips_code: 51510,
name: "Alexandria",
},
{
fips_code: 40003,
name: "Alfalfa",
},
{
fips_code: 26003,
name: "Alger",
},
{
fips_code: 19005,
name: "Allamakee",
},
{
fips_code: 26005,
name: "Allegan",
},
{
fips_code: 36003,
name: "Allegany",
},
{
fips_code: 24001,
name: "Allegany",
},
{
fips_code: 37005,
name: "Alleghany",
},
{
fips_code: 51005,
name: "Alleghany",
},
{
fips_code: 42003,
name: "Allegheny",
},
{
fips_code: 39003,
name: "Allen",
},
{
fips_code: 18003,
name: "Allen",
},
{
fips_code: 20001,
name: "Allen",
},
{
fips_code: 22003,
name: "Allen",
},
{
fips_code: 21003,
name: "Allen",
},
{
fips_code: 45005,
name: "Allendale",
},
{
fips_code: 26007,
name: "Alpena",
},
{
fips_code: 6003,
name: "Alpine",
},
{
fips_code: 6005,
name: "Amador",
},
{
fips_code: 51007,
name: "Amelia",
},
{
fips_code: 51009,
name: "Amherst",
},
{
fips_code: 28005,
name: "Amite",
},
{
fips_code: 2020,
name: "Anchorage",
},
{
fips_code: 47001,
name: "Anderson",
},
{
fips_code: 20003,
name: "Anderson",
},
{
fips_code: 21005,
name: "Anderson",
},
{
fips_code: 45007,
name: "Anderson",
},
{
fips_code: 48001,
name: "Anderson",
},
{
fips_code: 29003,
name: "Andrew",
},
{
fips_code: 48003,
name: "Andrews",
},
{
fips_code: 23001,
name: "Androscoggin",
},
{
fips_code: 48005,
name: "Angelina",
},
{
fips_code: 24003,
name: "Anne Arundel",
},
{
fips_code: 27003,
name: "Anoka",
},
{
fips_code: 37007,
name: "Anson",
},
{
fips_code: 31003,
name: "Antelope",
},
{
fips_code: 26009,
name: "Antrim",
},
{
fips_code: 4001,
name: "Apache",
},
{
fips_code: 19007,
name: "Appanoose",
},
{
fips_code: 13001,
name: "Appling",
},
{
fips_code: 51011,
name: "Appomattox",
},
{
fips_code: 48007,
name: "Aransas",
},
{
fips_code: 8005,
name: "Arapahoe",
},
{
fips_code: 48009,
name: "Archer",
},
{
fips_code: 8007,
name: "Archuleta",
},
{
fips_code: 72013,
name: "Arecibo",
},
{
fips_code: 26011,
name: "Arenac",
},
{
fips_code: 5001,
name: "Arkansas",
},
{
fips_code: 51013,
name: "Arlington",
},
{
fips_code: 48011,
name: "Armstrong",
},
{
fips_code: 42005,
name: "Armstrong",
},
{
fips_code: 23003,
name: "Aroostook",
},
{
fips_code: 72015,
name: "Arroyo",
},
{
fips_code: 31005,
name: "Arthur",
},
{
fips_code: 22005,
name: "Ascension",
},
{
fips_code: 37009,
name: "Ashe",
},
{
fips_code: 55003,
name: "Ashland",
},
{
fips_code: 39005,
name: "Ashland",
},
{
fips_code: 5003,
name: "Ashley",
},
{
fips_code: 39007,
name: "Ashtabula",
},
{
fips_code: 53003,
name: "Asotin",
},
{
fips_code: 22007,
name: "Assumption",
},
{
fips_code: 48013,
name: "Atascosa",
},
{
fips_code: 29005,
name: "Atchison",
},
{
fips_code: 20005,
name: "Atchison",
},
{
fips_code: 39009,
name: "Athens",
},
{
fips_code: 13003,
name: "Atkinson",
},
{
fips_code: 34001,
name: "Atlantic",
},
{
fips_code: 40005,
name: "Atoka",
},
{
fips_code: 28007,
name: "Attala",
},
{
fips_code: 29007,
name: "Audrain",
},
{
fips_code: 19009,
name: "Audubon",
},
{
fips_code: 39011,
name: "Auglaize",
},
{
fips_code: 51015,
name: "Augusta",
},
{
fips_code: 46003,
name: "Aurora",
},
{
fips_code: 48015,
name: "Austin",
},
{
fips_code: 1001,
name: "Autauga",
},
{
fips_code: 37011,
name: "Avery",
},
{
fips_code: 22009,
name: "Avoyelles",
},
{
fips_code: 8009,
name: "Baca",
},
{
fips_code: 13005,
name: "Bacon",
},
{
fips_code: 48017,
name: "Bailey",
},
{
fips_code: 12003,
name: "Baker",
},
{
fips_code: 13007,
name: "Baker",
},
{
fips_code: 41001,
name: "Baker",
},
{
fips_code: 1003,
name: "Baldwin",
},
{
fips_code: 13009,
name: "Baldwin",
},
{
fips_code: 21007,
name: "Ballard",
},
{
fips_code: 24510,
name: "Baltimore",
},
{
fips_code: 24005,
name: "Baltimore",
},
{
fips_code: 45009,
name: "Bamberg",
},
{
fips_code: 48019,
name: "Bandera",
},
{
fips_code: 13011,
name: "Banks",
},
{
fips_code: 31007,
name: "Banner",
},
{
fips_code: 16005,
name: "Bannock",
},
{
fips_code: 26013,
name: "Baraga",
},
{
fips_code: 20007,
name: "Barber",
},
{
fips_code: 54001,
name: "Barbour",
},
{
fips_code: 1005,
name: "Barbour",
},
{
fips_code: 72017,
name: "Barceloneta",
},
{
fips_code: 38003,
name: "Barnes",
},
{
fips_code: 25001,
name: "Barnstable",
},
{
fips_code: 45011,
name: "Barnwell",
},
{
fips_code: 72019,
name: "Barranquitas",
},
{
fips_code: 21009,
name: "Barren",
},
{
fips_code: 55005,
name: "Barron",
},
{
fips_code: 13013,
name: "Barrow",
},
{
fips_code: 26015,
name: "Barry",
},
{
fips_code: 29009,
name: "Barry",
},
{
fips_code: 18005,
name: "Bartholomew",
},
{
fips_code: 20009,
name: "Barton",
},
{
fips_code: 29011,
name: "Barton",
},
{
fips_code: 13015,
name: "Bartow",
},
{
fips_code: 48021,
name: "Bastrop",
},
{
fips_code: 29013,
name: "Bates",
},
{
fips_code: 51017,
name: "Bath",
},
{
fips_code: 21011,
name: "Bath",
},
{
fips_code: 5005,
name: "Baxter",
},
{
fips_code: 26017,
name: "Bay",
},
{
fips_code: 12005,
name: "Bay",
},
{
fips_code: 72021,
name: "Bayamn",
},
{
fips_code: 55007,
name: "Bayfield",
},
{
fips_code: 48023,
name: "Baylor",
},
{
fips_code: 46005,
name: "Beadle",
},
{
fips_code: 16007,
name: "Bear Lake",
},
{
fips_code: 37013,
name: "Beaufort",
},
{
fips_code: 45013,
name: "Beaufort",
},
{
fips_code: 22011,
name: "Beauregard",
},
{
fips_code: 42007,
name: "Beaver",
},
{
fips_code: 40007,
name: "Beaver",
},
{
fips_code: 49001,
name: "Beaver",
},
{
fips_code: 30001,
name: "Beaverhead",
},
{
fips_code: 27005,
name: "Becker",
},
{
fips_code: 40009,
name: "Beckham",
},
{
fips_code: 42009,
name: "Bedford",
},
{
fips_code: 51019,
name: "Bedford",
},
{
fips_code: 47003,
name: "Bedford",
},
{
fips_code: 48025,
name: "Bee",
},
{
fips_code: 33001,
name: "Belknap",
},
{
fips_code: 21013,
name: "Bell",
},
{
fips_code: 48027,
name: "Bell",
},
{
fips_code: 39013,
name: "Belmont",
},
{
fips_code: 27007,
name: "Beltrami",
},
{
fips_code: 13017,
name: "Ben Hill",
},
{
fips_code: 16009,
name: "Benewah",
},
{
fips_code: 46007,
name: "Bennett",
},
{
fips_code: 50003,
name: "Bennington",
},
{
fips_code: 38005,
name: "Benson",
},
{
fips_code: 8011,
name: "Bent",
},
{
fips_code: 19011,
name: "Benton",
},
{
fips_code: 18007,
name: "Benton",
},
{
fips_code: 29015,
name: "Benton",
},
{
fips_code: 28009,
name: "Benton",
},
{
fips_code: 27009,
name: "Benton",
},
{
fips_code: 47005,
name: "Benton",
},
{
fips_code: 41003,
name: "Benton",
},
{
fips_code: 53005,
name: "Benton",
},
{
fips_code: 5007,
name: "Benton",
},
{
fips_code: 26019,
name: "Benzie",
},
{
fips_code: 34003,
name: "Bergen",
},
{
fips_code: 54003,
name: "Berkeley",
},
{
fips_code: 45015,
name: "Berkeley",
},
{
fips_code: 42011,
name: "Berks",
},
{
fips_code: 25003,
name: "Berkshire",
},
{
fips_code: 35001,
name: "Bernalillo",
},
{
fips_code: 26021,
name: "Berrien",
},
{
fips_code: 13019,
name: "Berrien",
},
{
fips_code: 37015,
name: "Bertie",
},
{
fips_code: 2050,
name: "Bethel",
},
{
fips_code: 48029,
name: "Bexar",
},
{
fips_code: 13021,
name: "Bibb",
},
{
fips_code: 1007,
name: "Bibb",
},
{
fips_code: 22013,
name: "Bienville",
},
{
fips_code: 56003,
name: "Big Horn",
},
{
fips_code: 30003,
name: "Big Horn",
},
{
fips_code: 27011,
name: "Big Stone",
},
{
fips_code: 38007,
name: "Billings",
},
{
fips_code: 16011,
name: "Bingham",
},
{
fips_code: 19013,
name: "Black Hawk",
},
{
fips_code: 18009,
name: "Blackford",
},
{
fips_code: 37017,
name: "Bladen",
},
{
fips_code: 31009,
name: "Blaine",
},
{
fips_code: 40011,
name: "Blaine",
},
{
fips_code: 16013,
name: "Blaine",
},
{
fips_code: 30005,
name: "Blaine",
},
{
fips_code: 42013,
name: "Blair",
},
{
fips_code: 48031,
name: "Blanco",
},
{
fips_code: 51021,
name: "Bland",
},
{
fips_code: 13023,
name: "Bleckley",
},
{
fips_code: 47007,
name: "Bledsoe",
},
{
fips_code: 47009,
name: "Blount",
},
{
fips_code: 1009,
name: "Blount",
},
{
fips_code: 27013,
name: "Blue Earth",
},
{
fips_code: 16015,
name: "Boise",
},
{
fips_code: 28011,
name: "Bolivar",
},
{
fips_code: 29017,
name: "Bollinger",
},
{
fips_code: 46009,
name: "Bon Homme",
},
{
fips_code: 17005,
name: "Bond",
},
{
fips_code: 16017,
name: "Bonner",
},
{
fips_code: 16019,
name: "Bonneville",
},
{
fips_code: 31011,
name: "Boone",
},
{
fips_code: 19015,
name: "Boone",
},
{
fips_code: 18011,
name: "Boone",
},
{
fips_code: 21015,
name: "Boone",
},
{
fips_code: 17007,
name: "Boone",
},
{
fips_code: 54005,
name: "Boone",
},
{
fips_code: 5009,
name: "Boone",
},
{
fips_code: 29019,
name: "Boone",
},
{
fips_code: 48033,
name: "Borden",
},
{
fips_code: 48035,
name: "Bosque",
},
{
fips_code: 22015,
name: "Bossier",
},
{
fips_code: 51023,
name: "Botetourt",
},
{
fips_code: 38009,
name: "Bottineau",
},
{
fips_code: 8013,
name: "Boulder",
},
{
fips_code: 16021,
name: "Boundary",
},
{
fips_code: 20011,
name: "Bourbon",
},
{
fips_code: 21017,
name: "Bourbon",
},
{
fips_code: 48037,
name: "Bowie",
},
{
fips_code: 38011,
name: "Bowman",
},
{
fips_code: 31013,
name: "Box Butte",
},
{
fips_code: 49003,
name: "Box Elder",
},
{
fips_code: 31015,
name: "Boyd",
},
{
fips_code: 21019,
name: "Boyd",
},
{
fips_code: 21021,
name: "Boyle",
},
{
fips_code: 21023,
name: "Bracken",
},
{
fips_code: 12007,
name: "Bradford",
},
{
fips_code: 42015,
name: "Bradford",
},
{
fips_code: 5011,
name: "Bradley",
},
{
fips_code: 47011,
name: "Bradley",
},
{
fips_code: 26023,
name: "Branch",
},
{
fips_code: 13025,
name: "Brantley",
},
{
fips_code: 54007,
name: "Braxton",
},
{
fips_code: 48039,
name: "Brazoria",
},
{
fips_code: 48041,
name: "Brazos",
},
{
fips_code: 21025,
name: "Breathitt",
},
{
fips_code: 21027,
name: "Breckinridge",
},
{
fips_code: 19017,
name: "Bremer",
},
{
fips_code: 12009,
name: "Brevard",
},
{
fips_code: 48043,
name: "Brewster",
},
{
fips_code: 48045,
name: "Briscoe",
},
{
fips_code: 44001,
name: "Bristol",
},
{
fips_code: 25005,
name: "Bristol",
},
{
fips_code: 51520,
name: "Bristol",
},
{
fips_code: 2060,
name: "Bristol Bay",
},
{
fips_code: 30007,
name: "Broadwater",
},
{
fips_code: 36005,
name: "Bronx",
},
{
fips_code: 54009,
name: "Brooke",
},
{
fips_code: 46011,
name: "Brookings",
},
{
fips_code: 48047,
name: "Brooks",
},
{
fips_code: 13027,
name: "Brooks",
},
{
fips_code: 36007,
name: "Broome",
},
{
fips_code: 8014,
name: "Broomfield",
},
{
fips_code: 12011,
name: "Broward",
},
{
fips_code: 18013,
name: "Brown",
},
{
fips_code: 46013,
name: "Brown",
},
{
fips_code: 48049,
name: "Brown",
},
{
fips_code: 39015,
name: "Brown",
},
{
fips_code: 31017,
name: "Brown",
},
{
fips_code: 17009,
name: "Brown",
},
{
fips_code: 55009,
name: "Brown",
},
{
fips_code: 20013,
name: "Brown",
},
{
fips_code: 27015,
name: "Brown",
},
{
fips_code: 46015,
name: "Brule",
},
{
fips_code: 37019,
name: "Brunswick",
},
{
fips_code: 51025,
name: "Brunswick",
},
{
fips_code: 13029,
name: "Bryan",
},
{
fips_code: 40013,
name: "Bryan",
},
{
fips_code: 19019,
name: "Buchanan",
},
{
fips_code: 29021,
name: "Buchanan",
},
{
fips_code: 51027,
name: "Buchanan",
},
{
fips_code: 51029,
name: "Buckingham",
},
{
fips_code: 42017,
name: "Bucks",
},
{
fips_code: 51530,
name: "Buena Vista",
},
{
fips_code: 19021,
name: "Buena Vista",
},
{
fips_code: 31019,
name: "Buffalo",
},
{
fips_code: 46017,
name: "Buffalo",
},
{
fips_code: 55011,
name: "Buffalo",
},
{
fips_code: 21029,
name: "Bullitt",
},
{
fips_code: 13031,
name: "Bulloch",
},
{
fips_code: 1011,
name: "Bullock",
},
{
fips_code: 37021,
name: "Buncombe",
},
{
fips_code: 17011,
name: "Bureau",
},
{
fips_code: 38013,
name: "Burke",
},
{
fips_code: 37023,
name: "Burke",
},
{
fips_code: 13033,
name: "Burke",
},
{
fips_code: 38015,
name: "Burleigh",
},
{
fips_code: 48051,
name: "Burleson",
},
{
fips_code: 34005,
name: "Burlington",
},
{
fips_code: 48053,
name: "Burnet",
},
{
fips_code: 55013,
name: "Burnett",
},
{
fips_code: 31021,
name: "Burt",
},
{
fips_code: 29023,
name: "Butler",
},
{
fips_code: 1013,
name: "Butler",
},
{
fips_code: 20015,
name: "Butler",
},
{
fips_code: 19023,
name: "Butler",
},
{
fips_code: 42019,
name: "Butler",
},
{
fips_code: 31023,
name: "Butler",
},
{
fips_code: 39017,
name: "Butler",
},
{
fips_code: 21031,
name: "Butler",
},
{
fips_code: 16023,
name: "Butte",
},
{
fips_code: 46019,
name: "Butte",
},
{
fips_code: 6007,
name: "Butte",
},
{
fips_code: 13035,
name: "Butts",
},
{
fips_code: 37025,
name: "Cabarrus",
},
{
fips_code: 54011,
name: "Cabell",
},
{
fips_c