access-cloud-based-insar / dem-stitcher Goto Github PK
View Code? Open in Web Editor NEWDownload and merge DEM tiles
License: Apache License 2.0
Download and merge DEM tiles
License: Apache License 2.0
Platform:
Mac OS Big Sur, 11.6.4 (20G417) AND google Colab
Python v. 3.7
"pip install dem-stitcher"
Output:
Successfully installed dem-stitcher-0.0.1
It seems only 0.0.1 gets installed with Python <=3.7. Can you make this and/or a prior version compatible with at least Python=3? This is quite useful for Google Colab in particular, which only runs python 3.7.
labeled-pr
, changelog
, and test-and-tag
)This is now done with s1-enumerator
and will be replicated.
I want to use the glo30 DEM with ISCE. I basically use the notebook here, 'staging for isce2', but with a boundary [-74, 41,-70, 44].
The result is a vertical line of 0 valued pixels (~1 pixel wide) going across the stitched tile at about the -72.00000 coordinate through the entire region. This results in a problem with ISCE2 processing. Here is a picture:
Glo-30 tiles have missing tiles over said areas. There are downstream implications related to removing topographic phase for GUNWs.
A reference to some of the missing tiles: https://twitter.com/EricFielding/status/1531639815610830848
Country identifier | GeoCell ID
Armenia | N38E046
Armenia | N39E044
Armenia | N39E045
Armenia | N39E046
Armenia | N40E043
Armenia | N40E044
Armenia | N40E045
Armenia | N41E043
Armenia | N41E044
Armenia | N41E045
Azerbaijan | N38E046
Azerbaijan | N39E045
Azerbaijan | N39E046
Azerbaijan | N39E047
Azerbaijan | N40E045
Azerbaijan | N40E046
Azerbaijan | N40E047
Azerbaijan | N38E045
Azerbaijan | N38E046
Azerbaijan | N38E048
Azerbaijan | N38E049
Azerbaijan | N39E044
Azerbaijan | N39E045
Azerbaijan | N39E046
Azerbaijan | N39E047
Azerbaijan | N39E048
Azerbaijan | N39E049
Azerbaijan | N40E044
Azerbaijan | N40E045
Azerbaijan | N40E046
Azerbaijan | N40E047
Azerbaijan | N40E048
Azerbaijan | N40E049
Azerbaijan | N40E050
Azerbaijan | N41E044
Azerbaijan | N41E045
Azerbaijan | N41E046
Azerbaijan | N41E047
Azerbaijan | N41E048
Azerbaijan | N41E049
Check this package data file and verify above tiles doe not exist
Downstream topographic phase removal - see Issue #67
The example on the github homepage does not work due to removal of 2021
prefix in glo-30 aws bucket.
bounds = [-119.085, 33.402, -118.984, 35.435]
X, p = stitch_dem(bounds,
dem_name='glo_30',
dst_ellipsoidal_height=False,
dst_area_or_point='Point')
---------------------------------------------------------------------------
CPLE_HttpResponseError Traceback (most recent call last)
File rasterio/_base.pyx:261, in rasterio._base.DatasetBase.__init__()
File rasterio/_shim.pyx:78, in rasterio._shim.open_dataset()
File rasterio/_err.pyx:216, in rasterio._err.exc_wrap_pointer()
CPLE_HttpResponseError: HTTP response code: 404
During handling of the above exception, another exception occurred:
RasterioIOError Traceback (most recent call last)
Input In [22], in <cell line: 2>()
1 bounds = [-119.085, 33.402, -118.984, 35.435]
----> 2 X, p = stitch_dem(bounds,
3 dem_name='glo_30',
4 dst_ellipsoidal_height=False,
5 dst_area_or_point='Point')
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/site-packages/dem_stitcher/stitcher.py:304, in stitch_dem(bounds, dem_name, dst_ellipsoidal_height, dst_area_or_point, dst_resolution, n_threads_reproj, n_threads_downloading, driver, fill_in_glo_30)
302 return RASTER_READERS[dem_name](url)
303 with ThreadPoolExecutor(max_workers=n_threads_downloading) as executor:
--> 304 results = list(tqdm(executor.map(reader, urls),
305 total=len(urls),
306 desc=f'Reading {dem_name} Datasets'))
308 # If datasets are non-existent, returns None
309 datasets = list(filter(lambda x: x is not None, results))
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/site-packages/tqdm/std.py:1195, in tqdm.__iter__(self)
1192 time = self._time
1194 try:
-> 1195 for obj in iterable:
1196 yield obj
1197 # Update and possibly print the progressbar.
1198 # Note: does not call self.update(1) for speed optimisation.
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/concurrent/futures/_base.py:609, in Executor.map.<locals>.result_iterator()
606 while fs:
607 # Careful not to keep a reference to the popped future
608 if timeout is None:
--> 609 yield fs.pop().result()
610 else:
611 yield fs.pop().result(end_time - time.monotonic())
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/concurrent/futures/_base.py:446, in Future.result(self, timeout)
444 raise CancelledError()
445 elif self._state == FINISHED:
--> 446 return self.__get_result()
447 else:
448 raise TimeoutError()
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/concurrent/futures/_base.py:391, in Future.__get_result(self)
389 if self._exception:
390 try:
--> 391 raise self._exception
392 finally:
393 # Break a reference cycle with the exception in self._exception
394 self = None
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/concurrent/futures/thread.py:58, in _WorkItem.run(self)
55 return
57 try:
---> 58 result = self.fn(*self.args, **self.kwargs)
59 except BaseException as exc:
60 self.future.set_exception(exc)
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/site-packages/dem_stitcher/stitcher.py:302, in stitch_dem.<locals>.reader(url)
301 def reader(url):
--> 302 return RASTER_READERS[dem_name](url)
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/site-packages/dem_stitcher/dem_readers.py:12, in read_dem(dem_path)
11 def read_dem(dem_path: str) -> rasterio.DatasetReader:
---> 12 ds = rasterio.open(dem_path)
13 return ds
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/site-packages/rasterio/env.py:437, in ensure_env_with_credentials.<locals>.wrapper(*args, **kwds)
434 session = DummySession()
436 with env_ctor(session=session):
--> 437 return f(*args, **kwds)
File ~/opt/anaconda3/envs/dem-stitcher/lib/python3.9/site-packages/rasterio/__init__.py:220, in open(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)
216 # Create dataset instances and pass the given env, which will
217 # be taken over by the dataset's context manager if it is not
218 # None.
219 if mode == 'r':
--> 220 s = DatasetReader(path, driver=driver, sharing=sharing, **kwargs)
221 elif mode == "r+":
222 s = get_writer_for_path(path, driver=driver)(
223 path, mode, driver=driver, sharing=sharing, **kwargs
224 )
File rasterio/_base.pyx:263, in rasterio._base.DatasetBase.__init__()
RasterioIOError: HTTP response code: 404
Issues downloading DEMs. My workflow had worked previously for me but I am now running into an issues with the stitch_dem function timing out.
python=3.10
dem_stitcher==2.5.5
rasterio==1.3.10
dem_data, dem_meta = stitch_dem((106.021858, -68.843872, 119.033562, -63.540306), dem_name='glo_30', dst_ellipsoidal_height=True, dst_area_or_point='Point' )
`2024-06-27 05:39:12 INFO Scene bounds : (106.021858, -68.843872, 119.033562, -63.540306)
2024-06-27 05:39:12 INFO Downloding DEM for bounds : (106.021858, -68.843872, 119.033562, -63.540306)
2024-06-27 05:39:12 INFO type of DEM being downloaded : glo_30
2024-06-27 05:39:14 INFO Found credentials in environment variables.
2024-06-27 05:39:14 INFO Found credentials in environment variables.
2024-06-27 05:39:14 INFO Found credentials in environment variables.
2024-06-27 05:39:14 INFO Found credentials in environment variables.
2024-06-27 05:39:14 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 2%|██▏ | 1/46 [00:13<10:26, 13.92s/it]2024-06-27 05:39:28 INFO Found credentials in environment variables.
2024-06-27 05:39:28 INFO Found credentials in environment variables.
2024-06-27 05:39:28 INFO Found credentials in environment variables.
2024-06-27 05:39:28 INFO Found credentials in environment variables.
2024-06-27 05:39:28 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 13%|█████████████▎ | 6/46 [00:24<02:23, 3.59s/it]2024-06-27 05:39:42 INFO Found credentials in environment variables.
2024-06-27 05:39:42 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 15%|███████████████▌ | 7/46 [00:27<02:14, 3.45s/it]2024-06-27 05:39:42 INFO Found credentials in environment variables.
2024-06-27 05:39:42 INFO Found credentials in environment variables.
2024-06-27 05:39:42 INFO Found credentials in environment variables.
2024-06-27 05:39:55 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 24%|████████████████████████▏ | 11/46 [00:41<02:00, 3.44s/it]2024-06-27 05:39:55 INFO Found credentials in environment variables.
2024-06-27 05:39:55 INFO Found credentials in environment variables.
2024-06-27 05:39:55 INFO Found credentials in environment variables.
2024-06-27 05:39:55 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 35%|███████████████████████████████████▏ | 16/46 [00:54<01:32, 3.07s/it]2024-06-27 05:40:09 INFO Found credentials in environment variables.
2024-06-27 05:40:09 INFO Found credentials in environment variables.
2024-06-27 05:40:09 INFO Found credentials in environment variables.
2024-06-27 05:40:09 INFO Found credentials in environment variables.
2024-06-27 05:40:09 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 46%|██████████████████████████████████████████████ | 21/46 [01:05<01:06, 2.66s/it]2024-06-27 05:40:22 INFO Found credentials in environment variables.
2024-06-27 05:40:22 INFO Found credentials in environment variables.
2024-06-27 05:40:22 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 52%|████████████████████████████████████████████████████▋ | 24/46 [01:07<00:48, 2.22s/it]2024-06-27 05:40:22 INFO Found credentials in environment variables.
2024-06-27 05:40:22 INFO Found credentials in environment variables.
2024-06-27 05:40:36 INFO Found credentials in environment variables.
2024-06-27 05:40:36 INFO Found credentials in environment variables.
2024-06-27 05:40:36 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 57%|█████████████████████████████████████████████████████████ | 26/46 [01:21<01:02, 3.14s/it]2024-06-27 05:40:36 INFO Found credentials in environment variables.
2024-06-27 05:40:36 INFO Found credentials in environment variables.
2024-06-27 05:40:44 INFO Found credentials in environment variables.
2024-06-27 05:40:49 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 67%|████████████████████████████████████████████████████████████████████ | 31/46 [01:37<00:47, 3.15s/it]2024-06-27 05:40:54 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 70%|██████████████████████████████████████████████████████████████████████▎ | 32/46 [01:39<00:42, 3.06s/it]2024-06-27 05:40:54 INFO Found credentials in environment variables.
2024-06-27 05:40:54 INFO Found credentials in environment variables.
2024-06-27 05:40:54 INFO Found credentials in environment variables.
2024-06-27 05:40:54 INFO Found credentials in environment variables.
2024-06-27 05:41:07 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 83%|███████████████████████████████████████████████████████████████████████████████████▍ | 38/46 [01:52<00:21, 2.65s/it]2024-06-27 05:41:07 INFO Found credentials in environment variables.
2024-06-27 05:41:07 INFO Found credentials in environment variables.
2024-06-27 05:41:07 INFO Found credentials in environment variables.
Reading glo_30 Datasets: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████| 46/46 [02:03<00:00, 2.68s/it]
2024-06-27 05:48:09 INFO GDAL signalled an error: err_no=11, msg="CURL error: Failed to connect to download.agisoft.com port 80 after 131945 ms: Couldn't connect to server"
Traceback (most recent call last):
File "rasterio/_base.pyx", line 310, in rasterio._base.DatasetBase.init
File "rasterio/_base.pyx", line 221, in rasterio._base.open_dataset
File "rasterio/_err.pyx", line 221, in rasterio._err.exc_wrap_pointer
rasterio._err.CPLE_HttpResponseError: CURL error: Failed to connect to download.agisoft.com port 80 after 131945 ms: Couldn't connect to server
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rtc_otf.py", line 208, in
dem_data, dem_meta = stitch_dem(scene_bounds_buf,
File "/opt/conda/envs/nrb_env/lib/python3.8/site-packages/dem_stitcher/stitcher.py", line 367, in stitch_dem
dem_arr, dem_profile = merge_and_transform_dem_tiles(datasets,
File "/opt/conda/envs/nrb_env/lib/python3.8/site-packages/dem_stitcher/stitcher.py", line 204, in merge_and_transform_dem_tiles
dem_arr = remove_geoid(dem_arr,
File "/opt/conda/envs/nrb_env/lib/python3.8/site-packages/dem_stitcher/geoid.py", line 83, in remove_geoid
geoid_arr, geoid_profile = read_geoid(geoid_name,
File "/opt/conda/envs/nrb_env/lib/python3.8/site-packages/dem_stitcher/geoid.py", line 41, in read_geoid
geoid_arr, geoid_profile = read_raster_from_window(geoid_path,
File "/opt/conda/envs/nrb_env/lib/python3.8/site-packages/dem_stitcher/rio_window.py", line 113, in read_raster_from_window
with rasterio.open(raster_path) as ds:
File "/opt/conda/envs/nrb_env/lib/python3.8/site-packages/rasterio/env.py", line 451, in wrapper
return f(*args, **kwds)
File "/opt/conda/envs/nrb_env/lib/python3.8/site-packages/rasterio/init.py", line 304, in open
dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs)
File "rasterio/_base.pyx", line 312, in rasterio._base.DatasetBase.init
rasterio.errors.RasterioIOError: CURL error: Failed to connect to download.agisoft.com port 80 after 131945 ms: Couldn't connect to server
Reading tile imagery take long time in wsl (windows subsidiary linux tested os : ubuntu and debian)
host os : win 11
ram : 8 gb
Opening glo_30 Datasets: 100%|██████████| 1/1 [00:02<00:00, 2.18s/it]
Reading tile metadata: 100%|██████████| 1/1 [00:00<00:00, 664.71it/s]
Reading tile imagery: 0%| | 0/1 [00:00<?, ?it/s]
1 create virtual environment,
2 install dem-stitcher on virtual environment created above
3 use the code from pypi
from dem_stitcher import stitch_dem
# as xmin, ymin, xmax, ymax in epsg:4326
bounds = [-119.085, 33.402, -118.984, 35.435]
X, p = stitch_dem(bounds,
dem_name='glo_30', # Global Copernicus 30 meter resolution DEM
dst_ellipsoidal_height=False,
dst_area_or_point='Point')
4 save is app.py
5 execute python app.py
the same code took from pypi
run well in google colab
steps for additional context
1 install dem-stitcher
2 use code from pypi above
3 execute the code
best regards
Some issues with gdal
version 3.4 were noted here. Appears 3.5+
solves those issues.
Pytest passes
N/A
Want to have 3.10 via conda-forge
At the antimeridian line, there is no "unwrapping" of the tiles and therefore only longitudes -180 to 180 are included.
bounds = [-180.25, 51.25, -179.75, 51.75]
X, p = stitch_dem(bounds,
dem_name='glo_30')
The above should yield the same as
bounds = [179.75, 51.25, 180.25, 51.75]
X, p = stitch_dem(bounds,
dem_name='glo_30')
Install via conda-forge to ensure environment restrictions and more reliable for DockerizedTopsApp.
In readme, conda install -c conda-forge dem_stitcher
Not applicable
environment.yml
will provide better restrictions on installation.
read_geoid()
is failing to access the geoid files hosted under https://s3-eu-west-1.amazonaws.com/download.agisoft.com/geoids/ . As of this morning, attempting to access any of the three files fails with an HTTP 403 "All access to this object has been disabled" error. Googling that error message suggests the underlying AWS account has been closed.
Similar to #88 , I expect this will cause all dem stitching attempts to fail.
While the right/top boundaries are exactly as specified, the left/bottm (western/southern) boundaries seem to get rounded.
(following the README)
import rasterio
bounds = [176.678207, 50.908962, 179.697601, 52.754662]
X, p = dem_stitcher.stitch_dem(bounds, dem_name='glo_30')
with rasterio.open('dem.tif', 'w', **p) as ds:
ds.write(X2, 1)
ds.update_tags(AREA_OR_POINT='Point')
$ rio bounds --bbox dem.tif
[177.0, 51.0, 179.69791666666666, 52.75472222222222]
In [36]: rio.show_versions()
rasterio info:
rasterio: 1.3.8
GDAL: 3.7.1
PROJ: 9.2.1
GEOS: 3.12.0
PROJ DATA: /Users/staniewi/miniconda3/envs/dem-env/share/proj
GDAL DATA: /Users/staniewi/miniconda3/envs/dem-env/share/gdal
System:
python: 3.11.5 | packaged by conda-forge | (main, Aug 27 2023, 03:33:12) [Clang 15.0.7 ]
executable: /Users/staniewi/miniconda3/envs/dem-env/bin/python3.11
machine: macOS-13.5.1-arm64-arm-64bit
Python deps:
affine: 2.4.0
attrs: 23.1.0
certifi: 2023.07.22
click: 8.1.7
cligj: 0.7.2
cython: None
numpy: 1.25.2
snuggs: 1.4.7
click-plugins: None
setuptools: 68.1.2
Hi,
Here is a slice of code in the stitcher.py:
if dst_area_or_point == 'Point' and src_area_or_point == 'Area':
x_shift = 1
y_shift = 1
array_shifted, profile_shifted = gdal_translate_profile(filepath, x_shift, y_shift)
elif (dst_area_or_point == 'Area') and (src_area_or_point == 'Point'):
shift = .5
array_shifted, profile_shifted = gdal_translate_profile(filepath, shift, shift)
# half shift down if glo30
elif (dst_area_or_point == 'Point') and (src_area_or_point == 'Point'):
x_shift = 1
y_shift = 1
array_shifted, profile_shifted = gdal_translate_profile(filepath, x_shift, y_shift)
I notice that x_shift
and y_shift
always equal to 1 if dst_area_or_point == 'Point'
and no matter what src_area_or_point
is. This looks a little strange to me. Is it a typo? If there is some reason behind it, I will appreciate it if you let me know.
Thanks!
Hi!
First of all, thanks for the great package. I was wondering if there is a simple way to access the water bodies layer of the NASADEM-HGT product. It is listed here as the third layer. I assume your stitch_dem
function always returns the first layer only?
In the merge_and_transform_dem_tiles
function there are two calls where you set:
dem_arr = dem_arr[0, ...]
I assume this is where you drop all but the first layer (i.e. all but the DEM layer)?
I hope the question is somewhat clear; please let me know if not.
Best,
Konstantin
Hello!
Can we consider to externalize the hardcoded parameter 'ARIA_GEOIDS' ?
It will be helpfull in order to change the url without code modification (if the link does not respond for example). We could imaging to place a link to local geoid files for example.
import os
ARIA_GEOIDS = os.environ.get('ARIA_GEOIDS', 'https://aria-geoid.s3.us-west-2.amazonaws.com')
GEOID_PATHS_AGI = {
'geoid_18': f'{DATA_PATH}/geoid_18.tif',
'egm_08': f'{ARIA_GEOIDS}/egm08_25.tif',
'egm_96': f'{DATA_PATH}/egm96_15.gtx',
}
Simple demonstration of bug:
If we specify extents contained entirely within a DEM tile and require no transformations (e.g. do not remove geoid and keep pixel center or area center coordinate system of the original tiles), we want dem-stitcher
to return a subset of that tile that contains the extent. This is not the case. We will post a notebook to demonstrate this issue is resolved as well as an integration test.
In original version, we (well, the error was mine) used rasterio.merge
(link) with the bounds
keyword argument. I believed this function to be obtaining a window around the bound extents; however, as the rasterio source code reveals, there is resampling that is done to ensure that the extents fit nicely into the CRS, which may be beneficial in many, if not most, GIS applications.
More precisely, to go from Pixel center to Area center coordinates, we need to translate the original rasters and then perform any necessary resampling. If resampling is done before a translation of the geo-transform, then things go wrong (majorly).
Further, the window operations were also resampling under the hood. All these issues need to be fixed.
In a general sense, if we have two affine transformations T_r
and T_t
representing "resampling" and "translation" resepectively, then T_r * T_t
is not the same as T_t * T_r
(it's worth checking this on simple examples i.e. seeing that both the geo-transform/affine transformaion and the resulting rasters are different).
This was further complicated when we wanted to change the resolution at higher latitudes because glo-30
shrinks latitude spacing as documented here. Thus, more resampling was done.
Which order is correct? We will take the approach T_r * T_t
i.e.:
To be filled in later.
The issue #31 points out is due the fact this resampling is done so a shift was selected based on investigating sites. However, this is not a totally correct approach.
We need tests to make sure that the above bug is removed.
Ensure correctness of geoid removal using ESA Copernicus data as indicated here.
With branch protection rules, when there are required checks for merging into dev
:
The release workflow will not be able to fast-forward main->dev to bring the release tag into the main branch, and a PR like #91 will be opened instead.
Notably, eventhough we allow an automation user to bypass a pull request
this has no effect on required status checks:
https://github.com/orgs/community/discussions/43460)
Rulesets allows more fine-grained control and would allow teams to bypass required status checks:
https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets#about-rulesets
Do not want to include ISCE2 as requirement here.
Will clarify how to stage DEMs for ISCE2 including using fixImageXML.py
from ISCE2 as done here.
Basically, make sure:
ISCE
/usr/local/lib/python3.10/dist-packages/dem_stitcher/stitcher.py:138: UserWarning: We need to localize the tiles as a Geotiff. Saving to tmp_f08d402f-9a1f-4ccc-907c-c35741d781ab
warn(f"We need to localize the tiles as a Geotiff. Saving to {str(tile_dir)}", category=UserWarning)
Downloading srtm_v3 tiles: 0%| | 0/2 [00:00<?, ?it/s]
---------------------------------------------------------------------------
BadZipFile Traceback (most recent call last)
[<ipython-input-22-1ebc4ae49366>](https://localhost:8080/#) in <cell line: 26>()
24 area_or_point = 'Point'
25
---> 26 X, p = stitch_dem(bounds_tif,
27 dem_name = 'srtm_v3', # srtm_v3, nasadem
28 dst_ellipsoidal_height = ellipsoidal_height,
14 frames
[/usr/lib/python3.10/zipfile.py](https://localhost:8080/#) in _RealGetContents(self)
1334 raise BadZipFile("File is not a zip file")
1335 if not endrec:
-> 1336 raise BadZipFile("File is not a zip file")
1337 if self.debug > 1:
1338 print(endrec)
BadZipFile: File is not a zip file
from dem_stitcher import stitch_dem
from dem_stitcher.datasets import DATASETS
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent = "Chrome")
location = geolocator.geocode('rome, italy')
latitude = location.latitude
longitude = location.longitude
factor_lat = 0.2
factor_lon = 0.2
min_lat = float("{:.1f}".format(latitude - factor_lat) )
max_lat = float("{:.1f}".format(latitude + factor_lat) )
min_lon = float("{:.1f}".format(longitude - factor_lon) )
max_lon = float("{:.1f}".format(longitude + factor_lon) )
# as xmin, ymin, xmax, ymax in epsg:4326
bounds_tif = [min_lon, min_lat, max_lon, max_lat]
ellipsoidal_height = False
area_or_point = 'Point'
X, p = stitch_dem(bounds_tif,
dem_name = 'srtm_v3', # srtm_v3, nasadem
dst_ellipsoidal_height = ellipsoidal_height,
dst_area_or_point = area_or_point)
error only occurs when use dem_name :
srtm_v3
and
nasadem
best regards
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.