Skip to content

Commit af41fd9

Browse files
committed
implement admin1 cut. and change country numeric id.
1 parent 977abd5 commit af41fd9

File tree

1 file changed

+72
-5
lines changed

1 file changed

+72
-5
lines changed

climada/entity/exposures/test/test_black_marble.py

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from climada.entity.exposures.black_marble import country_iso_geom, BlackMarble, \
1212
_process_land, _get_gdp, _get_income_group, fill_econ_indicators, add_sea, \
13-
_set_econ_indicators
13+
_set_econ_indicators, _fill_admin1_geom, _filter_admin1
1414
from climada.entity.exposures.nightlight import NOAA_BORDER, NOAA_RESOLUTION_DEG
1515
from climada.util.constants import ONE_LAT_KM
1616
from climada.util.coordinates import coord_on_land
@@ -19,6 +19,11 @@
1919
category='cultural', name='admin_0_countries')
2020
SHP_FILE = shapereader.Reader(SHP_FN)
2121

22+
ADM1_FILE = shapereader.natural_earth(resolution='10m',
23+
category='cultural',
24+
name='admin_1_states_provinces')
25+
ADM1_FILE = shapereader.Reader(ADM1_FILE)
26+
2227
class TestCountryIso(unittest.TestCase):
2328
"""Test country_iso function."""
2429

@@ -30,10 +35,10 @@ def test_che_kos_pass(self):
3035
self.assertEqual(len(iso_name), len(country_name))
3136
self.assertTrue('CHE'in iso_name)
3237
self.assertTrue('KOS'in iso_name)
33-
self.assertEqual(iso_name['CHE'][0], 93)
38+
self.assertEqual(iso_name['CHE'][0], 41)
3439
self.assertEqual(iso_name['CHE'][1], 'Switzerland')
3540
self.assertIsInstance(iso_name['CHE'][2], shapely.geometry.multipolygon.MultiPolygon)
36-
self.assertEqual(iso_name['KOS'][0], 66)
41+
self.assertEqual(iso_name['KOS'][0], 252)
3742
self.assertEqual(iso_name['KOS'][1], 'Kosovo')
3843
self.assertIsInstance(iso_name['KOS'][2], shapely.geometry.multipolygon.MultiPolygon)
3944

@@ -43,7 +48,7 @@ def test_haiti_pass(self):
4348
iso_name, _ = country_iso_geom(country_name, SHP_FILE)
4449

4550
self.assertEqual(len(iso_name), len(country_name))
46-
self.assertEqual(iso_name['HTI'][0], 113)
51+
self.assertEqual(iso_name['HTI'][0], 100)
4752
self.assertEqual(iso_name['HTI'][1], 'Haiti')
4853
self.assertIsInstance(iso_name['HTI'][2], shapely.geometry.multipolygon.MultiPolygon)
4954

@@ -59,7 +64,7 @@ def test_bolivia_pass(self):
5964
iso_name, _ = country_iso_geom(country_name, SHP_FILE)
6065

6166
self.assertEqual(len(iso_name), len(country_name))
62-
self.assertEqual(iso_name['BOL'][0], 4)
67+
self.assertEqual(iso_name['BOL'][0], 31)
6368
self.assertEqual(iso_name['BOL'][1], 'Bolivia')
6469
self.assertIsInstance(iso_name['BOL'][2], shapely.geometry.multipolygon.MultiPolygon)
6570

@@ -69,6 +74,67 @@ def test_korea_pass(self):
6974
with self.assertRaises(ValueError):
7075
country_iso_geom(country_name, SHP_FILE)
7176

77+
class TestProvinces(unittest.TestCase):
78+
"""Tst black marble with admin1."""
79+
def test_fill_admin1_geom_pass(self):
80+
"""Test function _fill_admin1_geom pass."""
81+
iso3 = 'ESP'
82+
admin1_rec = list(ADM1_FILE.records())
83+
84+
prov_list = ['Barcelona']
85+
res_bcn = _fill_admin1_geom(iso3, admin1_rec, prov_list)
86+
self.assertEqual(len(res_bcn), 1)
87+
self.assertIsInstance(res_bcn[0], shapely.geometry.multipolygon.MultiPolygon)
88+
89+
prov_list = ['Barcelona', 'Tarragona']
90+
res_bcn = _fill_admin1_geom(iso3, admin1_rec, prov_list)
91+
self.assertEqual(len(res_bcn), 2)
92+
self.assertIsInstance(res_bcn[0], shapely.geometry.multipolygon.MultiPolygon)
93+
self.assertIsInstance(res_bcn[1], shapely.geometry.multipolygon.MultiPolygon)
94+
95+
def test_fill_admin1_geom_fail(self):
96+
"""Test function _fill_admin1_geom fail."""
97+
iso3 = 'CHE'
98+
admin1_rec = list(ADM1_FILE.records())
99+
100+
prov_list = ['Barcelona']
101+
with self.assertRaises(ValueError):
102+
with self.assertLogs('climada.entity.exposures.black_marble', level='ERROR') as cm:
103+
_fill_admin1_geom(iso3, admin1_rec, prov_list)
104+
self.assertIn('Barcelona not found. Possible provinces of CHE are: ', cm.output[0])
105+
106+
def test_country_iso_geom_pass(self):
107+
"""Test country_iso_geom pass."""
108+
countries = {'Switzerland': []}
109+
_, cntry_admin1 = country_iso_geom(countries, SHP_FILE)
110+
self.assertEqual(cntry_admin1, {'CHE': []})
111+
112+
countries = ['Switzerland']
113+
_, cntry_admin1 = country_iso_geom(countries, SHP_FILE)
114+
self.assertEqual(cntry_admin1, {'CHE': []})
115+
self.assertIsInstance(countries, list)
116+
117+
countries = {'Switzerland': 'Zürich'}
118+
_, cntry_admin1 = country_iso_geom(countries, SHP_FILE)
119+
self.assertEqual(len(cntry_admin1), 1)
120+
self.assertIsInstance(cntry_admin1['CHE'][0], shapely.geometry.multipolygon.MultiPolygon)
121+
122+
def test_filter_admin1_pass(self):
123+
"""Test _filter_admin1 pass."""
124+
exp_bkmrb = BlackMarble()
125+
exp_bkmrb.value = np.arange(100)
126+
exp_bkmrb.coord = np.empty((100, 2))
127+
exp_bkmrb.coord[:, 0] = 41.39
128+
exp_bkmrb.coord[:, 1] = np.linspace(0, 3, 100)
129+
admin1_rec = list(ADM1_FILE.records())
130+
for rec in admin1_rec:
131+
if 'Barcelona' in rec.attributes['name']:
132+
bcn_geom = rec.geometry
133+
134+
_filter_admin1(exp_bkmrb, bcn_geom)
135+
for coord in exp_bkmrb.coord:
136+
self.assertTrue(bcn_geom.contains(shapely.geometry.Point([coord[1],coord[0]])))
137+
72138
class TestNightLight(unittest.TestCase):
73139
"""Test nightlight functions."""
74140

@@ -312,4 +378,5 @@ def test_set_econ_indicators_pass(self):
312378
TESTS = unittest.TestLoader().loadTestsFromTestCase(TestEconIndices)
313379
TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCountryIso))
314380
TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestNightLight))
381+
TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestProvinces))
315382
unittest.TextTestRunner(verbosity=2).run(TESTS)

0 commit comments

Comments
 (0)