Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] master from OSGeo:master #101

Merged
merged 43 commits into from
Dec 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
0a92b2b
OpenFileGDB: be robust to unusual .gdbindexes files with weid/corrupt…
rouault Nov 27, 2024
9d11534
test_ogr_layer_algebra: avoid failure on CI sanitize
rouault Nov 28, 2024
a0562d6
Fix memory leak when calling GDALAllRegister(), several times, on a d…
rouault Nov 28, 2024
b24644d
GTiff/gdalwarp/COG: preserve pre-multiplied alpha information from so…
rouault Nov 28, 2024
ac0aeac
Zarr: fix incorrect DataAxisToSRSAxisMapping for EPSG geographic CRS
rouault Nov 28, 2024
d80b2ce
netCDF multidim: report correct axis order when reading SRS with EPSG…
rouault Nov 28, 2024
2a6b838
Doc: Add summary of user survey
dbaston Nov 29, 2024
9b1e1cc
Merge pull request #11388 from dbaston/doc-survey-2024
rouault Nov 29, 2024
76f0d66
PG: avoid error when the original search_path contains something like…
rouault Nov 29, 2024
f65cd7e
GeoJSON(-like) drivers: combine value of GDAL_HTTP_HEADERS with Accep…
rouault Nov 29, 2024
a94bf6f
Update port/cpl_known_config_options.h
rouault Nov 29, 2024
2f6bbca
HTTP driver: re-emit warnings/errors raised by underlying driver
rouault Nov 29, 2024
a4aa0b5
OGRSpatialReference::importFromEPSG(): tries with ESRI when it looks …
rouault Nov 29, 2024
2a89c3b
WMTS: for geographic CRS with official lat,lon order, be robust to bo…
rouault Nov 29, 2024
71a99cb
OGRGeometry classes: make clone() detect out-of-memory and return null
rouault Nov 29, 2024
8caa85c
OGRGeometryToHexEWKB(): return empty string if out of memory happened
rouault Nov 29, 2024
d29b194
CPLBinaryToHex(): make it return empty string if out of memory happened
rouault Nov 29, 2024
4b18b1b
PG: detect out-of-memory on large geometries
rouault Nov 29, 2024
dee8867
PGDump: detect out-of-memory on large geometries
rouault Nov 29, 2024
4cc16e2
heif: geoheif properties cleanup
bradh Nov 29, 2024
eb73288
Update ogr_feature_style.rst
jidanni Nov 30, 2024
297d465
Merge pull request #11399 from jidanni/patch-60
rouault Nov 30, 2024
a29fb99
geoheif: clarify safe curie parsing
bradh Nov 30, 2024
bf030df
Bump Chizkiyahu/delete-untagged-ghcr-action from 4.0.1 to 5.0.0
dependabot[bot] Dec 1, 2024
eed8db1
Bump msys2/setup-msys2 from 2.24.1 to 2.25.0
dependabot[bot] Dec 1, 2024
0206eea
Bump github/codeql-action from 3.27.0 to 3.27.5
dependabot[bot] Dec 1, 2024
1487e3c
Bump conda-incubator/setup-miniconda from 3.0.4 to 3.1.0
dependabot[bot] Dec 1, 2024
734ffb3
Merge pull request #11376 from rouault/fix_rasterio_3250
rouault Dec 1, 2024
f1eb197
Merge pull request #11401 from OSGeo/dependabot/github_actions/Chizki…
rouault Dec 1, 2024
f6140e2
Merge pull request #11402 from OSGeo/dependabot/github_actions/msys2/…
rouault Dec 1, 2024
3f8b359
Merge pull request #11403 from OSGeo/dependabot/github_actions/github…
rouault Dec 1, 2024
362584f
Merge pull request #11404 from OSGeo/dependabot/github_actions/conda-…
rouault Dec 1, 2024
87f0de1
GeoHEIF: Fixed respecting CRS axis order (e.g., for EPSG:4326)
jerstlouis Nov 28, 2024
9215925
MVT: emit warning when the maximum tile size or feature count is reac…
rouault Dec 2, 2024
a376b10
Merge pull request #11394 from rouault/harden_large_geoms
rouault Dec 2, 2024
59f0c0a
Merge pull request #11391 from rouault/fix_11385
rouault Dec 2, 2024
15c1b0d
Merge pull request #11390 from rouault/fix_11387
rouault Dec 2, 2024
770772a
Merge pull request #11389 from rouault/fix_11386
rouault Dec 2, 2024
a8c6484
Merge pull request #11382 from rouault/netcdf_multidim_geog_height
rouault Dec 2, 2024
65647ad
Merge pull request #11381 from rouault/fix_zarr_crs_data_axis_mapping
rouault Dec 2, 2024
2726d8e
Merge pull request #11379 from rouault/fix_11377
rouault Dec 2, 2024
8aa45ea
Merge pull request #11372 from rouault/fix_11295
rouault Dec 2, 2024
29c140f
Merge pull request #11384 from jerstlouis/master
rouault Dec 2, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/asan/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ cmake ${GDAL_SOURCE_DIR:=..} \
-DUSE_CCACHE=ON \
-DGDAL_USE_GEOTIFF_INTERNAL=ON \
-DGDAL_USE_TIFF_INTERNAL=ON \
-DGDAL_ENABLE_DRIVER_PDF_PLUGIN=ON \
-DGDAL_USE_LIBKML=OFF -DOGR_ENABLE_DRIVER_LIBKML=OFF \
-DFileGDB_ROOT=/usr/local/FileGDB_API
make -j$NPROC
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/asan/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ export PYTHONMALLOC=malloc
gdalinfo autotest/gcore/data/byte.tif
python3 -c "from osgeo import gdal; print('yes')"

# Check fix for https://github.com/rasterio/rasterio/issues/3250
mv ${GDAL_DRIVER_PATH}/gdal_PDF.so ${GDAL_DRIVER_PATH}/gdal_PDF.so.disabled
echo "from osgeo import gdal" > register_many_times.py
echo "for i in range(1000):" >> register_many_times.py
echo " gdal.AllRegister()" >> register_many_times.py
python3 register_many_times.py
mv ${GDAL_DRIVER_PATH}/gdal_PDF.so.disabled ${GDAL_DRIVER_PATH}/gdal_PDF.so

cd autotest

# Run each module in its own pytest process.
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/cmake_builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ jobs:
- name: Checkout GDAL
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- name: Install development packages
uses: msys2/setup-msys2@ddf331adaebd714795f1042345e6ca57bd66cea8 # v2.24.1
uses: msys2/setup-msys2@c52d1fa9c7492275e60fe763540fb601f5f232a1 # v2.25.0
with:
msystem: MINGW64
update: true
Expand Down Expand Up @@ -418,7 +418,7 @@ jobs:
shell: pwsh
run: |
echo "JAVA_HOME=$env:JAVA_HOME_11_X64" >> %GITHUB_ENV%
- uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3.0.4
- uses: conda-incubator/setup-miniconda@d2e6a045a86077fb6cad6f5adf368e9076ddaa8d # v3.1.0
with:
activate-environment: gdalenv
miniforge-version: latest
Expand Down Expand Up @@ -525,7 +525,7 @@ jobs:
git config --global core.autocrlf false
- name: Checkout GDAL
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3.0.4
- uses: conda-incubator/setup-miniconda@d2e6a045a86077fb6cad6f5adf368e9076ddaa8d # v3.1.0
with:
activate-environment: gdalenv
miniforge-version: latest
Expand Down Expand Up @@ -696,7 +696,7 @@ jobs:
git config --global core.autocrlf false
- name: Checkout GDAL
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
- uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3.0.4
- uses: conda-incubator/setup-miniconda@d2e6a045a86077fb6cad6f5adf368e9076ddaa8d # v3.1.0
with:
activate-environment: gdalenv
python-version: 3.9
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ jobs:
# We do that after running CMake to avoid CodeQL to trigger during CMake time,
# in particular during HDF5 detection which is terribly slow (https://github.com/OSGeo/gdal/issues/9549)
- name: Initialize CodeQL
uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
Expand All @@ -129,6 +129,6 @@ jobs:
cmake --build build -j$(nproc)

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
category: "/language:${{matrix.language}}"
2 changes: 1 addition & 1 deletion .github/workflows/conda.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
path: ~/conda_pkgs_dir
key: ${{ runner.os }}-${{ steps.get-date.outputs.today }}-conda-${{ env.CACHE_NUMBER }}

- uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3.0.4
- uses: conda-incubator/setup-miniconda@d2e6a045a86077fb6cad6f5adf368e9076ddaa8d # v3.1.0
with:
miniforge-version: latest
use-mamba: true
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/delete_untagged_containers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
if: github.repository == 'OSGeo/gdal'
steps:
- name: Delete all containers from gdal-deps without tags
uses: Chizkiyahu/delete-untagged-ghcr-action@b302990b6c629f3b272a31f3c3a268e1f7d0ffae # v4.0.1
uses: Chizkiyahu/delete-untagged-ghcr-action@1c77a06b7f80ad4beb82b85919003831d47277d1 # v5.0.0
with:
token: ${{ secrets.PAT_TOKEN_DELETE_UNTAGGED_CONTAINERS }}
repository_owner: ${{ github.repository_owner }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:

- uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0

- uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3.0.4
- uses: conda-incubator/setup-miniconda@d2e6a045a86077fb6cad6f5adf368e9076ddaa8d # v3.1.0
with:
channels: conda-forge
auto-update-conda: true
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,6 @@ jobs:

# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
sarif_file: results.sarif
13 changes: 13 additions & 0 deletions apps/gdalwarp_lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4712,6 +4712,19 @@ static GDALDatasetH GDALWarpCreateOutput(
aosCreateOptions.FetchNameValue("PHOTOMETRIC") == nullptr)
{
aosCreateOptions.SetNameValue("PHOTOMETRIC", "RGB");

// Preserve potential ALPHA=PREMULTIPLIED from source alpha band
const char *pszAlpha;
if (aosCreateOptions.FetchNameValue("ALPHA") == nullptr &&
apeColorInterpretations.size() == 4 &&
apeColorInterpretations[3] == GCI_AlphaBand &&
GDALGetRasterCount(pahSrcDS[0]) == 4 &&
(pszAlpha =
GDALGetMetadataItem(GDALGetRasterBand(pahSrcDS[0], 4),
"ALPHA", "IMAGE_STRUCTURE")))
{
aosCreateOptions.SetNameValue("ALPHA", pszAlpha);
}
}

/* The GTiff driver now supports writing band color interpretation */
Expand Down
29 changes: 29 additions & 0 deletions autotest/gcore/cog.py
Original file line number Diff line number Diff line change
Expand Up @@ -1961,3 +1961,32 @@ def test_cog_write_check_golden_file(tmp_path, src_filename, creation_options):
)
assert os.stat(src_filename).st_size == os.stat(out_filename).st_size
assert open(src_filename, "rb").read() == open(out_filename, "rb").read()


###############################################################################


def test_cog_preserve_ALPHA_PREMULTIPLIED_on_copy(tmp_vsimem):

src_filename = str(tmp_vsimem / "src.tif")
src_ds = gdal.GetDriverByName("GTiff").Create(
src_filename, 1, 1, 4, options=["ALPHA=PREMULTIPLIED", "PROFILE=BASELINE"]
)
src_ds.SetGeoTransform([500000, 1, 0, 4500000, 0, -1])
srs = osr.SpatialReference()
srs.ImportFromEPSG(32631)
src_ds.SetProjection(srs.ExportToWkt())

out_filename = str(tmp_vsimem / "out.tif")
gdal.GetDriverByName("COG").CreateCopy(
out_filename,
src_ds,
options=[
"TILING_SCHEME=GoogleMapsCompatible",
],
)
with gdal.Open(out_filename) as ds:
assert (
ds.GetRasterBand(4).GetMetadataItem("ALPHA", "IMAGE_STRUCTURE")
== "PREMULTIPLIED"
)
29 changes: 28 additions & 1 deletion autotest/gcore/tiff_write.py
Original file line number Diff line number Diff line change
Expand Up @@ -948,7 +948,7 @@ def test_tiff_write_20():


###############################################################################
# Test RGBA images with TIFFTAG_EXTRASAMPLES=EXTRASAMPLE_ASSOCALPHA
# Test RGBA images with TIFFTAG_EXTRASAMPLES=EXTRASAMPLE_UNASSOCALPHA


def test_tiff_write_21():
Expand Down Expand Up @@ -11927,3 +11927,30 @@ def test_tiff_write_check_golden_file(tmp_path, src_filename, creation_options):
)
assert os.stat(src_filename).st_size == os.stat(out_filename).st_size
assert open(src_filename, "rb").read() == open(out_filename, "rb").read()


###############################################################################
# Test preserving ALPHA=PREMULTIPLIED on copy


def test_tiff_write_preserve_ALPHA_PREMULTIPLIED_on_copy(tmp_path):

src_filename = str(tmp_path / "src.tif")
out_filename = str(tmp_path / "out.tif")
gdal.GetDriverByName("GTiff").Create(
src_filename, 1, 1, 4, options=["ALPHA=PREMULTIPLIED", "PROFILE=BASELINE"]
)
assert gdal.VSIStatL(src_filename + ".aux.xml") is None
with gdal.Open(src_filename) as src_ds:
assert (
src_ds.GetRasterBand(4).GetMetadataItem("ALPHA", "IMAGE_STRUCTURE")
== "PREMULTIPLIED"
)
gdal.GetDriverByName("GTiff").CreateCopy(
out_filename, src_ds, options=["PROFILE=BASELINE"]
)
with gdal.Open(out_filename) as out_ds:
assert (
out_ds.GetRasterBand(4).GetMetadataItem("ALPHA", "IMAGE_STRUCTURE")
== "PREMULTIPLIED"
)
11 changes: 11 additions & 0 deletions autotest/gdrivers/avif.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,9 @@ def test_avif_geoheif_wkt2():
assert ds.GetGeoTransform() == pytest.approx(
[691000.0, 0.1, 0.0, 6090000.0, 0.0, -0.1]
)
assert ds.GetSpatialRef() is not None
assert ds.GetSpatialRef().GetAuthorityName(None) == "EPSG"
assert ds.GetSpatialRef().GetAuthorityCode(None) == "28355"
assert ds.GetGCPCount() == 1
gcp = ds.GetGCPs()[0]
assert (
Expand Down Expand Up @@ -313,6 +316,10 @@ def test_avif_geoheif_uri():
assert ds.GetGeoTransform() == pytest.approx(
[691051.2, 0.1, 0.0, 6090000.0, 0.0, -0.1]
)
assert ds.GetSpatialRef() is not None
assert ds.GetSpatialRef().GetAuthorityName(None) == "EPSG"
assert ds.GetSpatialRef().GetAuthorityCode(None) == "32755"

assert ds.GetGCPCount() == 1
gcp = ds.GetGCPs()[0]
assert (
Expand Down Expand Up @@ -340,6 +347,10 @@ def test_avif_geoheif_curie():
== 'CCBY "Jacobs Group (Australia) Pty Ltd and Australian Capital Territory"'
)
assert ds.GetMetadataItem("TAGS", "DESCRIPTION_en-AU") == "copyright"
assert ds.GetSpatialRef() is not None
assert ds.GetSpatialRef().GetAuthorityName(None) == "EPSG"
assert ds.GetSpatialRef().GetAuthorityCode(None) == "32755"

assert ds.GetGeoTransform() is not None
assert ds.GetGeoTransform() == pytest.approx(
[691051.2, 0.1, 0.0, 6090000.0, 0.0, -0.1]
Expand Down
6 changes: 3 additions & 3 deletions autotest/gdrivers/avif_heif.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ def _has_geoheif_support():
assert ds.GetGeoTransform() == pytest.approx(
[691000.0, 0.1, 0.0, 6090000.0, 0.0, -0.1]
)
print()
print("GCPs from avif_heif: ", ds.GetGCPCount())
print()
assert ds.GetSpatialRef() is not None
assert ds.GetSpatialRef().GetAuthorityName(None) == "EPSG"
assert ds.GetSpatialRef().GetAuthorityCode(None) == "28355"
assert ds.GetGCPCount() == 1
gcp = ds.GetGCPs()[0]
assert (
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" version="1.0.0">
<!-- Service Identification -->
<ows:ServiceIdentification>
<ows:Title>THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018</ows:Title>
<ows:ServiceType>OGC WMTS</ows:ServiceType>
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
</ows:ServiceIdentification> <!-- Operations Metadata -->
<ows:OperationsMetadata>
<ows:Operation name="GetCapabilities">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:href="https://trek.nasa.gov/tiles/Mars/EQ/THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018/1.0.0/WMTSCapabilities.xml">
<ows:Constraint name="GetEncoding">
<ows:AllowedValues>
<ows:Value>RESTful</ows:Value>
</ows:AllowedValues>
</ows:Constraint>
</ows:Get>

</ows:HTTP>
</ows:DCP>
</ows:Operation>
<ows:Operation name="GetTile">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:href="https://trek.nasa.gov/tiles/Mars/EQ/THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018/1.0.0/">
<ows:Constraint name="GetEncoding">
<ows:AllowedValues>
<ows:Value>RESTful</ows:Value>
</ows:AllowedValues>
</ows:Constraint>
</ows:Get>

</ows:HTTP>
</ows:DCP>
</ows:Operation>
</ows:OperationsMetadata>
<Contents>
<!--Layer-->
<Layer>
<ows:Title>THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018</ows:Title>
<ows:Identifier>THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018</ows:Identifier>
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG::104905">
<ows:LowerCorner>-179.9999997 -65.0006576</ows:LowerCorner>
<ows:UpperCorner>179.9998849 65.0007535</ows:UpperCorner>
</ows:BoundingBox>
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
<ows:LowerCorner>-179.9999997 -65.0006576</ows:LowerCorner>
<ows:UpperCorner>179.9998849 65.0007535</ows:UpperCorner>
</ows:WGS84BoundingBox>

<Style isDefault="true">
<ows:Title>Default Style</ows:Title>
<ows:Identifier>default</ows:Identifier>
</Style>
<Format>image/png</Format>
<TileMatrixSetLink>
<TileMatrixSet>default028mm</TileMatrixSet>
</TileMatrixSetLink>
<ResourceURL format="image/png" resourceType="tile" template="https://trek.nasa.gov/tiles/Mars/EQ/THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018/1.0.0//{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png"/>
</Layer> <!--TileMatrixSet-->
<TileMatrixSet>
<ows:Title>default</ows:Title>
<ows:Abstract>The tile matrix set that has scale values calculated based on the dpi defined by OGC specification (dpi assumes 0.28mm as the physical distance of a pixel).</ows:Abstract>
<ows:Identifier>default028mm</ows:Identifier>
<ows:SupportedCRS>urn:ogc:def:crs:EPSG::104905</ows:SupportedCRS>
<TileMatrix><ows:Identifier>0</ows:Identifier><ScaleDenominator>2.7922763629807472E+08</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>2.0</MatrixWidth><MatrixHeight>1.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>1</ows:Identifier><ScaleDenominator>1.3961381814903736E+08</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>4.0</MatrixWidth><MatrixHeight>2.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>2</ows:Identifier><ScaleDenominator>6.9806909074518681E+07</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>8.0</MatrixWidth><MatrixHeight>4.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>3</ows:Identifier><ScaleDenominator>3.4903454537259340E+07</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>16.0</MatrixWidth><MatrixHeight>8.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>4</ows:Identifier><ScaleDenominator>1.7451727268629670E+07</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>32.0</MatrixWidth><MatrixHeight>16.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>5</ows:Identifier><ScaleDenominator>8.7258636343148351E+06</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>64.0</MatrixWidth><MatrixHeight>32.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>6</ows:Identifier><ScaleDenominator>4.3629318171574175E+06</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>128.0</MatrixWidth><MatrixHeight>64.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>7</ows:Identifier><ScaleDenominator>2.1814659085787088E+06</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>256.0</MatrixWidth><MatrixHeight>128.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>8</ows:Identifier><ScaleDenominator>1.0907329542893544E+06</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>512.0</MatrixWidth><MatrixHeight>256.0</MatrixHeight></TileMatrix>
<TileMatrix><ows:Identifier>9</ows:Identifier><ScaleDenominator>5.4536647714467719E+05</ScaleDenominator><TopLeftCorner>-180.0 90.0</TopLeftCorner><TileWidth>256</TileWidth><TileHeight>256</TileHeight><MatrixWidth>1024.0</MatrixWidth><MatrixHeight>512.0</MatrixHeight></TileMatrix>

<!--<TileMatrix>
<ows:Identifier>0</ows:Identifier>
<ScaleDenominator>2.3623511904761901E8</ScaleDenominator>
<TopLeftCorner>-180.0 90.0</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>3</MatrixWidth>
<MatrixHeight>2</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>1</ows:Identifier>
<ScaleDenominator>1.1811755952380951E8</ScaleDenominator>
<TopLeftCorner>-180.0 90.0</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>5</MatrixWidth>
<MatrixHeight>3</MatrixHeight>
</TileMatrix>
-->

</TileMatrixSet>
</Contents>
<ServiceMetadataURL xlink:href="https://trek.nasa.gov/tiles/Mars/EQ/THEMIS_NightIR_ControlledMosaics_100m_v2_oct2018/1.0.0/WMTSCapabilities.xml"/>
</Capabilities>
Loading
Loading