Coverage for /usr/local/lib/python3.11/dist-packages/pyrocko/dataset/topo/srtmgl3.py: 93%
69 statements
« prev ^ index » next coverage.py v6.5.0, created at 2023-10-04 09:52 +0000
« prev ^ index » next coverage.py v6.5.0, created at 2023-10-04 09:52 +0000
1# http://pyrocko.org - GPLv3
2#
3# The Pyrocko Developers, 21st Century
4# ---|P------/S----------~Lg----------
6'''
7NASA Shuttle Radar Topography Mission Global 30 arc second (`SRTMGL3 <https://lpdaac.usgs.gov/dataset_discovery/measures/measures_products_table/srtmgl3_v003>`_) topography data.
8''' # noqa
10import zipfile
11import os.path as op
12import os
13import re
14# from pyrocko.util import urlopen
16import numpy as num
18from pyrocko import util, config
19from . import tile, dataset
21citation = '''
22Farr, T. G., and M. Kobrick, 2000, Shuttle Radar Topography Mission produces a
23wealth of data. Eos Trans. AGU, 81:583-585.
25Farr, T. G. et al., 2007, The Shuttle Radar Topography Mission, Rev. Geophys.,
2645, RG2004, doi:10.1029/2005RG000183. (Also available online at
27http://www2.jpl.nasa.gov/srtm/SRTM_paper.pdf)
29Kobrick, M., 2006, On the toes of giants-How SRTM was born, Photogramm. Eng.
30Remote Sens., 72:206-210.
32Rosen, P. A. et al., 2000, Synthetic aperture radar interferometry, Proc. IEEE,
3388:333-382.
34'''
36__doc__ += '''
37.. rubric:: Citation
39''' + citation
42class AuthenticationRequired(Exception):
43 pass
46class SRTMGL3(dataset.TiledGlobalDataset):
47 '''
49 '''
51 def __init__(
52 self,
53 name='SRTMGL3',
54 data_dir=op.join(op.dirname(__file__), 'data', 'SRTMGL3'),
55 raw_data_url='https://mirror.pyrocko.org/e4ftl01.cr.usgs.gov/'
56 'MEASURES/SRTMGL3.003/2000.02.11'):
58 dataset.TiledGlobalDataset.__init__(
59 self,
60 name,
61 432001, 216001, 1201, 1201,
62 num.dtype('>i2'),
63 data_dir=data_dir,
64 citation=citation,
65 region=(-180., 180., -60., 60.))
67 self.raw_data_url = raw_data_url
68 self._available_tilenames = None
69 self.config = config.config()
71 def tilename(self, itx, ity):
72 itx -= 180
73 ity -= 90
74 if ity >= 0:
75 s = 'N%02i' % ity
76 else:
77 s = 'S%02i' % -ity
79 if itx >= 0:
80 s += 'E%03i' % itx
81 else:
82 s += 'W%03i' % -itx
84 return s
86 def available_tilenames(self):
87 if self._available_tilenames is None:
88 fpath = op.join(self.data_dir, 'available.list')
89 if not op.exists(fpath) or os.stat(fpath).st_size == 0:
90 util.ensuredirs(fpath)
91 # remote structure changed, we would have to clawl through
92 # many pages. Now keeping tile index here:
93 self.download_file(
94 'https://mirror.pyrocko.org/e4ftl01.cr.usgs.gov/'
95 'MEASURES/SRTMGL3.003/2000.02.11/available.list', fpath)
97 # url = self.raw_data_url + '/'
98 # f = urlopen(url)
99 # data = f.read().decode()
100 # available = re.findall(
101 # r'([NS]\d\d[EW]\d\d\d)\.SRTMGL3\.hgt', data)
102 #
103 # f.close()
104 #
105 # with open(fpath, 'w') as f:
106 # f.writelines('%s\n' % s for s in available)
108 with open(fpath, 'r') as f:
109 available = [
110 s.strip() for s in f.readlines()
111 if re.match(r'^[NS]\d\d[EW]\d\d\d$', s.strip())]
113 self._available_tilenames = set(available)
115 return self._available_tilenames
117 def tilefilename(self, tilename):
118 return tilename + '.SRTMGL3.hgt.zip'
120 def tilepath(self, tilename):
121 fn = self.tilefilename(tilename)
122 return op.join(self.data_dir, fn)
124 def download_tile(self, tilename):
125 fpath = self.tilepath(tilename)
126 fn = self.tilefilename(tilename)
127 url = self.raw_data_url + '/' + fn
128 try:
129 # we have to follow the oauth redirect here...
130 self.download_file(url, fpath)
131 except Exception as e:
132 raise e
134 def download(self):
135 for tn in self.available_tilenames():
136 fpath = self.tilepath(tn)
137 if not op.exists(fpath):
138 self.download_tile(tn)
140 def get_tile(self, itx, ity):
141 tn = self.tilename(itx, ity)
142 if tn not in self.available_tilenames():
143 return None
144 else:
145 fpath = self.tilepath(tn)
146 if not op.exists(fpath):
147 self.download_tile(tn)
149 zipf = zipfile.ZipFile(fpath, 'r')
150 rawdata = zipf.read(tn + '.hgt')
151 zipf.close()
152 data = num.frombuffer(rawdata, dtype=self.dtype)
153 assert data.size == self.ntx * self.nty
154 data = data.reshape(self.nty, self.ntx)[::-1, ::]
155 return tile.Tile(
156 self.xmin + itx*self.stx,
157 self.ymin + ity*self.sty,
158 self.dx, self.dx, data)
161if __name__ == '__main__':
162 import sys
164 util.setup_logging('pyrocko.topo.srtmgl3', 'info')
166 if len(sys.argv) != 2:
167 sys.exit('usage: python -m pyrocko.topo.srtmgl3 download')
169 if sys.argv[1] == 'download':
170 srtmgl3 = SRTMGL3()
171 srtmgl3.download()