add country outlines

This commit is contained in:
Luca Jakob 2026-06-01 09:12:35 +02:00
parent de32543f5e
commit 77c21ee07d
23 changed files with 5860 additions and 2 deletions

View File

@ -0,0 +1,295 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "Australia",
"isoA2": "AU",
"isoA3": "AUS",
"continent": "Oceania",
"subregion": "Australia and New Zealand"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": 112.91944420700008,
"maxLon": 159.1064559250001,
"minLat": -54.75042083099993,
"maxLat": -9.240166924999926
},
"rings": [
[
{
"x": 40.31,
"y": 49.14
},
{
"x": 6.62,
"y": 56.24
},
{
"x": 4.54,
"y": 54.98
},
{
"x": 6.07,
"y": 49.51
},
{
"x": 0.51,
"y": 37.16
},
{
"x": 2.06,
"y": 37.97
},
{
"x": 1.29,
"y": 35.75
},
{
"x": 2.85,
"y": 37.52
},
{
"x": 1.02,
"y": 33.34
},
{
"x": 2.22,
"y": 27.93
},
{
"x": 17.4,
"y": 22.84
},
{
"x": 21.64,
"y": 15.77
},
{
"x": 23.06,
"y": 18.36
},
{
"x": 23.06,
"y": 15.24
},
{
"x": 25.95,
"y": 15.74
},
{
"x": 24.81,
"y": 13.81
},
{
"x": 28.36,
"y": 10.28
},
{
"x": 31.39,
"y": 10.33
},
{
"x": 32.7,
"y": 13.75
},
{
"x": 36.39,
"y": 13.08
},
{
"x": 38.23,
"y": 6.94
},
{
"x": 42.95,
"y": 6.36
},
{
"x": 41.27,
"y": 4.15
},
{
"x": 51.21,
"y": 5.84
},
{
"x": 48.82,
"y": 12.54
},
{
"x": 59.77,
"y": 18.44
},
{
"x": 64.15,
"y": 3.18
},
{
"x": 66.82,
"y": 11.34
},
{
"x": 70.21,
"y": 12.53
},
{
"x": 72.34,
"y": 21.36
},
{
"x": 77.65,
"y": 24.17
},
{
"x": 87.22,
"y": 36.68
},
{
"x": 86.91,
"y": 47.98
},
{
"x": 80.25,
"y": 62.09
},
{
"x": 72.51,
"y": 65.71
},
{
"x": 69.32,
"y": 62.9
},
{
"x": 66.29,
"y": 65.08
},
{
"x": 61.65,
"y": 64.08
},
{
"x": 58.19,
"y": 61.59
},
{
"x": 57.25,
"y": 57.43
},
{
"x": 54.53,
"y": 57.97
},
{
"x": 54.52,
"y": 54.72
},
{
"x": 51.79,
"y": 57.17
},
{
"x": 53.81,
"y": 51.15
},
{
"x": 49.9,
"y": 56.62
},
{
"x": 45.96,
"y": 51.01
},
{
"x": 40.84,
"y": 49.41
},
{
"x": 40.31,
"y": 49.14
}
],
[
{
"x": 75.95,
"y": 74.69
},
{
"x": 71.68,
"y": 75.39
},
{
"x": 68.81,
"y": 69.04
},
{
"x": 76.41,
"y": 69.44
},
{
"x": 75.94,
"y": 74.66
},
{
"x": 75.95,
"y": 74.69
}
],
[
{
"x": 54.58,
"y": 58.4
},
{
"x": 51.13,
"y": 58.61
},
{
"x": 54.54,
"y": 58.4
},
{
"x": 54.58,
"y": 58.4
}
],
[
{
"x": 87.58,
"y": 34.61
},
{
"x": 86.9,
"y": 36.38
},
{
"x": 87.56,
"y": 34.58
},
{
"x": 87.58,
"y": 34.61
}
],
[
{
"x": 40.31,
"y": 4.77
},
{
"x": 37.77,
"y": 4.38
},
{
"x": 40.3,
"y": 4.74
},
{
"x": 40.31,
"y": 4.77
}
]
]
}
}

View File

@ -0,0 +1,295 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "Brazil",
"isoA2": "BR",
"isoA3": "BRA",
"continent": "South America",
"subregion": "South America"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": -74.01847469099994,
"maxLon": -28.877064581999946,
"minLat": -33.74228037499992,
"maxLat": 5.267224833000029
},
"rings": [
[
{
"x": 36.37,
"y": 90.9
},
{
"x": 45.1,
"y": 80.82
},
{
"x": 40.22,
"y": 70.64
},
{
"x": 35.52,
"y": 70.09
},
{
"x": 36.67,
"y": 60.2
},
{
"x": 34.73,
"y": 55.26
},
{
"x": 30.7,
"y": 55.2
},
{
"x": 30.01,
"y": 48.87
},
{
"x": 19.98,
"y": 44.25
},
{
"x": 19.1,
"y": 38.33
},
{
"x": 11.97,
"y": 41.99
},
{
"x": 7.48,
"y": 41.73
},
{
"x": 7.74,
"y": 37.68
},
{
"x": 4.04,
"y": 39.15
},
{
"x": 0,
"y": 32.84
},
{
"x": 2.44,
"y": 26.66
},
{
"x": 8.96,
"y": 24.5
},
{
"x": 8.78,
"y": 11.99
},
{
"x": 10.81,
"y": 11.84
},
{
"x": 9.22,
"y": 9.12
},
{
"x": 14.61,
"y": 8.02
},
{
"x": 18.88,
"y": 11.81
},
{
"x": 23.59,
"y": 7.65
},
{
"x": 20.41,
"y": 2.55
},
{
"x": 24.69,
"y": 4.36
},
{
"x": 30.58,
"y": 0
},
{
"x": 33.6,
"y": 10.46
},
{
"x": 40.02,
"y": 8.75
},
{
"x": 39.98,
"y": 7.02
},
{
"x": 46.67,
"y": 7.92
},
{
"x": 49.85,
"y": 2.12
},
{
"x": 53.46,
"y": 10.49
},
{
"x": 47.21,
"y": 17.6
},
{
"x": 51.35,
"y": 15.84
},
{
"x": 51.39,
"y": 18.55
},
{
"x": 54.49,
"y": 18.06
},
{
"x": 53.95,
"y": 20.37
},
{
"x": 57.55,
"y": 15.2
},
{
"x": 60.23,
"y": 15.32
},
{
"x": 65.32,
"y": 18.2
},
{
"x": 64.74,
"y": 21.96
},
{
"x": 67.71,
"y": 19.5
},
{
"x": 75.39,
"y": 20.8
},
{
"x": 85.31,
"y": 26.69
},
{
"x": 86.89,
"y": 31.85
},
{
"x": 85.76,
"y": 37.07
},
{
"x": 77.74,
"y": 46.15
},
{
"x": 77.27,
"y": 58.82
},
{
"x": 73.16,
"y": 69.94
},
{
"x": 55.99,
"y": 78.49
},
{
"x": 55.98,
"y": 86.59
},
{
"x": 48.61,
"y": 95.96
},
{
"x": 51.96,
"y": 91.56
},
{
"x": 50.36,
"y": 90.43
},
{
"x": 45.72,
"y": 100
},
{
"x": 44.88,
"y": 95.67
},
{
"x": 36.4,
"y": 90.93
},
{
"x": 36.37,
"y": 90.9
}
],
[
{
"x": 50.58,
"y": 15.08
},
{
"x": 48.97,
"y": 17.3
},
{
"x": 50.54,
"y": 15.05
},
{
"x": 50.58,
"y": 15.08
}
],
[
{
"x": 56.61,
"y": 14.98
},
{
"x": 51.87,
"y": 18.05
},
{
"x": 51.91,
"y": 13.99
},
{
"x": 56.62,
"y": 14.82
},
{
"x": 56.61,
"y": 14.98
}
]
]
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,77 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "France",
"isoA2": "-99",
"isoA3": "-99",
"continent": "Europe",
"subregion": "Western Europe"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": -61.79784094999991,
"maxLon": 55.854502800000034,
"minLat": -21.37078215899993,
"maxLat": 51.08754088371883
},
"rings": [
[
{
"x": 6.53,
"y": 67.59
},
{
"x": 6.68,
"y": 62.58
},
{
"x": 8.63,
"y": 64.78
},
{
"x": 6.53,
"y": 67.59
}
],
[
{
"x": 54.67,
"y": 0
},
{
"x": 59.5,
"y": 2.94
},
{
"x": 57.59,
"y": 6.73
},
{
"x": 58.88,
"y": 10.11
},
{
"x": 54.65,
"y": 12.09
},
{
"x": 51.27,
"y": 11.08
},
{
"x": 51.58,
"y": 6.6
},
{
"x": 48.46,
"y": 3.63
},
{
"x": 54.67,
"y": 0
}
]
]
}
}

View File

@ -0,0 +1,529 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "Germany",
"isoA2": "DE",
"isoA3": "DEU",
"continent": "Europe",
"subregion": "Western Europe"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": 5.852489868000106,
"maxLon": 15.022059367000054,
"minLat": 47.27112091100007,
"maxLat": 55.065334377000056
},
"rings": [
[
{
"x": 86.84,
"y": 80.82
},
{
"x": 85.76,
"y": 83.96
},
{
"x": 82.91,
"y": 83.29
},
{
"x": 82.37,
"y": 85.82
},
{
"x": 75.1,
"y": 89.19
},
{
"x": 78.73,
"y": 95.02
},
{
"x": 77.97,
"y": 97.5
},
{
"x": 69.66,
"y": 94.09
},
{
"x": 58.72,
"y": 98.42
},
{
"x": 49.91,
"y": 96.08
},
{
"x": 46.97,
"y": 100
},
{
"x": 44.64,
"y": 96.54
},
{
"x": 29.78,
"y": 93.21
},
{
"x": 27.68,
"y": 94.6
},
{
"x": 29.53,
"y": 95.92
},
{
"x": 18.91,
"y": 95.98
},
{
"x": 18.9,
"y": 88.98
},
{
"x": 25.6,
"y": 78.35
},
{
"x": 9.39,
"y": 75.78
},
{
"x": 5.37,
"y": 71.98
},
{
"x": 7.09,
"y": 67.61
},
{
"x": 2.66,
"y": 64.36
},
{
"x": 5.69,
"y": 60.94
},
{
"x": 0.06,
"y": 51.91
},
{
"x": 3.88,
"y": 47.18
},
{
"x": 0.82,
"y": 41.81
},
{
"x": 9.72,
"y": 40.5
},
{
"x": 9.02,
"y": 38.55
},
{
"x": 12.8,
"y": 36.37
},
{
"x": 12.22,
"y": 33.54
},
{
"x": 8.93,
"y": 32.38
},
{
"x": 12.72,
"y": 31.3
},
{
"x": 16.51,
"y": 22.61
},
{
"x": 12.77,
"y": 21.67
},
{
"x": 14.98,
"y": 17.95
},
{
"x": 23.76,
"y": 17.41
},
{
"x": 25.66,
"y": 21.23
},
{
"x": 26.37,
"y": 18.64
},
{
"x": 29.44,
"y": 19.52
},
{
"x": 28.92,
"y": 21.9
},
{
"x": 29.83,
"y": 15.33
},
{
"x": 36.62,
"y": 15.31
},
{
"x": 43.4,
"y": 19.52
},
{
"x": 33.41,
"y": 14.47
},
{
"x": 33.92,
"y": 9.59
},
{
"x": 29.96,
"y": 9.33
},
{
"x": 34.45,
"y": 7.17
},
{
"x": 30.63,
"y": 2.17
},
{
"x": 44.66,
"y": 3.67
},
{
"x": 45.52,
"y": 6.48
},
{
"x": 43.49,
"y": 7.57
},
{
"x": 46.8,
"y": 7.36
},
{
"x": 46.78,
"y": 9.51
},
{
"x": 57.61,
"y": 8.72
},
{
"x": 53.44,
"y": 13.03
},
{
"x": 54.91,
"y": 14.13
},
{
"x": 61.13,
"y": 14.87
},
{
"x": 63.66,
"y": 11.68
},
{
"x": 68.3,
"y": 12.41
},
{
"x": 72.86,
"y": 7.4
},
{
"x": 77.09,
"y": 8.11
},
{
"x": 71.06,
"y": 10.21
},
{
"x": 78.32,
"y": 8.1
},
{
"x": 83.02,
"y": 12.41
},
{
"x": 86.76,
"y": 12.33
},
{
"x": 86.86,
"y": 15.56
},
{
"x": 91.74,
"y": 16.86
},
{
"x": 93.67,
"y": 23.27
},
{
"x": 90.21,
"y": 28.41
},
{
"x": 95.89,
"y": 31.93
},
{
"x": 94.8,
"y": 34.43
},
{
"x": 97.16,
"y": 38.34
},
{
"x": 95.24,
"y": 41.84
},
{
"x": 99.27,
"y": 46.57
},
{
"x": 98.78,
"y": 52.25
},
{
"x": 96.9,
"y": 54.59
},
{
"x": 91.99,
"y": 51.69
},
{
"x": 92.63,
"y": 53.7
},
{
"x": 72.61,
"y": 60
},
{
"x": 70.32,
"y": 62.93
},
{
"x": 67.87,
"y": 60.94
},
{
"x": 72.76,
"y": 66.21
},
{
"x": 71.23,
"y": 68.29
},
{
"x": 74.06,
"y": 72.31
},
{
"x": 86.63,
"y": 80.64
},
{
"x": 86.84,
"y": 80.82
}
],
[
{
"x": 91.14,
"y": 14.46
},
{
"x": 87.11,
"y": 15.59
},
{
"x": 89.41,
"y": 13.6
},
{
"x": 86.16,
"y": 11.7
},
{
"x": 91.14,
"y": 14.46
}
],
[
{
"x": 13.97,
"y": 17.41
},
{
"x": 16.3,
"y": 17.22
},
{
"x": 14.41,
"y": 17.5
},
{
"x": 13.97,
"y": 17.41
}
],
[
{
"x": 19.72,
"y": 16.72
},
{
"x": 21.38,
"y": 16.45
},
{
"x": 19.81,
"y": 16.77
},
{
"x": 19.72,
"y": 16.72
}
],
[
{
"x": 58.92,
"y": 7.53
},
{
"x": 56.23,
"y": 7.84
},
{
"x": 58.75,
"y": 7.31
},
{
"x": 58.92,
"y": 7.53
}
],
[
{
"x": 79.51,
"y": 5.99
},
{
"x": 78.62,
"y": 7.66
},
{
"x": 79.51,
"y": 6.26
},
{
"x": 79.51,
"y": 5.99
}
],
[
{
"x": 85.56,
"y": 8.64
},
{
"x": 82.39,
"y": 10.74
},
{
"x": 79.21,
"y": 9.33
},
{
"x": 80.86,
"y": 8.72
},
{
"x": 79.51,
"y": 6.7
},
{
"x": 83.48,
"y": 7.4
},
{
"x": 80.71,
"y": 6.42
},
{
"x": 82.21,
"y": 4.84
},
{
"x": 85.34,
"y": 8.53
},
{
"x": 85.56,
"y": 8.64
}
],
[
{
"x": 27.35,
"y": 1.5
},
{
"x": 30.56,
"y": 2.2
},
{
"x": 26.52,
"y": 4.14
},
{
"x": 28.47,
"y": 0.19
},
{
"x": 27.25,
"y": 1.26
},
{
"x": 27.35,
"y": 1.5
}
]
]
}
}

View File

@ -0,0 +1,321 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "India",
"isoA2": "IN",
"isoA3": "IND",
"continent": "Asia",
"subregion": "Southern Asia"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": 68.14340254000007,
"maxLon": 97.36225305200003,
"minLat": 6.74555084800005,
"maxLat": 35.49540557900012
},
"rings": [
[
{
"x": 33.05,
"y": 0
},
{
"x": 39.26,
"y": 9.5
},
{
"x": 35.05,
"y": 10.25
},
{
"x": 36.28,
"y": 14.56
},
{
"x": 44.01,
"y": 18.37
},
{
"x": 40.7,
"y": 23.16
},
{
"x": 50,
"y": 27.83
},
{
"x": 67.98,
"y": 31.74
},
{
"x": 70.05,
"y": 25.7
},
{
"x": 71.71,
"y": 30.17
},
{
"x": 81.23,
"y": 30.23
},
{
"x": 80.16,
"y": 26.59
},
{
"x": 83.62,
"y": 26.6
},
{
"x": 90.65,
"y": 21.48
},
{
"x": 96.54,
"y": 21.64
},
{
"x": 96.37,
"y": 24.61
},
{
"x": 100,
"y": 26.09
},
{
"x": 99.17,
"y": 29.25
},
{
"x": 92.34,
"y": 30.9
},
{
"x": 88.94,
"y": 40.48
},
{
"x": 86.13,
"y": 39.76
},
{
"x": 84.65,
"y": 47.09
},
{
"x": 82.54,
"y": 41.01
},
{
"x": 80.23,
"y": 43.66
},
{
"x": 78.69,
"y": 41.27
},
{
"x": 83.22,
"y": 36.67
},
{
"x": 74.18,
"y": 35.51
},
{
"x": 73.62,
"y": 32.25
},
{
"x": 69.23,
"y": 30.9
},
{
"x": 68.26,
"y": 33.62
},
{
"x": 71.33,
"y": 35.51
},
{
"x": 68.03,
"y": 37.74
},
{
"x": 70.48,
"y": 38.99
},
{
"x": 71.66,
"y": 48.27
},
{
"x": 70.22,
"y": 46.23
},
{
"x": 68.81,
"y": 48.48
},
{
"x": 67.64,
"y": 45.46
},
{
"x": 62.57,
"y": 53.9
},
{
"x": 58.61,
"y": 54.66
},
{
"x": 48.48,
"y": 65.79
},
{
"x": 41.54,
"y": 68.85
},
{
"x": 40.09,
"y": 87.66
},
{
"x": 36.86,
"y": 90.51
},
{
"x": 38.71,
"y": 91.61
},
{
"x": 35.14,
"y": 91.81
},
{
"x": 32.06,
"y": 95.37
},
{
"x": 28.75,
"y": 92.46
},
{
"x": 18.16,
"y": 67.61
},
{
"x": 15.42,
"y": 54.45
},
{
"x": 16.34,
"y": 46
},
{
"x": 13.71,
"y": 45.97
},
{
"x": 13.56,
"y": 49.71
},
{
"x": 8.89,
"y": 51.4
},
{
"x": 2.74,
"y": 45.91
},
{
"x": 8.08,
"y": 43.1
},
{
"x": 4.94,
"y": 44.29
},
{
"x": 0.98,
"y": 41.94
},
{
"x": 2.32,
"y": 40.41
},
{
"x": 0,
"y": 41.33
},
{
"x": 2.07,
"y": 38.83
},
{
"x": 10.03,
"y": 38.59
},
{
"x": 4.76,
"y": 29.11
},
{
"x": 7.52,
"y": 26.03
},
{
"x": 12.77,
"y": 26.21
},
{
"x": 24.7,
"y": 11.25
},
{
"x": 20.05,
"y": 8.06
},
{
"x": 19.77,
"y": 2.97
},
{
"x": 26.13,
"y": 3.45
},
{
"x": 31.76,
"y": 0.67
},
{
"x": 33.05,
"y": 0
}
],
[
{
"x": 85.25,
"y": 77.26
},
{
"x": 84.1,
"y": 83.48
},
{
"x": 85.19,
"y": 77.18
},
{
"x": 85.25,
"y": 77.26
}
]
]
}
}

View File

@ -0,0 +1,365 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "Italy",
"isoA2": "IT",
"isoA3": "ITA",
"continent": "Europe",
"subregion": "Southern Europe"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": 6.6027283120000675,
"maxLon": 18.517425977000073,
"minLat": 35.48924388200004,
"maxLat": 47.08521494500006
},
"rings": [
[
{
"x": 3.52,
"y": 10
},
{
"x": 10.42,
"y": 10.06
},
{
"x": 15.08,
"y": 5.46
},
{
"x": 20.14,
"y": 10.9
},
{
"x": 22.49,
"y": 5.07
},
{
"x": 29.15,
"y": 7.46
},
{
"x": 28.79,
"y": 4.76
},
{
"x": 32.24,
"y": 4.72
},
{
"x": 32.32,
"y": 1.9
},
{
"x": 46.82,
"y": 0
},
{
"x": 48.7,
"y": 3.41
},
{
"x": 59.58,
"y": 4.88
},
{
"x": 56.76,
"y": 6.86
},
{
"x": 60.81,
"y": 12.94
},
{
"x": 54.69,
"y": 11.33
},
{
"x": 46.6,
"y": 15.28
},
{
"x": 49.78,
"y": 18.24
},
{
"x": 47.53,
"y": 19.48
},
{
"x": 48.39,
"y": 24.44
},
{
"x": 58.86,
"y": 30.4
},
{
"x": 62.72,
"y": 38.69
},
{
"x": 68.3,
"y": 43.12
},
{
"x": 80.05,
"y": 44.54
},
{
"x": 78.54,
"y": 48.51
},
{
"x": 95.72,
"y": 55.49
},
{
"x": 99.99,
"y": 59.9
},
{
"x": 98.92,
"y": 62.68
},
{
"x": 94.51,
"y": 58.64
},
{
"x": 87.06,
"y": 56.85
},
{
"x": 82.98,
"y": 63.04
},
{
"x": 88.6,
"y": 66.22
},
{
"x": 88.71,
"y": 70.06
},
{
"x": 83.79,
"y": 71.47
},
{
"x": 79.52,
"y": 78.87
},
{
"x": 76.22,
"y": 78.75
},
{
"x": 77.5,
"y": 72.75
},
{
"x": 80.72,
"y": 70.59
},
{
"x": 75.72,
"y": 60.43
},
{
"x": 72.67,
"y": 60.85
},
{
"x": 68.65,
"y": 55.32
},
{
"x": 64.96,
"y": 56.18
},
{
"x": 65.95,
"y": 54.68
},
{
"x": 62.49,
"y": 54.29
},
{
"x": 59.75,
"y": 50.3
},
{
"x": 54.07,
"y": 50.51
},
{
"x": 42.43,
"y": 41.44
},
{
"x": 37.8,
"y": 40.48
},
{
"x": 32.71,
"y": 35.74
},
{
"x": 29.27,
"y": 26.39
},
{
"x": 18.13,
"y": 22.88
},
{
"x": 7.55,
"y": 28.4
},
{
"x": 8.84,
"y": 25.09
},
{
"x": 3.11,
"y": 24.45
},
{
"x": 3.38,
"y": 19.47
},
{
"x": 0,
"y": 17.09
},
{
"x": 4.24,
"y": 15.75
},
{
"x": 1.5,
"y": 11.28
},
{
"x": 3.4,
"y": 10.04
},
{
"x": 3.52,
"y": 10
}
],
[
{
"x": 74.92,
"y": 75.74
},
{
"x": 71.25,
"y": 82.85
},
{
"x": 73.27,
"y": 86.87
},
{
"x": 71.27,
"y": 89.95
},
{
"x": 48.88,
"y": 80.1
},
{
"x": 51.44,
"y": 76.69
},
{
"x": 60.33,
"y": 78.58
},
{
"x": 74.78,
"y": 75.78
},
{
"x": 74.92,
"y": 75.74
}
],
[
{
"x": 26.77,
"y": 56.3
},
{
"x": 24.87,
"y": 68.44
},
{
"x": 20.24,
"y": 67.45
},
{
"x": 20.34,
"y": 69.76
},
{
"x": 17.11,
"y": 70.89
},
{
"x": 14.86,
"y": 67.81
},
{
"x": 16.39,
"y": 62.37
},
{
"x": 13.35,
"y": 52.79
},
{
"x": 16.1,
"y": 53.97
},
{
"x": 22.06,
"y": 50.21
},
{
"x": 26.72,
"y": 56.21
},
{
"x": 26.77,
"y": 56.3
}
],
[
{
"x": 32.23,
"y": 36.56
},
{
"x": 29.41,
"y": 37.32
},
{
"x": 32.19,
"y": 36.48
},
{
"x": 32.23,
"y": 36.56
}
]
]
}
}

View File

@ -0,0 +1,413 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "Japan",
"isoA2": "JP",
"isoA3": "JPN",
"continent": "Asia",
"subregion": "Eastern Asia"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": 122.93816165500004,
"maxLon": 153.98560631600003,
"minLat": 24.212103583000044,
"maxLat": 45.520412502000056
},
"rings": [
[
{
"x": 28.09,
"y": 61.21
},
{
"x": 24.86,
"y": 68.13
},
{
"x": 25.25,
"y": 64.81
},
{
"x": 24.63,
"y": 67.41
},
{
"x": 23.13,
"y": 66.23
},
{
"x": 24.7,
"y": 59.71
},
{
"x": 23.52,
"y": 57.87
},
{
"x": 21.91,
"y": 60.78
},
{
"x": 21.39,
"y": 57.02
},
{
"x": 25.99,
"y": 54.22
},
{
"x": 29.45,
"y": 59.02
},
{
"x": 28.15,
"y": 61.23
},
{
"x": 28.09,
"y": 61.21
}
],
[
{
"x": 37.85,
"y": 54.87
},
{
"x": 36.2,
"y": 57.65
},
{
"x": 33.35,
"y": 57.05
},
{
"x": 32.42,
"y": 60.11
},
{
"x": 29.22,
"y": 57.12
},
{
"x": 35.46,
"y": 52.3
},
{
"x": 37.85,
"y": 54.84
},
{
"x": 37.85,
"y": 54.87
}
],
[
{
"x": 33.77,
"y": 51.98
},
{
"x": 30.3,
"y": 52.43
},
{
"x": 29.37,
"y": 55.11
},
{
"x": 25.58,
"y": 54.36
},
{
"x": 32.7,
"y": 46.55
},
{
"x": 42.29,
"y": 46.27
},
{
"x": 44.59,
"y": 38.23
},
{
"x": 46.42,
"y": 37.61
},
{
"x": 46.25,
"y": 41.13
},
{
"x": 50.29,
"y": 38.21
},
{
"x": 54.94,
"y": 29.06
},
{
"x": 54.5,
"y": 23.05
},
{
"x": 56.06,
"y": 19.97
},
{
"x": 58.58,
"y": 21.81
},
{
"x": 57.85,
"y": 18.75
},
{
"x": 59.66,
"y": 19.2
},
{
"x": 61.58,
"y": 28.41
},
{
"x": 58.07,
"y": 34.49
},
{
"x": 56.17,
"y": 48.54
},
{
"x": 54.17,
"y": 49.58
},
{
"x": 54.2,
"y": 46.31
},
{
"x": 51.2,
"y": 51.27
},
{
"x": 51.1,
"y": 48.8
},
{
"x": 49.26,
"y": 51.27
},
{
"x": 45.34,
"y": 51.35
},
{
"x": 44.74,
"y": 49
},
{
"x": 44.96,
"y": 52.81
},
{
"x": 41.3,
"y": 56.72
},
{
"x": 39.04,
"y": 54.63
},
{
"x": 40.18,
"y": 50.82
},
{
"x": 33.74,
"y": 51.95
},
{
"x": 33.77,
"y": 51.98
}
],
[
{
"x": 73.53,
"y": 10.01
},
{
"x": 67.47,
"y": 12.56
},
{
"x": 65.39,
"y": 16.86
},
{
"x": 56.57,
"y": 13.8
},
{
"x": 58.82,
"y": 17.46
},
{
"x": 55.08,
"y": 19.14
},
{
"x": 54.45,
"y": 13.58
},
{
"x": 56.11,
"y": 10.3
},
{
"x": 59.54,
"y": 10.34
},
{
"x": 60.32,
"y": 0.33
},
{
"x": 66.96,
"y": 6.6
},
{
"x": 70.22,
"y": 7.54
},
{
"x": 72.16,
"y": 5.51
},
{
"x": 71.89,
"y": 10.29
},
{
"x": 73.52,
"y": 10.01
},
{
"x": 73.53,
"y": 10.01
}
],
[
{
"x": 17.39,
"y": 87.87
},
{
"x": 15.18,
"y": 91.21
},
{
"x": 17.37,
"y": 87.79
},
{
"x": 17.39,
"y": 87.87
}
],
[
{
"x": 21.8,
"y": 80.05
},
{
"x": 19.99,
"y": 81.05
},
{
"x": 21.77,
"y": 79.9
},
{
"x": 21.8,
"y": 80.05
}
],
[
{
"x": 26.13,
"y": 68.89
},
{
"x": 25.55,
"y": 71.22
},
{
"x": 26.11,
"y": 68.91
},
{
"x": 26.13,
"y": 68.89
}
],
[
{
"x": 23.26,
"y": 60.89
},
{
"x": 22.73,
"y": 62.56
},
{
"x": 23.2,
"y": 60.88
},
{
"x": 23.26,
"y": 60.89
}
],
[
{
"x": 38.86,
"y": 51.21
},
{
"x": 37.98,
"y": 53.17
},
{
"x": 38.79,
"y": 51.24
},
{
"x": 38.86,
"y": 51.21
}
],
[
{
"x": 20.98,
"y": 51.16
},
{
"x": 20.63,
"y": 52.66
},
{
"x": 21.01,
"y": 51.15
},
{
"x": 20.98,
"y": 51.16
}
]
]
}
}

View File

@ -0,0 +1,423 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "Norway",
"isoA2": "-99",
"isoA3": "-99",
"continent": "Europe",
"subregion": "Northern Europe"
},
"outline": {
"type": "MultiPolygon",
"bounds": {
"minLon": -9.11742102799991,
"maxLon": 33.64039147200009,
"minLat": -54.46249765399995,
"maxLat": 80.77008698100008
},
"rings": [
[
{
"x": 69.56,
"y": 8.68
},
{
"x": 49.79,
"y": 12.7
},
{
"x": 51.47,
"y": 14.36
},
{
"x": 48.48,
"y": 16.18
},
{
"x": 36.8,
"y": 16.79
},
{
"x": 33.44,
"y": 15.72
},
{
"x": 37.94,
"y": 14.98
},
{
"x": 32.85,
"y": 14.77
},
{
"x": 63.79,
"y": 8.36
},
{
"x": 94,
"y": 7.75
},
{
"x": 69.77,
"y": 8.63
},
{
"x": 69.56,
"y": 8.68
}
],
[
{
"x": 42.7,
"y": 12.72
},
{
"x": 40.68,
"y": 12.8
},
{
"x": 42.67,
"y": 12.72
},
{
"x": 42.7,
"y": 12.72
}
],
[
{
"x": 59.98,
"y": 8.91
},
{
"x": 56.37,
"y": 9.24
},
{
"x": 59.99,
"y": 8.9
},
{
"x": 59.98,
"y": 8.91
}
],
[
{
"x": 54.99,
"y": 8.95
},
{
"x": 57.33,
"y": 8.9
},
{
"x": 55.02,
"y": 8.95
},
{
"x": 54.99,
"y": 8.95
}
],
[
{
"x": 63.59,
"y": 8.38
},
{
"x": 60.55,
"y": 8.64
},
{
"x": 63.53,
"y": 8.38
},
{
"x": 63.59,
"y": 8.38
}
],
[
{
"x": 65.76,
"y": 8.09
},
{
"x": 63.41,
"y": 8.27
},
{
"x": 65.73,
"y": 8.09
},
{
"x": 65.76,
"y": 8.09
}
],
[
{
"x": 67.21,
"y": 7.95
},
{
"x": 65.13,
"y": 8
},
{
"x": 67.18,
"y": 7.96
},
{
"x": 67.21,
"y": 7.95
}
],
[
{
"x": 76.65,
"y": 7.59
},
{
"x": 74.77,
"y": 7.66
},
{
"x": 76.6,
"y": 7.59
},
{
"x": 76.65,
"y": 7.59
}
],
[
{
"x": 73.76,
"y": 7.59
},
{
"x": 76.25,
"y": 7.37
},
{
"x": 73.78,
"y": 7.59
},
{
"x": 73.76,
"y": 7.59
}
],
[
{
"x": 82.45,
"y": 7.2
},
{
"x": 80.48,
"y": 7.21
},
{
"x": 82.4,
"y": 7.2
},
{
"x": 82.45,
"y": 7.2
}
],
[
{
"x": 2.7,
"y": 7.1
},
{
"x": 0,
"y": 7.32
},
{
"x": 2.65,
"y": 7.09
},
{
"x": 2.7,
"y": 7.1
}
],
[
{
"x": 78.45,
"y": 2.18
},
{
"x": 70.04,
"y": 2.39
},
{
"x": 78.4,
"y": 2.15
},
{
"x": 78.45,
"y": 2.18
}
],
[
{
"x": 70.49,
"y": 1.89
},
{
"x": 68.46,
"y": 1.7
},
{
"x": 73.41,
"y": 1.85
},
{
"x": 70.47,
"y": 1.89
},
{
"x": 70.49,
"y": 1.89
}
],
[
{
"x": 49.72,
"y": 1.87
},
{
"x": 45.84,
"y": 1.39
},
{
"x": 49.7,
"y": 1.86
},
{
"x": 49.72,
"y": 1.87
}
],
[
{
"x": 90.17,
"y": 1.38
},
{
"x": 86.44,
"y": 1.42
},
{
"x": 89.3,
"y": 1.38
},
{
"x": 90.17,
"y": 1.38
}
],
[
{
"x": 68.33,
"y": 1.22
},
{
"x": 70.04,
"y": 1.27
},
{
"x": 68.35,
"y": 1.22
},
{
"x": 68.33,
"y": 1.22
}
],
[
{
"x": 68.59,
"y": 1.58
},
{
"x": 59.49,
"y": 3.1
},
{
"x": 53.86,
"y": 2.39
},
{
"x": 61.37,
"y": 2.21
},
{
"x": 53.11,
"y": 2.01
},
{
"x": 61.78,
"y": 1.73
},
{
"x": 46.29,
"y": 0.91
},
{
"x": 71.73,
"y": 1.48
},
{
"x": 68.61,
"y": 1.57
},
{
"x": 68.59,
"y": 1.58
}
],
[
{
"x": 98.73,
"y": 0.4
},
{
"x": 94.94,
"y": 0.49
},
{
"x": 98.68,
"y": 0.41
},
{
"x": 98.73,
"y": 0.4
}
],
[
{
"x": 84.87,
"y": 0.52
},
{
"x": 62.91,
"y": 0.47
},
{
"x": 85.03,
"y": 0.5
},
{
"x": 84.87,
"y": 0.52
}
]
]
}
}

View File

@ -0,0 +1,327 @@
{
"source": "ne_10m_admin_0_countries.shp",
"country": {
"name": "Switzerland",
"isoA2": "CH",
"isoA3": "CHE",
"continent": "Europe",
"subregion": "Western Europe"
},
"outline": {
"type": "Polygon",
"bounds": {
"minLon": 5.954809204000128,
"maxLon": 10.466626831000013,
"minLat": 45.82071848599999,
"maxLat": 47.801166077000076
},
"rings": [
[
{
"x": 99.72,
"y": 47.3
},
{
"x": 97.84,
"y": 57
},
{
"x": 99.5,
"y": 63.8
},
{
"x": 96.2,
"y": 63.12
},
{
"x": 93.92,
"y": 59.3
},
{
"x": 90.38,
"y": 64.04
},
{
"x": 90.24,
"y": 68.41
},
{
"x": 92.78,
"y": 70.6
},
{
"x": 92.27,
"y": 79.28
},
{
"x": 90.6,
"y": 79.81
},
{
"x": 87.85,
"y": 72.21
},
{
"x": 83.45,
"y": 73.23
},
{
"x": 82.44,
"y": 76.21
},
{
"x": 79.38,
"y": 75.87
},
{
"x": 77.13,
"y": 65.79
},
{
"x": 73.33,
"y": 66.45
},
{
"x": 72.48,
"y": 79.27
},
{
"x": 67.44,
"y": 89.54
},
{
"x": 67.55,
"y": 100
},
{
"x": 65.28,
"y": 99.71
},
{
"x": 64.63,
"y": 93.62
},
{
"x": 62.35,
"y": 91.8
},
{
"x": 63.26,
"y": 86.42
},
{
"x": 58.67,
"y": 84.75
},
{
"x": 55.04,
"y": 79.06
},
{
"x": 54.18,
"y": 68.12
},
{
"x": 47.27,
"y": 77.22
},
{
"x": 47.78,
"y": 84.54
},
{
"x": 41.59,
"y": 95.27
},
{
"x": 35.16,
"y": 91.75
},
{
"x": 31.18,
"y": 95.6
},
{
"x": 24.65,
"y": 96.49
},
{
"x": 18.16,
"y": 84.14
},
{
"x": 18.45,
"y": 70.03
},
{
"x": 14.6,
"y": 67.93
},
{
"x": 7.69,
"y": 71.03
},
{
"x": 5.75,
"y": 75.02
},
{
"x": 7.23,
"y": 78.83
},
{
"x": 3.39,
"y": 83.95
},
{
"x": 0.09,
"y": 84.36
},
{
"x": 4.02,
"y": 72.8
},
{
"x": 2.2,
"y": 69.77
},
{
"x": 3.63,
"y": 61.49
},
{
"x": 10.51,
"y": 52.53
},
{
"x": 10.81,
"y": 43.27
},
{
"x": 15.75,
"y": 39.38
},
{
"x": 23.98,
"y": 23.82
},
{
"x": 23.25,
"y": 21.86
},
{
"x": 20.21,
"y": 22.57
},
{
"x": 22.57,
"y": 15.76
},
{
"x": 27.17,
"y": 15.8
},
{
"x": 28.44,
"y": 19.41
},
{
"x": 32.17,
"y": 18.33
},
{
"x": 37.28,
"y": 10.41
},
{
"x": 38.31,
"y": 12.97
},
{
"x": 41.33,
"y": 10.39
},
{
"x": 46.27,
"y": 12.15
},
{
"x": 50.49,
"y": 9.05
},
{
"x": 57.76,
"y": 10.69
},
{
"x": 58.79,
"y": 7.32
},
{
"x": 54,
"y": 6.85
},
{
"x": 57.7,
"y": 0
},
{
"x": 61.14,
"y": 2.21
},
{
"x": 61.22,
"y": 5.38
},
{
"x": 63.01,
"y": 4.1
},
{
"x": 65.41,
"y": 7.54
},
{
"x": 71.56,
"y": 6.6
},
{
"x": 79.63,
"y": 13.46
},
{
"x": 81.89,
"y": 19.77
},
{
"x": 78.07,
"y": 37.23
},
{
"x": 86.51,
"y": 39.67
},
{
"x": 86.89,
"y": 44.12
},
{
"x": 92.12,
"y": 48.17
},
{
"x": 97.93,
"y": 40.64
},
{
"x": 99.66,
"y": 46.22
},
{
"x": 99.72,
"y": 47.3
}
]
]
}
}

View File

@ -8,7 +8,6 @@
"name": "fs2026-frontend",
"version": "1.0.0",
"license": "ISC",
"type": "module",
"devDependencies": {
"@biomejs/biome": "2.3.14"
}

View File

@ -7,7 +7,6 @@
"type": "module",
"main": "index.js",
"scripts": {
"convert:geojson": "node scripts/tools/convert-geojson-outlines.js",
"format": "biome format --write",
"lint": "biome lint",
"lint:fix": "biome lint --write"

View File

@ -0,0 +1,379 @@
#!/usr/bin/env node
import { mkdir, readdir, writeFile } from "node:fs/promises";
import path from "node:path";
import shapefile from "shapefile";
const DEFAULT_TOLERANCE = 1.5;
const SHAPEFILE_BASENAME = "ne_10m_admin_0_countries";
const GAME_COUNTRIES = [
"Switzerland",
"Norway",
"Italy",
"Japan",
"Brazil",
"Australia",
"France",
"India",
"Canada",
"Germany",
];
function usage() {
return `Usage:
node convert-geojson-outlines.js <input-dir> <output-dir> [options]
Options:
--tolerance <number> Douglas-Peucker tolerance in 0..100 units. Default: 1.5
--max-points <number> Simplify each ring until it has at most this many points.
--include-holes Include inner rings from Polygon/MultiPolygon geometries.
--pretty Write indented JSON instead of compact JSON.
`;
}
function parseArgs(argv) {
const positionals = [];
const options = {
tolerance: DEFAULT_TOLERANCE,
maxPoints: null,
includeHoles: false,
pretty: false,
};
for (let i = 0; i < argv.length; i++) {
const arg = argv[i];
if (arg === "--tolerance") {
options.tolerance = Number(argv[++i]);
} else if (arg === "--max-points") {
options.maxPoints = Number(argv[++i]);
} else if (arg === "--include-holes") {
options.includeHoles = true;
} else if (arg === "--pretty") {
options.pretty = true;
} else if (arg === "--help" || arg === "-h") {
console.log(usage());
process.exit(0);
} else {
positionals.push(arg);
}
}
if (positionals.length !== 2) {
throw new Error("Expected exactly <input-dir> and <output-dir>.");
}
if (!Number.isFinite(options.tolerance) || options.tolerance < 0) {
throw new Error("--tolerance must be a number greater than or equal to 0.");
}
if (
options.maxPoints !== null &&
(!Number.isInteger(options.maxPoints) || options.maxPoints < 4)
) {
throw new Error("--max-points must be an integer greater than or equal to 4.");
}
return {
inputDir: positionals[0],
outputDir: positionals[1],
options,
};
}
function stripNulls(value) {
return typeof value === "string" ? value.replaceAll("\0", "").trim() : value;
}
function cleanProperties(properties) {
return Object.fromEntries(
Object.entries(properties || {}).map(([key, value]) => [key, stripNulls(value)]),
);
}
function getCountryName(properties) {
return (
properties.NAME_EN ||
properties.NAME_LONG ||
properties.NAME ||
properties.ADMIN ||
properties.SOVEREIGNT ||
""
);
}
function slugify(value) {
return value
.toLowerCase()
.replaceAll(/[^a-z0-9]+/g, "-")
.replaceAll(/(^-|-$)/g, "");
}
function extractRings(geometry, includeHoles) {
if (geometry.type === "Polygon") {
return includeHoles
? geometry.coordinates
: [geometry.coordinates?.[0]].filter(Boolean);
}
if (geometry.type === "MultiPolygon") {
return geometry.coordinates.flatMap((polygon) =>
includeHoles ? polygon : [polygon?.[0]].filter(Boolean),
);
}
return [];
}
function isValidCoordinate(coord) {
return (
Array.isArray(coord) &&
coord.length >= 2 &&
Number.isFinite(coord[0]) &&
Number.isFinite(coord[1])
);
}
function cleanRing(ring) {
if (!Array.isArray(ring)) return [];
return ring.filter(isValidCoordinate).map(([lon, lat]) => [lon, lat]);
}
function getBounds(rings) {
let minLon = Infinity;
let maxLon = -Infinity;
let minLat = Infinity;
let maxLat = -Infinity;
for (const ring of rings) {
for (const [lon, lat] of ring) {
minLon = Math.min(minLon, lon);
maxLon = Math.max(maxLon, lon);
minLat = Math.min(minLat, lat);
maxLat = Math.max(maxLat, lat);
}
}
if (![minLon, maxLon, minLat, maxLat].every(Number.isFinite)) {
throw new Error("Could not calculate bounds from geometry.");
}
return { minLon, maxLon, minLat, maxLat };
}
function roundCoord(value) {
return Math.round(value * 100) / 100;
}
function normalizePoint([lon, lat], bounds) {
const lonSpan = bounds.maxLon - bounds.minLon;
const latSpan = bounds.maxLat - bounds.minLat;
return {
x: roundCoord(lonSpan === 0 ? 50 : ((lon - bounds.minLon) / lonSpan) * 100),
y: roundCoord(
latSpan === 0 ? 50 : (1 - (lat - bounds.minLat) / latSpan) * 100,
),
};
}
function samePoint(a, b) {
return a.x === b.x && a.y === b.y;
}
function closeRing(points) {
if (points.length < 2) return points;
const first = points[0];
const last = points[points.length - 1];
return samePoint(first, last) ? points : [...points, { ...first }];
}
function openRing(points) {
if (points.length < 2) return points;
const first = points[0];
const last = points[points.length - 1];
return samePoint(first, last) ? points.slice(0, -1) : points;
}
function squaredDistanceToSegment(point, start, end) {
const dx = end.x - start.x;
const dy = end.y - start.y;
if (dx === 0 && dy === 0) {
return (point.x - start.x) ** 2 + (point.y - start.y) ** 2;
}
const t = Math.max(
0,
Math.min(
1,
((point.x - start.x) * dx + (point.y - start.y) * dy) / (dx * dx + dy * dy),
),
);
const projection = {
x: start.x + t * dx,
y: start.y + t * dy,
};
return (point.x - projection.x) ** 2 + (point.y - projection.y) ** 2;
}
function douglasPeucker(points, tolerance) {
if (points.length <= 2 || tolerance === 0) return points;
let maxDistance = 0;
let splitIndex = 0;
const lastIndex = points.length - 1;
for (let i = 1; i < lastIndex; i++) {
const distance = squaredDistanceToSegment(points[i], points[0], points[lastIndex]);
if (distance > maxDistance) {
maxDistance = distance;
splitIndex = i;
}
}
if (maxDistance <= tolerance * tolerance) {
return [points[0], points[lastIndex]];
}
const left = douglasPeucker(points.slice(0, splitIndex + 1), tolerance);
const right = douglasPeucker(points.slice(splitIndex), tolerance);
return [...left.slice(0, -1), ...right];
}
function simplifyRing(points, initialTolerance, maxPoints) {
let tolerance = initialTolerance;
let simplified = closeRing(douglasPeucker(openRing(points), tolerance));
let attempts = 0;
while (maxPoints && simplified.length > maxPoints && attempts < 30) {
tolerance = tolerance === 0 ? 0.5 : tolerance * 1.25;
simplified = closeRing(douglasPeucker(openRing(points), tolerance));
attempts++;
}
return simplified;
}
function normalizeGeometry(geometry, options) {
if (!geometry || !["Polygon", "MultiPolygon"].includes(geometry.type)) {
throw new Error("No Polygon or MultiPolygon geometry found.");
}
const rings = extractRings(geometry, options.includeHoles)
.map(cleanRing)
.filter((ring) => ring.length >= 4);
if (!rings.length) {
throw new Error("No valid polygon rings found.");
}
const bounds = getBounds(rings);
const normalizedRings = rings
.map((ring) => ring.map((point) => normalizePoint(point, bounds)))
.map(closeRing)
.map((ring) => simplifyRing(ring, options.tolerance, options.maxPoints))
.filter((ring) => ring.length >= 4);
if (!normalizedRings.length) {
throw new Error("No valid rings remained after simplification.");
}
return {
type: geometry.type,
bounds,
rings: normalizedRings,
};
}
async function findShapefile(inputDir) {
const entries = await readdir(inputDir, { withFileTypes: true });
const shpFiles = entries
.filter((entry) => entry.isFile() && path.extname(entry.name).toLowerCase() === ".shp")
.map((entry) => entry.name)
.sort((a, b) => a.localeCompare(b));
const preferred = shpFiles.find(
(fileName) => path.basename(fileName, ".shp") === SHAPEFILE_BASENAME,
);
const fileName = preferred || shpFiles[0];
if (!fileName) {
throw new Error(`No .shp file found in ${inputDir}.`);
}
return path.join(inputDir, fileName);
}
async function readTargetFeatures(shpPath, targets) {
const source = await shapefile.open(shpPath, undefined, { encoding: "utf-8" });
const features = new Map();
while (true) {
const result = await source.read();
if (result.done) break;
const feature = result.value;
const properties = cleanProperties(feature.properties);
const countryName = getCountryName(properties);
if (targets.has(countryName)) {
features.set(countryName, {
geometry: feature.geometry,
properties,
});
}
}
return features;
}
async function writeCountryOutline(outputDir, countryName, feature, sourceFile, options) {
const output = {
source: sourceFile,
country: {
name: countryName,
isoA2: feature.properties.ISO_A2,
isoA3: feature.properties.ISO_A3,
continent: feature.properties.CONTINENT,
subregion: feature.properties.SUBREGION,
},
outline: normalizeGeometry(feature.geometry, options),
};
const fileName = `${slugify(countryName)}.json`;
const json = JSON.stringify(output, null, options.pretty ? 2 : 0);
await writeFile(path.join(outputDir, fileName), `${json}\n`, "utf8");
console.log(`Converted ${countryName} -> ${fileName}`);
}
async function main() {
const { inputDir, outputDir, options } = parseArgs(process.argv.slice(2));
const shpPath = await findShapefile(inputDir);
const sourceFile = path.basename(shpPath);
const targets = new Set(GAME_COUNTRIES);
const features = await readTargetFeatures(shpPath, targets);
const missing = GAME_COUNTRIES.filter((countryName) => !features.has(countryName));
if (missing.length) {
throw new Error(`Missing country feature(s): ${missing.join(", ")}`);
}
await mkdir(outputDir, { recursive: true });
for (const countryName of GAME_COUNTRIES) {
await writeCountryOutline(
outputDir,
countryName,
features.get(countryName),
sourceFile,
options,
);
}
console.log(`Done. Converted ${GAME_COUNTRIES.length} country outline(s).`);
}
main().catch((error) => {
console.error(error instanceof Error ? error.message : error);
console.error(usage());
process.exit(1);
});

View File

@ -0,0 +1,486 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Natural Earth &raquo; Blog Archive &raquo; Admin 0 &#8211; Countries - Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales </title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link rel="alternate" type="application/rss+xml" title="Natural Earth RSS Feed" href="https://www.naturalearthdata.com/feed/" />
<link rel="pingback" href="http://www.naturalearthdata.com/xmlrpc.php" />
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/suckerfish.js"></script>
<!--[if lt IE 7]>
<script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE7.js" type="text/javascript"></script>
<script defer="defer" type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/pngfix.js"></script>
<![endif]-->
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/themes/NEV/style.css" type="text/css" media="screen" />
<link rel='dns-prefetch' href='//s.w.org' />
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"http:\/\/www.naturalearthdata.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.5.9"}};
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([55357,56424,8205,55356,57212],[55357,56424,8203,55356,57212])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='http://www.naturalearthdata.com/wp-includes/css/dist/block-library/style.min.css?ver=5.5.9' type='text/css' media='all' />
<link rel='stylesheet' id='bbp-child-bbpress-css' href='http://www.naturalearthdata.com/wp-content/themes/NEV/css/bbpress.css?ver=2.6.6' type='text/css' media='screen' />
<link rel="https://api.w.org/" href="https://www.naturalearthdata.com/wp-json/" /><link rel="alternate" type="application/json" href="https://www.naturalearthdata.com/wp-json/wp/v2/posts/74" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.naturalearthdata.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.naturalearthdata.com/wp-includes/wlwmanifest.xml" />
<link rel='prev' title='Admin 0 &#8211; Countries point-of-views' href='https://www.naturalearthdata.com/blog/admin-0-countries-point-of-views/' />
<link rel='next' title='Ocean' href='https://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-ocean/' />
<meta name="generator" content="WordPress 5.5.9" />
<link rel="canonical" href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/" />
<link rel='shortlink' href='https://www.naturalearthdata.com/?p=74' />
<link rel="alternate" type="application/json+oembed" href="https://www.naturalearthdata.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F10m-cultural-vectors%2F10m-admin-0-countries%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://www.naturalearthdata.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F10m-cultural-vectors%2F10m-admin-0-countries%2F&#038;format=xml" />
<script type="text/javascript">
/* <![CDATA[ */
var ajaxurl = 'https://www.naturalearthdata.com/wp-admin/admin-ajax.php';
/* ]]> */
</script>
<!-- begin gallery scripts -->
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css.php" type="text/css" media="screen" charset="utf-8"/>
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css" type="text/css" media="screen" charset="utf-8"/>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/mootools.v1.11.js"></script>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.js.php"></script>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.transitions.js"></script>
<!-- end gallery scripts -->
<link href="http://www.naturalearthdata.com/wp-content/themes/NEV/css/default.css" rel="stylesheet" type="text/css" />
<style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style><!--[if lte IE 7]>
<link rel="stylesheet" type="text/css" href="http://www.naturalearthdata.com/wp-content/themes/NEV/ie.css" />
<![endif]-->
<script src="http://www.naturalearthdata.com/wp-content/themes/NEV/js/jquery-1.2.6.min.js" type="text/javascript" charset="utf-8"></script>
<script>
jQuery.noConflict();
</script>
<script type="text/javascript" charset="utf-8">
$(function(){
var tabContainers = $('div#maintabdiv > div');
tabContainers.hide().filter('#comments').show();
$('div#maintabdiv ul#tabnav a').click(function () {
tabContainers.hide();
tabContainers.filter(this.hash).show();
$('div#maintabdiv ul#tabnav a').removeClass('current');
$(this).addClass('current');
return false;
}).filter('#comments').click();
});
</script>
<script type="text/javascript" language="javascript" src="http://www.naturalearthdata.com/dataTables/media/js/jquery.dataTables.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
$('#ne_table').dataTable();
} );
</script>
</head>
<body>
<div id="page">
<div id="header">
<div id="headerimg">
<h1><a href="https://www.naturalearthdata.com/"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nev_logo.png" alt="Natural Earth title="Natural Earth" /></a></h1>
<div class="description">Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales</div>
<div class="header_search"><form method="get" id="searchform" action="https://www.naturalearthdata.com/">
<label class="hidden" for="s">Search for:</label>
<div><input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
</div>
<!--<div class="translate_panel" style="align:top; margin-left:650px; top:50px;">
<div id="google_translate_element" style="float:left;"></div>
<script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'en'
}, 'google_translate_element');
}
</script>
<script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
</div>-->
</div>
</div>
<div id="pagemenu" style="align:bottom;">
<ul id="page-list" class="clearfix"><li class="page_item page-item-4"><a href="https://www.naturalearthdata.com/">Home</a></li>
<li class="page_item page-item-10"><a href="https://www.naturalearthdata.com/features/">Features</a></li>
<li class="page_item page-item-12 page_item_has_children"><a href="https://www.naturalearthdata.com/downloads/">Downloads</a></li>
<li class="page_item page-item-6 current_page_parent"><a href="https://www.naturalearthdata.com/blog/">Blog</a></li>
<li class="page_item page-item-5044"><a href="https://www.naturalearthdata.com/issues/">Issues</a></li>
<li class="page_item page-item-366"><a href="https://www.naturalearthdata.com/corrections/">Corrections</a></li>
<li class="page_item page-item-16 page_item_has_children"><a href="https://www.naturalearthdata.com/about/">About</a></li>
</ul>
</div>
<hr /><div id="main">
<div id="content" class="narrowcolumn">
<div class="post" id="post-74">
<h2>Admin 0 &#8211; Countries</h2>
<div class="entry">
<div class="downloadPromoBlock">
<div style="float: left; width: 170px;"><img loading="lazy" class="alignleft size-thumbnail wp-image-92" title="home_image_3" src="https://www.naturalearthdata.com/wp-content/uploads/2009/09/thumb_countries.png" alt="countries_thumb" width="150" height="97"></div>
<div style="float: left; width: 410px;"><em>There are <b>258 countries</b> in the world. Greenland as separate from Denmark. Most users will want this file instead of sovereign states, though some users will want map units instead when needing to distinguish overseas regions of France.</em></div>
<div style="float: left; width: 410px;">
<p><em>Natural Earth shows <a href="https://www.naturalearthdata.com/about/disputed-boundaries-policy/"><b>de facto</b></a> boundaries by default according to who controls the territory, versus <i>de jure</i>. Optional point-of-view (POV) variants are available for several dozen countries in the next section.</em>&nbsp;</p>
<div class="download-link-div">
<a class="download-link" rel="nofollow" title="Downloaded 516715 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip');" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip">Download countries</a> <span class="download-link-span">(4.7 MB) version 5.1.1</span>
</div>
<div class="download-link-div">
<a class="download-link" rel="nofollow" title="Downloaded 4769876 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries_lakes.zip');" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries_lakes.zip">Download without boundary lakes</a> <span class="download-link-span">(4.87 MB) version 5.1.1</span>
</div>
<p><span id="more-74"></span></p>
</div>
</div>
<div class="downloadMainBlock">
<p><strong>About</strong></p>
<p>Countries distinguish between metropolitan (homeland) and independent and&nbsp;semi-independent portions of sovereign states. If you want to see the dependent overseas regions broken out (like in ISO codes, see France for example), use <a href="https://www.naturalearthdata.com/downloads/10m-political-vectors/10m-admin-0-details/">map units</a> instead.</p>
<p>Each country is coded with a world region that roughly follows the <a href="http://unstats.un.org/unsd/methods/m49/m49regin.htm">United Nations setup</a>.</p>
<p>Countries are coded with standard ISO and FIPS codes. French <a href="http://en.wikipedia.org/wiki/INSEE">INSEE codes</a> are also included.</p>
<p>Includes some thematic data from the United Nations (<a href="http://data.un.org/DataMartInfo.aspx">1</a>), U.S. Central Intelligence Agency, and elsewhere.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1896" title="countries_banner" src="https://www.naturalearthdata.com/wp-content/uploads/2009/09/banner_countries.png" alt="countries_banner" width="580" height="150"></p>
<p><strong>Disclaimer</strong></p>
<p>Natural Earth Vector draws boundaries of countries according to defacto status. We show who actually controls the situation on the ground. Please feel free to mashup our <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-breakaway-disputed-areas/">disputed area themes</a> to match your particular political outlook.</p>
<p><strong>Known Problems</strong></p>
<p>None.</p>
<p><strong>Version History</strong></p>
<ul>
<li>
<a rel="nofollow" title="Download version 5.1.1 of ne_10m_admin_0_countries.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip">5.1.1</a>
</li>
<li>
<a rel="nofollow" title="Download version 5.1.0 of ne_10m_admin_0_countries.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip?version=5.1.0">5.1.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 5.0.1 of ne_10m_admin_0_countries.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip?version=5.0.1">5.0.1</a>
</li>
<li>
<a rel="nofollow" title="Download version 5.0.0 of ne_10m_admin_0_countries.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip?version=5.0.0">5.0.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 4.1.0 of ne_10m_admin_0_countries.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip?version=4.1.0">4.1.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 4.0.0 of ne_10m_admin_0_countries.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip?version=4.0.0">4.0.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 3.1.0 of ne_10m_admin_0_countries.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip?version=3.1.0">3.1.0</a>
</li>
<li>
3.0.0
</li>
<li>
2.0.0
</li>
<li>
1.4.0
</li>
</ul>
<p><a href="https://github.com/nvkelso/natural-earth-vector/blob/master/CHANGELOG">The master changelog is available on Github »</a></p>
</div>
<p class="postmetadata2">
<small>
This entry was posted
on Friday, September 25th, 2009 at 2:13 am and is filed under <a href="https://www.naturalearthdata.com/download/downloads/10m-cultural-vectors/" rel="category tag">10m-cultural-vectors</a>, <a href="https://www.naturalearthdata.com/download/downloads/featured-on-homepage/" rel="category tag">Featured on Homepage</a>.
You can follow any responses to this entry through the <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/feed/">RSS 2.0</a> feed.
Both comments and pings are currently closed.
</small>
</p>
</div>
</div>
<!-- You can start editing here. -->
<!-- If comments are closed. -->
<p class="nocomments">Comments are closed.</p>
</div>
<div id="sidebar">
<ul>
<li id="rssfeeds">Subscribe: <a href="https://www.naturalearthdata.com/feed/">Entries</a> | <a href="https://www.naturalearthdata.com/comments/feed/">Comments</a></li>
<li id="search-3" class="widget widget_search"><h2 class="widgettitle">Search</h2>
<form method="get" id="searchform" action="https://www.naturalearthdata.com/">
<label class="hidden" for="s">Search for:</label>
<div><input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
</li>
<li id="linkcat-2" class="widget widget_links"><h2 class="widgettitle">Links</h2>
<ul class='xoxo blogroll'>
<li><a href="http://www.nacis.org">NACIS</a></li>
</ul>
</li>
<li id="tag_cloud-3" class="widget widget_tag_cloud"><h2 class="widgettitle">Tags</h2>
<div class="tagcloud"><a href="https://www.naturalearthdata.com/tag/10m/" class="tag-cloud-link tag-link-65 tag-link-position-1" style="font-size: 16.4pt;" aria-label="10m (2 items)">10m</a>
<a href="https://www.naturalearthdata.com/tag/50m/" class="tag-cloud-link tag-link-64 tag-link-position-2" style="font-size: 8pt;" aria-label="50m (1 item)">50m</a>
<a href="https://www.naturalearthdata.com/tag/90/" class="tag-cloud-link tag-link-61 tag-link-position-3" style="font-size: 8pt;" aria-label="90 (1 item)">90</a>
<a href="https://www.naturalearthdata.com/tag/180/" class="tag-cloud-link tag-link-60 tag-link-position-4" style="font-size: 8pt;" aria-label="180 (1 item)">180</a>
<a href="https://www.naturalearthdata.com/tag/admin-0/" class="tag-cloud-link tag-link-40 tag-link-position-5" style="font-size: 8pt;" aria-label="admin-0 (1 item)">admin-0</a>
<a href="https://www.naturalearthdata.com/tag/bjorn/" class="tag-cloud-link tag-link-46 tag-link-position-6" style="font-size: 8pt;" aria-label="bjorn (1 item)">bjorn</a>
<a href="https://www.naturalearthdata.com/tag/bounding-box/" class="tag-cloud-link tag-link-68 tag-link-position-7" style="font-size: 8pt;" aria-label="bounding box (1 item)">bounding box</a>
<a href="https://www.naturalearthdata.com/tag/browser/" class="tag-cloud-link tag-link-47 tag-link-position-8" style="font-size: 8pt;" aria-label="browser (1 item)">browser</a>
<a href="https://www.naturalearthdata.com/tag/change-log/" class="tag-cloud-link tag-link-74 tag-link-position-9" style="font-size: 8pt;" aria-label="change log (1 item)">change log</a>
<a href="https://www.naturalearthdata.com/tag/corrections/" class="tag-cloud-link tag-link-34 tag-link-position-10" style="font-size: 8pt;" aria-label="corrections (1 item)">corrections</a>
<a href="https://www.naturalearthdata.com/tag/countries/" class="tag-cloud-link tag-link-41 tag-link-position-11" style="font-size: 8pt;" aria-label="countries (1 item)">countries</a>
<a href="https://www.naturalearthdata.com/tag/downloads/" class="tag-cloud-link tag-link-432 tag-link-position-12" style="font-size: 8pt;" aria-label="Downloads (1 item)">Downloads</a>
<a href="https://www.naturalearthdata.com/tag/error/" class="tag-cloud-link tag-link-67 tag-link-position-13" style="font-size: 8pt;" aria-label="error (1 item)">error</a>
<a href="https://www.naturalearthdata.com/tag/extent/" class="tag-cloud-link tag-link-69 tag-link-position-14" style="font-size: 8pt;" aria-label="extent (1 item)">extent</a>
<a href="https://www.naturalearthdata.com/tag/ext-js/" class="tag-cloud-link tag-link-56 tag-link-position-15" style="font-size: 8pt;" aria-label="ext js (1 item)">ext js</a>
<a href="https://www.naturalearthdata.com/tag/forums/" class="tag-cloud-link tag-link-35 tag-link-position-16" style="font-size: 8pt;" aria-label="forums (1 item)">forums</a>
<a href="https://www.naturalearthdata.com/tag/geoext/" class="tag-cloud-link tag-link-57 tag-link-position-17" style="font-size: 8pt;" aria-label="geoext (1 item)">geoext</a>
<a href="https://www.naturalearthdata.com/tag/hans/" class="tag-cloud-link tag-link-63 tag-link-position-18" style="font-size: 8pt;" aria-label="hans (1 item)">hans</a>
<a href="https://www.naturalearthdata.com/tag/imagery/" class="tag-cloud-link tag-link-59 tag-link-position-19" style="font-size: 8pt;" aria-label="imagery (1 item)">imagery</a>
<a href="https://www.naturalearthdata.com/tag/import/" class="tag-cloud-link tag-link-66 tag-link-position-20" style="font-size: 8pt;" aria-label="import (1 item)">import</a>
<a href="https://www.naturalearthdata.com/tag/mapnik/" class="tag-cloud-link tag-link-53 tag-link-position-21" style="font-size: 8pt;" aria-label="mapnik (1 item)">mapnik</a>
<a href="https://www.naturalearthdata.com/tag/maptiler/" class="tag-cloud-link tag-link-51 tag-link-position-22" style="font-size: 8pt;" aria-label="maptiler (1 item)">maptiler</a>
<a href="https://www.naturalearthdata.com/tag/map-tiles/" class="tag-cloud-link tag-link-49 tag-link-position-23" style="font-size: 8pt;" aria-label="map tiles (1 item)">map tiles</a>
<a href="https://www.naturalearthdata.com/tag/marine-boundary/" class="tag-cloud-link tag-link-76 tag-link-position-24" style="font-size: 8pt;" aria-label="marine boundary (1 item)">marine boundary</a>
<a href="https://www.naturalearthdata.com/tag/national-parks/" class="tag-cloud-link tag-link-75 tag-link-position-25" style="font-size: 8pt;" aria-label="national parks (1 item)">national parks</a>
<a href="https://www.naturalearthdata.com/tag/new-data/" class="tag-cloud-link tag-link-36 tag-link-position-26" style="font-size: 8pt;" aria-label="new data (1 item)">new data</a>
<a href="https://www.naturalearthdata.com/tag/nsd/" class="tag-cloud-link tag-link-72 tag-link-position-27" style="font-size: 8pt;" aria-label="nsd (1 item)">nsd</a>
<a href="https://www.naturalearthdata.com/tag/openlayers/" class="tag-cloud-link tag-link-55 tag-link-position-28" style="font-size: 8pt;" aria-label="openlayers (1 item)">openlayers</a>
<a href="https://www.naturalearthdata.com/tag/physical-labels/" class="tag-cloud-link tag-link-38 tag-link-position-29" style="font-size: 8pt;" aria-label="physical labels (1 item)">physical labels</a>
<a href="https://www.naturalearthdata.com/tag/pngng/" class="tag-cloud-link tag-link-52 tag-link-position-30" style="font-size: 8pt;" aria-label="pngng (1 item)">pngng</a>
<a href="https://www.naturalearthdata.com/tag/populated-places/" class="tag-cloud-link tag-link-39 tag-link-position-31" style="font-size: 8pt;" aria-label="populated places (1 item)">populated places</a>
<a href="https://www.naturalearthdata.com/tag/raster/" class="tag-cloud-link tag-link-58 tag-link-position-32" style="font-size: 16.4pt;" aria-label="raster (2 items)">raster</a>
<a href="https://www.naturalearthdata.com/tag/terrestrial-hypsography/" class="tag-cloud-link tag-link-45 tag-link-position-33" style="font-size: 8pt;" aria-label="terrestrial hypsography (1 item)">terrestrial hypsography</a>
<a href="https://www.naturalearthdata.com/tag/tfw/" class="tag-cloud-link tag-link-62 tag-link-position-34" style="font-size: 8pt;" aria-label="tfw (1 item)">tfw</a>
<a href="https://www.naturalearthdata.com/tag/thematic-mapping/" class="tag-cloud-link tag-link-48 tag-link-position-35" style="font-size: 8pt;" aria-label="thematic mapping (1 item)">thematic mapping</a>
<a href="https://www.naturalearthdata.com/tag/themese/" class="tag-cloud-link tag-link-37 tag-link-position-36" style="font-size: 8pt;" aria-label="themese (1 item)">themese</a>
<a href="https://www.naturalearthdata.com/tag/tif/" class="tag-cloud-link tag-link-71 tag-link-position-37" style="font-size: 8pt;" aria-label="tif (1 item)">tif</a>
<a href="https://www.naturalearthdata.com/tag/tilecache/" class="tag-cloud-link tag-link-54 tag-link-position-38" style="font-size: 8pt;" aria-label="tilecache (1 item)">tilecache</a>
<a href="https://www.naturalearthdata.com/tag/tiles/" class="tag-cloud-link tag-link-50 tag-link-position-39" style="font-size: 8pt;" aria-label="tiles (1 item)">tiles</a>
<a href="https://www.naturalearthdata.com/tag/time-zones/" class="tag-cloud-link tag-link-44 tag-link-position-40" style="font-size: 8pt;" aria-label="time zones (1 item)">time zones</a>
<a href="https://www.naturalearthdata.com/tag/towns/" class="tag-cloud-link tag-link-42 tag-link-position-41" style="font-size: 8pt;" aria-label="towns (1 item)">towns</a>
<a href="https://www.naturalearthdata.com/tag/transportation/" class="tag-cloud-link tag-link-43 tag-link-position-42" style="font-size: 8pt;" aria-label="transportation (1 item)">transportation</a>
<a href="https://www.naturalearthdata.com/tag/update/" class="tag-cloud-link tag-link-33 tag-link-position-43" style="font-size: 22pt;" aria-label="update (3 items)">update</a>
<a href="https://www.naturalearthdata.com/tag/visitors/" class="tag-cloud-link tag-link-73 tag-link-position-44" style="font-size: 8pt;" aria-label="visitors (1 item)">visitors</a>
<a href="https://www.naturalearthdata.com/tag/world-file/" class="tag-cloud-link tag-link-70 tag-link-position-45" style="font-size: 8pt;" aria-label="world file (1 item)">world file</a></div>
</li>
<li id="recent-comments-3" class="widget widget_recent_comments"><h2 class="widgettitle">Recent Comments</h2>
<ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link"><a href='http://www.bbscode.top/index.php/2022/03/17/aligning-natural-earth-geojson-and-raster-to-render-in-d3/' rel='external nofollow ugc' class='url'>Aligning Natural Earth Geojson and Raster to render in D3 &#8211; BBSCODE</a></span> on <a href="https://www.naturalearthdata.com/downloads/50m-raster-data/50m-shaded-relief/comment-page-1/#comment-6144">1:50m Shaded Relief</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://wp.csusm.edu/adahn/2022/03/14/qgis-a-mapping-tool/' rel='external nofollow ugc' class='url'>QGIS a Mapping Tool &#8211; April Dahn</a></span> on <a href="https://www.naturalearthdata.com/downloads/50m-raster-data/50m-shaded-relief/comment-page-1/#comment-6143">1:50m Shaded Relief</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://wp.csusm.edu/rsheehan/2022/03/13/more-mapping-with-qgis/' rel='external nofollow ugc' class='url'>More Mapping with QGIS &#8211; History 502</a></span> on <a href="https://www.naturalearthdata.com/downloads/50m-raster-data/50m-shaded-relief/comment-page-1/#comment-6142">1:50m Shaded Relief</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://ivermectin6mg.quest' rel='external nofollow ugc' class='url'>buy ivermectin 12 mg tablets</a></span> on <a href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/comment-page-1/#comment-6141">Download URLs double slash</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://slacker.ro/2021/10/01/building-a-beautiful-and-clear-map-from-massive-complex-data/' rel='external nofollow ugc' class='url'>Building A Beautiful And Clear Map From Massive, Complex Data &#8211; Slacker News</a></span> on <a href="https://www.naturalearthdata.com/downloads/10m-raster-data/10m-shaded-relief/comment-page-1/#comment-6140">1:10m Shaded Relief</a></li></ul></li>
<li id="bbp_topics_widget-2" class="widget widget_display_topics"><h2 class="widgettitle">Recent Forum Topics</h2>
<ul class="bbp-topics-widget newness">
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/natural-earth-in-wagner-vii/">Natural Earth in Wagner VII</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/frax/" title="View Hugo Ahlenius&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/2bd3b3347fd34f7dd734bf4b78fb353d?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/2bd3b3347fd34f7dd734bf4b78fb353d?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Hugo Ahlenius</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/downloads-are-404ing/">Downloads are 404ing</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/nathaniel/" title="View Nathaniel&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/e679fead4b7cb50b7b60e7c4f99bc348?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/e679fead4b7cb50b7b60e7c4f99bc348?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Nathaniel</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/disputed-territories-type-field/">Disputed Territories: &quot;type&quot; field</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/alykat/" title="View alykat&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/8c60e36c6b6542afb738eb950429d6ba?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/8c60e36c6b6542afb738eb950429d6ba?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">alykat</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/iso-code-confusion/">ISO code confusion</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/nth/" title="View nth&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://0.gravatar.com/avatar/f5060dc4d25dbced2933380279e0c1c5?s=14&#038;d=retro&#038;r=g' srcset='http://0.gravatar.com/avatar/f5060dc4d25dbced2933380279e0c1c5?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">nth</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/bad-adm1name-encoding-in-version-3-0-0-and-missing-diacritics-in-name/">Bad ADM1NAME, encoding in version 3.0.0 and missing diacritics in NAME</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/pfunes/" title="View pfunes&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/eded29f5ea7062bfe350281260b0596b?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/eded29f5ea7062bfe350281260b0596b?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">pfunes</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/u-s-county-shape-file-2/">U.S. County Shape File</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/gzingsheim/" title="View gzingsheim&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://1.gravatar.com/avatar/d617957f9d5d7d062deeadbfa011d8b6?s=14&#038;d=retro&#038;r=g' srcset='http://1.gravatar.com/avatar/d617957f9d5d7d062deeadbfa011d8b6?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">gzingsheim</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/projection-proportion-compatibility/">Projection / Proportion / Compatibility?</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/liquidized/" title="View Liquidized&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://0.gravatar.com/avatar/06422086ab7aab2b767e3df7f7a67bdd?s=14&#038;d=retro&#038;r=g' srcset='http://0.gravatar.com/avatar/06422086ab7aab2b767e3df7f7a67bdd?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Liquidized</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/">Download URLs double slash</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/vastur/" title="View vastur&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/e07b4667376982e080d64cf0250acc9b?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/e07b4667376982e080d64cf0250acc9b?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">vastur</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/map-soft-writer-me/">map soft &#8211; writer: me</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/krzysztof/" title="View krzysztof&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/be9767706435aa6e10d50185f6def05e?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/be9767706435aa6e10d50185f6def05e?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">krzysztof</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/unicode-encoding-issue-ne_10m_lakes-dbf/">Unicode encoding issue &#8211; ne_10m_lakes.dbf</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/filter-1/" title="View filter.1&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://1.gravatar.com/avatar/daae13b2efd52a3865320ada9ed3ae18?s=14&#038;d=retro&#038;r=g' srcset='http://1.gravatar.com/avatar/daae13b2efd52a3865320ada9ed3ae18?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">filter.1</span></a></span>
</li>
</ul>
</li>
</ul>
</div>
</div>
<hr />
<div id="footer">
<div id="footerarea">
<div id="footerlogos">
<p>Supported by:</p>
<div class="footer-ad-box">
<a href="http://www.nacis.org" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nacis.png" alt="NACIS" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.cartotalk.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/cartotalk_ad.png" alt="Cartotalk" /></a>
</div>
<div class="footer-ad-box">
<img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/mapgiving.png" alt="Mapgiving" />
</div>
<div class="footer-ad-box">
<a href="http://www.geography.wisc.edu/cartography/" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wisconsin.png" alt="University of Wisconsin Madison - Cartography Dept." /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.shadedrelief.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/shaded_relief.png" alt="Shaded Relief" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.xnrproductions.com " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/xnr.png" alt="XNR Productions" /></a>
</div>
<p style="clear:both;"></p>
<div class="footer-ad-box">
<a href="http://www.freac.fsu.edu" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/fsu.png" alt="Florida State University - FREAC" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.springercartographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/scllc.png" alt="Springer Cartographics LLC" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.washingtonpost.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wpost.png" alt="Washington Post" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.redgeographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/redgeo.png" alt="Red Geographics" /></a>
</div>
<div class="footer-ad-box">
<a href="http://kelsocartography.com/blog " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/kelso.png" alt="Kelso Cartography" /></a>
</div>
<p style="clear:both;"></p>
<div class="footer-ad-box">
<a href="http://www.avenza.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/avenza.png" alt="Avenza Systems Inc." /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.stamen.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/stamen_ne_logo.png" alt="Stamen Design" /></a>
</div>
</div>
<p style="clear:both;"></p>
<span id="footerleft">
&copy; 2009 - 2022. Natural Earth. All rights reserved.
</span>
<span id="footerright">
<!-- Please help promote WordPress and simpleX. Do not remove -->
<div>Powered by <a href="http://wordpress.org/">WordPress</a></div>
<div><a href="http://www.naturalearthdata.com/wp-admin">Staff Login &raquo;</a></div>
</span>
</div>
</div>
<script type='text/javascript' src='http://www.naturalearthdata.com/wp-includes/js/wp-embed.min.js?ver=5.5.9' id='wp-embed-js'></script>
</body>
</html>
<!-- Dynamic page generated in 0.242 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2022-05-09 00:23:33 -->
<!-- Compression = gzip -->
<!-- super cache -->

View File

@ -0,0 +1 @@
5.1.1

View File

@ -0,0 +1 @@
UTF-8

Binary file not shown.

View File

@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

Binary file not shown.

Binary file not shown.

Binary file not shown.

93
tools/package-lock.json generated Normal file
View File

@ -0,0 +1,93 @@
{
"name": "tools",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "tools",
"version": "1.0.0",
"license": "ISC",
"type": "module",
"devDependencies": {
"shapefile": "0.6.6"
}
},
"node_modules/array-source": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/array-source/-/array-source-0.0.4.tgz",
"integrity": "sha512-frNdc+zBn80vipY+GdcJkLEbMWj3xmzArYApmUGxoiV8uAu/ygcs9icPdsGdA26h0MkHUMW6EN2piIvVx+M5Mw==",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"license": "MIT"
},
"node_modules/file-source": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/file-source/-/file-source-0.6.1.tgz",
"integrity": "sha512-1R1KneL7eTXmXfKxC10V/9NeGOdbsAXJ+lQ//fvvcHUgtaZcZDWNJNblxAoVOyV1cj45pOtUrR3vZTBwqcW8XA==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"stream-source": "0.3"
}
},
"node_modules/path-source": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/path-source/-/path-source-0.1.3.tgz",
"integrity": "sha512-dWRHm5mIw5kw0cs3QZLNmpUWty48f5+5v9nWD2dw3Y0Hf+s01Ag8iJEWV0Sm0kocE8kK27DrIowha03e1YR+Qw==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"array-source": "0.0",
"file-source": "0.6"
}
},
"node_modules/shapefile": {
"version": "0.6.6",
"resolved": "https://registry.npmjs.org/shapefile/-/shapefile-0.6.6.tgz",
"integrity": "sha512-rLGSWeK2ufzCVx05wYd+xrWnOOdSV7xNUW5/XFgx3Bc02hBkpMlrd2F1dDII7/jhWzv0MSyBFh5uJIy9hLdfuw==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"array-source": "0.0",
"commander": "2",
"path-source": "0.1",
"slice-source": "0.4",
"stream-source": "0.3",
"text-encoding": "^0.6.4"
},
"bin": {
"dbf2json": "bin/dbf2json",
"shp2json": "bin/shp2json"
}
},
"node_modules/slice-source": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/slice-source/-/slice-source-0.4.1.tgz",
"integrity": "sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/stream-source": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/stream-source/-/stream-source-0.3.5.tgz",
"integrity": "sha512-ZuEDP9sgjiAwUVoDModftG0JtYiLUV8K4ljYD1VyUMRWtbVf92474o4kuuul43iZ8t/hRuiDAx1dIJSvirrK/g==",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/text-encoding": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
"integrity": "sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==",
"deprecated": "no longer maintained",
"dev": true,
"license": "Unlicense"
}
}
}

15
tools/package.json Normal file
View File

@ -0,0 +1,15 @@
{
"name": "tools",
"version": "1.0.0",
"description": "",
"license": "ISC",
"author": "",
"type": "module",
"main": "convert-geojson-outlines.js",
"scripts": {
"convert": "node convert-geojson-outlines.js countries ../frontend/data/outlines --pretty"
},
"devDependencies": {
"shapefile": "0.6.6"
}
}