-
Notifications
You must be signed in to change notification settings - Fork 1
/
ecoInfo.py
153 lines (124 loc) · 4.21 KB
/
ecoInfo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import xml.etree.ElementTree as ET
import csv, os
# ecozone codes
_zoneFromZCode = {'aa':'Australasia', 'an':'Antarctica', 'at':'Afrotropic', 'im':'Indomalayan', 'na':'Nearctic', 'nt':'Neotropic', 'oc':'Oceania', 'pa':'Palearctic'}
# process ISO country codes
_countryFromCCode = {}
for c in ET.parse('iso3166.xml').findall('iso_3166_entry'):
_countryFromCCode[c.get('alpha_2_code').lower()] = c.get('name').encode('utf8')
_countryFromCCode['ci'] = 'Cote d\'Ivoire'
# process ISO country subdivision codes
for c2Elm in ET.parse('iso3166_2.xml').findall('iso_3166_country'):
for sElms in c2Elm.findall('iso_3166_subset'):
for sElm in sElms.findall('iso_3166_2_entry'):
_countryFromCCode[sElm.get('code').lower()] = sElm.get('name').encode('utf8')
# process biomes
_biomeFromBCode = {}
for x in csv.reader(open('biomes.csv'), delimiter='\t'):
_biomeFromBCode[int(x[0])] = x[1]
# process ecoregions
_ecoregionFromECode = {}
_bCodeFromECode = {}
for x in csv.reader(open('ecoregions.csv'), delimiter='\t'):
code = x[0].lower().strip()
_bCodeFromECode[code] = int(x[1])
_ecoregionFromECode[code] = x[2].strip()
def getBCodeFromECode(eCode):
return _bCodeFromECode[eCode]
# process countries
_eCodesFromCCode = {}
_cCodesFromECode = {}
for x in csv.reader(open('Countries by ecoregion.csv')):
if 1 < len(x):
cCode = x[1].lower().strip()
eCode = x[0].lower().strip()
if cCode in _eCodesFromCCode:
_eCodesFromCCode[cCode].add(eCode)
else:
_eCodesFromCCode[cCode] = set([eCode])
if eCode in _cCodesFromECode:
_cCodesFromECode[eCode].add(cCode)
else:
_cCodesFromECode[eCode] = set([cCode])
if 2 < len(cCode):
code = cCode[0:2]
if code in _eCodesFromCCode:
_eCodesFromCCode[code].add(eCode)
else:
_eCodesFromCCode[code] = set([eCode])
def getECodesFromCCode(x):
return _eCodesFromCCode[x]
def getCCodesFromECode(code):
return _cCodesFromECode[code]
def toCountryCCode(code):
return code[0:2]
def getAllCCodes():
cCodes = [c for c in _eCodesFromCCode.iterkeys() if isCountryCode(c)]
return cCodes
def getAllECodes():
return _ecoregionFromECode.keys()
def _isSubdivisionCode(code):
return len(code) > 2
def isCountryCode(code):
return len(code) == 2
def _getCountryCode(code):
if _isSubdivisionCode(code):
return code[0:code.find('-')]
else:
return code
def getZCodeFromECode(eCode):
return eCode[0:2]
def _splitByZCode(eCodes):
result = {}
for eCode in eCodes:
zCode = _getZCode(eCode)
zName = _zoneFromZCode[zCode]
zTuple = (zCode, zName)
if zTuple in result:
result[zTuple].add(eCode)
else:
result[zTuple] = set([eCode])
return result
def _splitByCCode(eCodes, useSubdivisions):
result = {}
for eCode in eCodes:
for cCode in _cCodesFromECode[eCode]:
code = cCode[0:2] if not useSubdivisions else cCode
cTuple = (code, _countryFromCCode[code])
if cTuple in result:
result[cTuple].add(eCode)
else:
result[cTuple] = set([eCode])
return result
def _splitByBCode(eCodes):
result = {}
for eCode in eCodes:
bCode = _bCodeFromECode[eCode]
bTuple = (bCode, _biomeFromBCode[bCode])
if bTuple in result:
result[bTuple].add(eCode)
else:
result[bTuple] = set([eCode])
return result
def cmpTuples(x, y):
return cmp(x[1], y[1])
def cmpZCodes(x, y):
return cmp(getZone(x), getZone(y))
def cmpCCodes(x, y):
return cmp(getCountry(x), getCountry(y))
def cmpECodes(x, y):
return cmp(getEcoregion(x), getEcoregion(y))
def cmpBCodes(x, y):
return cmp(int(x), int(y))
def getBiome(x):
return _biomeFromBCode[x]
def getEcoregion(x):
return _ecoregionFromECode[x]
def getZone(x):
return _zoneFromZCode[x]
def getCountry(x):
return _countryFromCCode[x]
def getECodesInStates(cCode):
pred = lambda c: _isSubdivisionCode(c) and c[0:3] == cCode + '-'
eCodes = [e for e in _eCodesFromCCode.iterkeys() if pred(e)]
return eCodes