Skip to content

Commit 59aeddd

Browse files
scottstanieclaude
andauthored
Add NISAR DEM as a new data source (#23)
* Add NISAR DEM as a new data source The NISAR DEM is a Copernicus-derived DEM prepared by JPL for the NISAR mission with EGM2008-to-WGS84 conversion pre-applied and ocean gaps filled. It is accessed via a hierarchical VRT and requires NASA Earthdata credentials for authentication. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix readme * Choose the right VRT for you. * Fix 1-pixel shift between COP and NISAR DEMs by aligning output bounds to source pixel grid When gdal.Warp is called with integer-degree outputBounds (e.g. -104,31,-103,32), the output pixel centers land exactly on the boundary between two source pixels. Nearest-neighbour resampling must break a tie, and the result depends on floating-point rounding of the source VRT origin. The COP and NISAR global VRTs have different origins (-179 vs -180 degrees), causing the rounding to go opposite ways -- COP picks source pixel N while NISAR picks N+1, producing a systematic 1-pixel shift in both X and Y (up to 25m elevation error). The fix snaps outputBounds outward to the nearest source pixel *edge* via utils.align_bounds_to_pixel_grid(). This makes output pixel centers coincide with source pixel centers, so the warp becomes a pure pixel copy -- bit-for-bit identical to reading the raw tiles. The function is idempotent: bounds already on pixel edges pass through unchanged. Result: COP vs NISAR |max| drops from 25.1m to 0.008m (sub-cm, limited by the difference between GDAL's and JPL's EGM2008-to-WGS84 conversion). For a 1-degree integer bbox the output grows from 3600x3600 to 3601x3601 to include boundary pixels. Also adds debug_pixel_shift.py which demonstrates the issue and validates the fix. --- The COP tiles at W180 (the antimeridian strip from -180 to -179) have a different pixel registration than every other COP tile: - Regular COP tiles: pixel edges offset by 1/2 pixel from integer degrees (origin at integer - 0.000139) - W180 tiles: pixel edges offset by 3/4 pixel (origin at -180.000208) Because those W180 tiles don't align with the rest of the grid, they were excluded when building the COP VRT — that's the correct thing to do, since mixing misaligned grids in a VRT would silently resample data. The COP VRT therefore starts at -179, covering 359 degrees. JPL's NISAR VRT covers the full 360 degrees starting at -180, presumably because they resampled everything onto a single consistent grid as part of their post-processing. So the 1-degree origin difference was just a consequence of the COP dataset's own quirk at the antimeridian. The fix (snapping to pixel edges) handles both VRTs correctly regardless of their origins. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * remove debug script --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent bb12cf5 commit 59aeddd

File tree

11 files changed

+391
-13
lines changed

11 files changed

+391
-13
lines changed

README.md

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ A tool for making Digital Elevation Maps (DEMs) in binary data format (16-bit in
66
The `sardem` command creates a cropped (and possibly upsampled) digital elevation map:
77

88
```bash
9-
usage: sardem [-h] [--bbox left bottom right top] [--geojson GEOJSON] [--wkt-file WKT_FILE] [--xrate XRATE] [--yrate YRATE] [--output OUTPUT] [--data-source {NASA,NASA_WATER,COP}] [-isce] [--keep-egm] [--shift-rsc]
9+
usage: sardem [-h] [--bbox left bottom right top] [--geojson GEOJSON] [--wkt-file WKT_FILE] [--xrate XRATE] [--yrate YRATE] [--output OUTPUT] [--data-source {NASA,NASA_WATER,COP,NISAR}] [-isce] [--keep-egm] [--shift-rsc]
1010
[left_lon] [top_lat] [dlon] [dlat]
1111
```
1212

@@ -39,8 +39,8 @@ which will run `pip install --upgrade .` and create the command line script.
3939

4040

4141
## Data sources
42-
The default data source is `--data-source COP`, which uses the newer [Copernicus Digital Surface Model (DSM)](https://registry.opendata.aws/copernicus-dem/). You can also use `--data-source NASA` for the SRTM 1 arcsecond data.
43-
To see a comparison of the two, see the [srtm_copernicus_comparison](notebooks/srtm_copernicus_comparison.ipynb) notebook.
42+
The default data source is `--data-source COP`, which uses the newer [Copernicus Digital Surface Model (DSM)](https://registry.opendata.aws/copernicus-dem/). You can also use `--data-source NASA` for the SRTM 1 arcsecond data, or `--data-source NISAR` for the NISAR DEM (see below).
43+
The [srtm_copernicus_comparison](notebooks/srtm_copernicus_comparison.ipynb) notebook has a comparison of the COP and SRTM 1 data.
4444

4545
**Note:** To convert the elevation values to heights about the WGS84 ellipsoid (which is the default), or to use the Copernicus data, **GDAL is required**.
4646
For the Copernicus data, the minimum required GDAL version is 3.4.2; versions earlier than 3.4.0 seem to hang upon using `gdalwarp` on the global VRT, and <3.4.2 have an internal bug https://github.com/isce-framework/isce2/issues/556 .
@@ -51,22 +51,19 @@ For the Copernicus data, the minimum required GDAL version is 3.4.2; versions ea
5151
`sardem` uses the gdal convention ("pixel is area") where `--bbox` points to the *edges* of the [left, bottom, right, top] pixels.
5252
I.e. (left, bottom) refers to the lower left corner of the lower left pixel.
5353

54-
55-
5654
### Converting to WGS84 ellipsoidal heights from EGM96/EGM2008 geoid heights
5755

5856
GDAL is required for the conversion, which is installed when using `conda install -c conda-forge sardem`.
5957
If you already are using an existing environment, make sure that the GDAL version is >=3.4.2.
6058

61-
```bash
59+
```bash
6260
conda install -c conda-forge "gdal>=3.4.2"
6361

6462
# or
6563
# conda install -c conda-forge mamba
6664
# mamba install -c conda-forge "gdal>=3.4.2"
6765
```
6866

69-
7067
## Command Line Interface
7168

7269
The full options for the command line tool in `sardem/cli.py` can be found using
@@ -76,7 +73,7 @@ sardem --help
7673
```
7774

7875
```bash
79-
usage: sardem [-h] [--bbox left bottom right top] [--geojson GEOJSON] [--wkt-file WKT_FILE] [--xrate XRATE] [--yrate YRATE] [--output OUTPUT] [--data-source {NASA,NASA_WATER,COP}] [-isce] [--keep-egm]
76+
usage: sardem [-h] [--bbox left bottom right top] [--geojson GEOJSON] [--wkt-file WKT_FILE] [--xrate XRATE] [--yrate YRATE] [--output OUTPUT] [--data-source {NASA,NASA_WATER,COP,NISAR}] [-isce] [--keep-egm]
8077
[--shift-rsc] [--cache-dir CACHE_DIR] [--output-format {ENVI,GTiff,ROI_PAC}] [--output-type {int16,float32,uint8}]
8178
[left_lon] [top_lat] [dlon] [dlat]
8279

@@ -123,7 +120,7 @@ options:
123120
Rate in y dir to upsample DEM (default=1, no upsampling)
124121
--output OUTPUT, -o OUTPUT
125122
Name of output dem file (default=elevation.dem for DEM, watermask.wbd for water mask)
126-
--data-source {NASA,NASA_WATER,COP}, -d {NASA,NASA_WATER,COP}
123+
--data-source {NASA,NASA_WATER,COP,NISAR}, -d {NASA,NASA_WATER,COP,NISAR}
127124
Source of DEM data (default COP). See README for more.
128125
-isce, --make-isce-xml
129126
Make an isce2 XML file for the DEM.
@@ -157,6 +154,18 @@ machine urs.earthdata.nasa.gov
157154
password PASSWORD
158155
```
159156
157+
## NISAR DEM
158+
159+
The NISAR DEM (`--data-source NISAR`) is a modified Copernicus DEM prepared by JPL for the NISAR mission. The DEM has been converted to WGS84 ellipsoidal heights, and is available as a hierarchical VRT at `https://nisar.asf.earthdatacloud.nasa.gov/NISAR/DEM/v1.2/EPSG4326/EPSG4326.vrt` for mid-latitudes, `EPSG3031.vrt` for the south pole, `EPSG3413.vrt` for the north pole.
160+
161+
The NISAR DEM requires NASA Earthdata credentials like the SRTM data.
162+
163+
### Usage
164+
165+
```bash
166+
sardem --bbox -104 30 -103 31 --data-source NISAR
167+
```
168+
160169
## Citations and Acknowledgments
161170
162171
### Copernicus DEM
@@ -170,3 +179,5 @@ And include the following attribution notice:
170179
> © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved
171180
172181
For more information about the Copernicus DEM, visit: https://dataspace.copernicus.eu/explore-data/data-collections/copernicus-contributing-missions/collections-description/COP-DEM
182+
183+
When using the NISAR DEM (`--data-source NISAR`), [you can cite the data as described here.](https://www.earthdata.nasa.gov/data/catalog/asf-nisar-dem-1#toc-citation)

sardem/cli.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def positive_small_int(argstring):
4040
sardem --geojson dem_area.geojson -x 11 -y 3 # Use geojson file to define area
4141
sardem --bbox -156 18.8 -154.7 20.3 --data-source NASA_WATER -o my_watermask.wbd # Water mask
4242
sardem --bbox -156 18.8 -154.7 20.3 --data COP -isce # Generate .isce XML files as well
43+
sardem --bbox -104 30 -103 31 --data-source NISAR # NISAR DEM (requires Earthdata login)
4344
4445
4546
Default out is elevation.tif for GTiff format (the default).
@@ -158,7 +159,7 @@ def get_cli_args():
158159
"-of",
159160
choices=["ENVI", "GTiff", "ROI_PAC"],
160161
default="GTiff",
161-
help="Output format (default %(default)s). Used for COP data; NASA data always outputs ENVI format.",
162+
help="Output format (default %(default)s). Used for COP/NISAR data; NASA data always outputs ENVI format.",
162163
)
163164
parser.add_argument(
164165
"--output-type",

sardem/cop_dem.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def download_and_stitch(
5858
# access_mode = "overwrite" if overwrite else None
5959
option_dict = dict(
6060
format=output_format,
61-
outputBounds=bbox,
61+
outputBounds=utils.align_bounds_to_pixel_grid(bbox),
6262
dstSRS=t_srs,
6363
srcSRS=s_srs,
6464
xRes=xres,

sardem/dem.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,28 @@ def main(
366366
utils.gdal2isce_xml(output_name, keep_egm=keep_egm)
367367
return
368368

369+
if data_source == "NISAR":
370+
if keep_egm:
371+
logger.info(
372+
"NISAR DEM is already in WGS84 ellipsoidal heights;"
373+
" --keep-egm has no effect."
374+
)
375+
utils._gdal_installed_correctly()
376+
from sardem import nisar_dem
377+
378+
nisar_dem.download_and_stitch(
379+
output_name,
380+
bbox,
381+
xrate=xrate,
382+
yrate=yrate,
383+
output_format=output_format,
384+
output_type=output_type,
385+
)
386+
if make_isce_xml:
387+
logger.info("Creating ISCE2 XML file")
388+
utils.gdal2isce_xml(output_name, keep_egm=False)
389+
return
390+
369391
# If using SRTM, download tiles manually and stitch
370392
if output_format != "ENVI":
371393
logger.warning(

sardem/download.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ class Downloader:
194194
DATA_URLS = {
195195
"NASA": "https://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/2000.02.11",
196196
"NASA_WATER": "https://e4ftl01.cr.usgs.gov/MEASURES/SRTMSWBD.003/2000.02.11",
197-
"COP": "https://copernicus-dem-30m.s3.amazonaws.com/{t}/{t}.tif"
197+
"COP": "https://copernicus-dem-30m.s3.amazonaws.com/{t}/{t}.tif",
198+
"NISAR": "https://nisar.asf.earthdatacloud.nasa.gov/NISAR/DEM/v1.2/EPSG4326/EPSG4326.vrt"
198199
}
199200
VALID_SOURCES = DATA_URLS.keys()
200201
TILE_ENDINGS = {

sardem/nisar_dem.py

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
import logging
2+
import netrc
3+
import os
4+
from copy import deepcopy
5+
6+
from sardem import utils
7+
from sardem.constants import DEFAULT_RES
8+
9+
_NISAR_BASE_URL = "https://nisar.asf.earthdatacloud.nasa.gov/NISAR/DEM/v1.2"
10+
NISAR_VRTS = {
11+
"EPSG4326": f"{_NISAR_BASE_URL}/EPSG4326/EPSG4326.vrt",
12+
"EPSG3031": f"{_NISAR_BASE_URL}/EPSG3031/EPSG3031.vrt", # South pole
13+
"EPSG3413": f"{_NISAR_BASE_URL}/EPSG3413/EPSG3413.vrt", # North pole
14+
}
15+
# Latitude thresholds for switching to polar stereographic VRTs
16+
_SOUTH_POLE_LAT = -60.0
17+
_NORTH_POLE_LAT = 60.0
18+
19+
EARTHDATA_HOST = "urs.earthdata.nasa.gov"
20+
21+
logger = logging.getLogger("sardem")
22+
utils.set_logger_handler(logger)
23+
24+
25+
def _check_earthdata_credentials() -> None:
26+
"""Verify that ~/.netrc has credentials for urs.earthdata.nasa.gov.
27+
28+
Raises
29+
------
30+
RuntimeError
31+
If credentials are missing or incomplete.
32+
"""
33+
netrc_path = os.path.expanduser("~/.netrc")
34+
try:
35+
nrc = netrc.netrc(netrc_path)
36+
auth = nrc.authenticators(EARTHDATA_HOST)
37+
assert auth is not None and auth[0] and auth[2]
38+
except (OSError, netrc.NetrcParseError, AssertionError):
39+
raise RuntimeError(
40+
"NASA Earthdata credentials not found in ~/.netrc for"
41+
f" {EARTHDATA_HOST}.\n"
42+
"The NISAR DEM requires a free NASA Earthdata account.\n"
43+
"Sign up at: https://urs.earthdata.nasa.gov/users/new\n"
44+
"Then add to ~/.netrc:\n"
45+
f" machine {EARTHDATA_HOST}\n"
46+
" login <username>\n"
47+
" password <password>"
48+
)
49+
50+
51+
def _configure_gdal_auth() -> None:
52+
"""Set GDAL config options for cookie-based NASA Earthdata authentication."""
53+
from osgeo import gdal
54+
55+
cookie_file = os.path.join(utils.get_cache_dir(), "earthdata_cookies.txt")
56+
gdal.SetConfigOption("GDAL_HTTP_COOKIEFILE", cookie_file)
57+
gdal.SetConfigOption("GDAL_HTTP_COOKIEJAR", cookie_file)
58+
gdal.SetConfigOption("GDAL_HTTP_AUTH", "BASIC")
59+
gdal.SetConfigOption("GDAL_HTTP_NETRC", "YES")
60+
61+
62+
def _select_vrt(bbox: tuple) -> tuple[str, str | None]:
63+
"""Choose the appropriate NISAR VRT and output SRS based on bbox latitude.
64+
65+
Parameters
66+
----------
67+
bbox : tuple
68+
(left, bottom, right, top) in degrees.
69+
70+
Returns
71+
-------
72+
vrt_url : str
73+
The ``/vsicurl/`` URL to the selected VRT.
74+
dst_srs : str or None
75+
Target SRS for ``gdal.Warp``. ``None`` when the VRT is already
76+
EPSG:4326; ``"EPSG:4326"`` when reprojecting from a polar VRT.
77+
"""
78+
_left, bottom, _right, top = bbox
79+
if top <= _SOUTH_POLE_LAT:
80+
key = "EPSG3031"
81+
elif bottom >= _NORTH_POLE_LAT:
82+
key = "EPSG3413"
83+
else:
84+
key = "EPSG4326"
85+
url = "/vsicurl/" + NISAR_VRTS[key]
86+
dst_srs = "EPSG:4326" if key != "EPSG4326" else None
87+
logger.info("Selected NISAR VRT: %s", key)
88+
return url, dst_srs
89+
90+
91+
def download_and_stitch(
92+
output_name: str,
93+
bbox: tuple,
94+
xrate: int = 1,
95+
yrate: int = 1,
96+
vrt_filename: str | None = None,
97+
output_format: str = "GTiff",
98+
output_type: str = "float32",
99+
) -> None:
100+
"""Download the NISAR DEM via its global VRT.
101+
102+
The NISAR DEM is a Copernicus-derived DEM prepared by JPL with
103+
EGM2008-to-WGS84 conversion pre-applied and ocean gaps filled.
104+
No vertical datum conversion is needed.
105+
106+
Parameters
107+
----------
108+
output_name : str
109+
Path for the output DEM file.
110+
bbox : tuple
111+
(left, bottom, right, top) in degrees.
112+
xrate : int
113+
Column upsampling rate.
114+
yrate : int
115+
Row upsampling rate.
116+
vrt_filename : str, optional
117+
Override the VRT source (for testing). Defaults to the NISAR VRT URL.
118+
output_format : str
119+
GDAL output format (default ``"GTiff"``).
120+
output_type : str
121+
GDAL output data type (default ``"float32"``).
122+
123+
References
124+
----------
125+
https://nisar.asf.earthdatacloud.nasa.gov/NISAR/DEM/v1.2/EPSG4326/
126+
"""
127+
from osgeo import gdal
128+
129+
gdal.UseExceptions()
130+
131+
dst_srs = None
132+
if vrt_filename is None:
133+
_check_earthdata_credentials()
134+
_configure_gdal_auth()
135+
vrt_filename, dst_srs = _select_vrt(bbox)
136+
137+
xres = DEFAULT_RES / xrate
138+
yres = DEFAULT_RES / yrate
139+
resamp = "bilinear" if (xrate > 1 or yrate > 1) else "nearest"
140+
141+
option_dict = dict(
142+
format=output_format,
143+
outputBounds=utils.align_bounds_to_pixel_grid(bbox),
144+
dstSRS=dst_srs,
145+
xRes=xres,
146+
yRes=yres,
147+
outputType=gdal.GetDataTypeByName(output_type.title()),
148+
resampleAlg=resamp,
149+
multithread=True,
150+
warpMemoryLimit=5000,
151+
warpOptions=["NUM_THREADS=4"],
152+
)
153+
154+
logger.info("Creating %s", output_name)
155+
logger.info("Fetching remote tiles...")
156+
try:
157+
cmd = _gdal_cmd_from_options(vrt_filename, output_name, option_dict)
158+
logger.info("Running GDAL command:")
159+
logger.info(cmd)
160+
except Exception:
161+
logger.info("Running gdal.Warp with options:")
162+
logger.info(option_dict)
163+
164+
option_dict["callback"] = gdal.TermProgress
165+
gdal.Warp(output_name, vrt_filename, options=gdal.WarpOptions(**option_dict))
166+
167+
168+
def _gdal_cmd_from_options(src: str, dst: str, option_dict: dict) -> str:
169+
"""Build an equivalent ``gdalwarp`` CLI string for debugging."""
170+
from osgeo import gdal
171+
172+
opts = deepcopy(option_dict)
173+
opts["options"] = "__RETURN_OPTION_LIST__"
174+
opt_list = gdal.WarpOptions(**opts)
175+
out_opt_list = deepcopy(opt_list)
176+
for idx, o in enumerate(opt_list):
177+
if o.endswith("srs"):
178+
out_opt_list[idx + 1] = '"{}"'.format(out_opt_list[idx + 1])
179+
return "gdalwarp {} {} {}".format(src, dst, " ".join(out_opt_list))
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<VRTDataset rasterXSize="72000" rasterYSize="36000">
2+
<SRS dataAxisToSRSAxisMapping="2,1">GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]</SRS>
3+
<GeoTransform> -1.6000013888888890e+02, 2.7777777777777778e-04, 0.0000000000000000e+00, 2.0000138888888888e+01, 0.0000000000000000e+00, -2.7777777777777778e-04</GeoTransform>
4+
<VRTRasterBand dataType="Int16" band="1">
5+
<ColorInterp>Gray</ColorInterp>
6+
<SimpleSource>
7+
<SourceFilename relativeToVRT="0">/vsizip/{data_path}/cop_tile_hawaii.dem.zip/cop_tile_hawaii.dem</SourceFilename>
8+
<SourceBand>1</SourceBand>
9+
<SrcRect xOff="0" yOff="0" xSize="3600" ySize="3600" />
10+
<DstRect xOff="14400" yOff="0" xSize="3600" ySize="3600" />
11+
</SimpleSource>
12+
</VRTRasterBand>
13+
</VRTDataset>

sardem/tests/data/nisar_NW.vrt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<VRTDataset rasterXSize="644400" rasterYSize="324000">
2+
<SRS dataAxisToSRSAxisMapping="2,1">GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]</SRS>
3+
<GeoTransform> -1.7900013888888890e+02, 2.7777777777780000e-04, 0.0000000000000000e+00, 9.0000138888888884e+01, 0.0000000000000000e+00, -2.7777777777780000e-04</GeoTransform>
4+
<VRTRasterBand dataType="Int16" band="1">
5+
<ColorInterp>Gray</ColorInterp>
6+
<SimpleSource>
7+
<SourceFilename relativeToVRT="1">N10_W160_nisar.vrt</SourceFilename>
8+
<SourceBand>1</SourceBand>
9+
<SrcRect xOff="0" yOff="0" xSize="72000" ySize="36000" />
10+
<DstRect xOff="68400" yOff="252000" xSize="72000" ySize="36000" />
11+
</SimpleSource>
12+
</VRTRasterBand>
13+
</VRTDataset>

sardem/tests/data/nisar_global.vrt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<VRTDataset rasterXSize="1292400" rasterYSize="648000">
2+
<SRS dataAxisToSRSAxisMapping="2,1">GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]</SRS>
3+
<GeoTransform> -1.7900013888888890e+02, 2.7777777777780000e-04, 0.0000000000000000e+00, 9.0000138888888884e+01, 0.0000000000000000e+00, -2.7777777777780000e-04</GeoTransform>
4+
<VRTRasterBand dataType="Int16" band="1">
5+
<ColorInterp>Gray</ColorInterp>
6+
<SimpleSource>
7+
<SourceFilename relativeToVRT="1">nisar_NW.vrt</SourceFilename>
8+
<SourceBand>1</SourceBand>
9+
<SrcRect xOff="0" yOff="0" xSize="644400" ySize="324000" />
10+
<DstRect xOff="0" yOff="0" xSize="644400" ySize="324000" />
11+
</SimpleSource>
12+
</VRTRasterBand>
13+
</VRTDataset>

0 commit comments

Comments
 (0)