Satellite PNG — lossless satellite tiles for GIS and scientific maps
Satellite PNG is the scheme for delivering satellite imagery to web maps as lossless 256×256 PNG tiles, using the same XYZ schema as satellite JPG but without compression loss. A tile weighs 4–10× more than the equivalent JPEG (60–200 KB vs 15–25 KB) but conveys each pixel exactly as in the source. This is critical for scientific use, for tiles with transparency (overlays over a base map), for line-art data (land classification, cloud masks), for tiles with alpha channel (semi-transparent heat maps). When bandwidth isn't the main concern but accuracy is — you pick PNG.
History: lossless tile when bandwidth isn't paramount
If satellite JPG was born from minimizing bandwidth for global consumer maps (Google Maps, Bing Maps), satellite PNG grew in the GIS community where priorities differ: accuracy, transparency, analytical reproducibility. ArcGIS Server, GeoServer, MapServer WMS servers have always supported PNG as an optional output format alongside JPEG.
The OGC WMS standard from 2000 lists PNG as an allowed output format via FORMAT=image/png parameter in HTTP requests. Already then it was clear: for multi-spectral analysis, for alpha-channel overlay, for classification maps where each pixel has meaning — JPEG doesn't suffice due to compression artifacts. PNG became the standard for all those cases.
By 2010 this dichotomy stabilized: JPEG for basemap (pretty background map), PNG for thematic overlays (land classification, cloud masks, pressure isobars, temperature). Google Earth Engine, Sentinel Hub, ArcGIS Online — all serve basemap as JPEG but any derived layers (NDVI rendered in colormap, classification map) — as PNG.
With COG (Cloud-Optimized GeoTIFF) appearing in 2018, some use cases moved out of PNG tiles back to native raster (COG supports HTTP range requests). But for WMS-compatible APIs and web maps PNG remains the first choice when you need lossless + transparency.
What's inside a Satellite PNG tile
From a file standpoint — regular PNG. RGB or RGBA (with alpha channel), 8 or 16 bits per channel. PNG uses deflate compression (lossless), giving a typical satellite tile 60–150 KB for "good green coverage" or 100–250 KB for urban texture with many color details.
Transparency is implemented via alpha channel (4th RGBA channel) or color-keyed transparency (one color marked as transparent). Alpha gives partial transparency gradients; color-keyed — only binary. Modern tile servers almost always use alpha.
16-bit mode matters for scientific data. For example, NDVI has range −1 to +1, which encodes nicely into 16-bit signed (−32768 to 32767). JPEG compression isn't possible for 16-bit (standard JPEG is 8-bit only, JPEG 2000 handles 16-bit but is rarely supported). 16-bit PNG is the only practical lossless format for scientific aggregation.
PNG file size directly correlates with tile visual complexity. Pure forest greenery — 30–60 KB. Urban square with many buildings — 150–250 KB. Snapshot with high noise (low-contrast SAR) — 200–400 KB. JPEG compresses similarly regardless of content (15–25 KB), often more predictable for CDN planning.
Who needs Satellite PNG: five roles
Agricultural scientist. A raster NDVI or EVI (Enhanced Vegetation Index) layer with "red = bare ground, green = lush vegetation" color scale must preserve without compression artifacts. JPEG here gives false steps in colormap, distorting analysis. PNG preserves each colormap shade exactly — critical for scientific publication.
Meteorologist. A cloud-cover layer from Sentinel-2 QA band — binary mask (cloud or not). Must be transparent where no clouds (so basemap shows through) and opaque where clouds are. Requires alpha channel, present in PNG, absent in JPEG.
GIS engineer in government sector. Cadastral systems, land-use maps, urban ortho-plans — all have higher quality requirements than consumer maps. PNG tiles eliminate artifacts at object boundaries. Especially important at high zoom levels (z=18+) where detail matters.
Climatologist with time series. Comparing satellite imagery of one place across years (e.g., taze ICE in 2000 vs 2024) requires pixel-precise accuracy. JPEG quality 75 gives random 1–3 gray-unit deviations per pixel, appearing in diff mode as false change. PNG — zero noise.
Military analyst / OSINT developer. Satellite-based event-verification platforms require exact before-vs-after comparison. Bellingcat-style investigative teams build their tooling on PNG tiles of source Sentinel/Maxar imagery, converted via gdal2tiles without loss.
Software for Satellite PNG: seven tools
Leaflet. Same library as for JPG tiles. URL template https://server/{z}/{x}/{y}.png. Transparency supported automatically. leafletjs.com
MapLibre GL JS / Mapbox GL JS. Raster source with PNG tiles. Declarative style. maplibre.org
GeoServer. Open-source WMS server. Configured via GUI or REST API. Serves PNG via FORMAT=image/png or FORMAT=image/png; mode=8bit for reduced palette. geoserver.org
MapServer. Open-source, older than GeoServer (since 1996), faster. Used in government GIS systems. mapserver.org
QGIS Server. WMS based on QGIS. Convenient if you already work in QGIS — export project to QGIS Server without rewriting. qgis.org/en/site/forusers/server.html
gdal2tiles.py. GDAL utility for slicing GeoTIFF into XYZ tiles. PNG by default: gdal2tiles.py -p mercator -z 0-18 -w leaflet input.tif tiles/. gdal.org/programs/gdal2tiles
TiTiler. Young open-source project (DevSeed) for dynamic tile serving from COG. PNG tiles rendered on-demand from source COG via HTTP. Excellent for ephemeral products like specific classifications. developmentseed.org/titiler
Pitfalls and tips
File size 5–10× larger than JPEG. Base PNG trade-off. If your use case tolerates compression (regular basemap, mobile user, bandwidth savings) — choose JPEG. PNG only when lossless or transparency truly needed.
8-bit vs 16-bit PNG. Regular browsers show 8-bit fine; 16-bit loses precision when rendered to standard 8-bit display. If your use case is GIS analytics (e.g., NDVI tile with −1..+1 range) — store 16-bit. For browser visualization — 8-bit suffices.
Full transparency. PNG with alpha channel is often used as overlay over basemap. Watch premultiplied vs straight alpha: different libraries handle them differently. Cairo/Skia use premultiplied, gdal2tiles writes straight by default. Mismatch causes black halos around semi-transparent areas.
CDN cache size. If your site expects millions of requests per day, satellite PNG costs 5–10× more in CDN bandwidth than satellite JPG. For AWS CloudFront $0.085/GB × 100 TB = $8500/mo. Trade-off may push you back to JPEG for basemap, leaving PNG only for overlays.
Palette PNG for classification maps. If you have thematic map with 16–256 colors (e.g., land cover classification), use palette PNG (8-bit with lookup table). 3–4× smaller than RGB PNG, lossless, with transparency. gdal_translate -of PNG -co WORLDFILE=YES -co NBITS=8.
Compression level vs speed. PNG supports compression levels 0–9. Level 9 (max) gives 5–10% smaller size at substantially higher encoding time. For batch tile generation (millions of files) level 6 is sweet spot. For single files served millions of times — 9.
Antialiasing on zoom boundaries. PNG doesn't suffer JPEG artifacts but antialiasing between zoom levels still works. If transitions look harsh — use Mapbox GL JS with raster crossfade.
WebP alternative. WebP lossless yields 25–30% smaller files than PNG at same characteristics. Supported by all modern browsers (since 2020). Consider WebP instead of PNG for new projects where IE11 isn't needed.
How to use Satellite PNG with an OSM export from osm2cdr.ru
Satellite PNG is most often used as overlay (with transparency) over basemap, or as high-quality basemap for analytical tasks. osm2cdr.ru produces OSM vectors that overlay on top for contextual labels and borders.
Step 1. Generate your satellite PNG tiles from source GeoTIFF (e.g., Sentinel-2 composite):
gdal2tiles.py -p mercator -z 10-18 \
--processes=4 \
--tiledriver=PNG \
source_composite.tif tiles_png/
You get a tiles_png/{z}/{x}/{y}.png tree for use in Leaflet/MapLibre.
Step 2. If you need NDVI overlay with color scale and transparency, first colorize NDVI:
# Create NDVI colormap palette
echo "-1 100 50 0 255
-0.2 200 150 50 255
0.0 240 240 100 255
0.4 100 200 50 255
1.0 30 130 30 255" > ndvi_palette.txt
gdaldem color-relief ndvi.tif ndvi_palette.txt ndvi_colored.tif -alpha
gdal2tiles.py -p mercator -z 10-15 \
--tiledriver=PNG \
ndvi_colored.tif ndvi_tiles/
You get semi-transparent NDVI tiles you can overlay on basemap.
Step 3. On osm2cdr.ru export contextual layers for the city (admin boundaries, major roads, place names) to GeoJSON or PMTiles.
Step 4. Combine everything in Leaflet:
const map = L.map('map').setView([54.708, 20.515], 13);
// Satellite PNG basemap (lossless)
L.tileLayer('/tiles_png/{z}/{x}/{y}.png', {
attribution: 'Sentinel-2 © ESA Copernicus',
maxZoom: 18
}).addTo(map);
// NDVI overlay (semi-transparent PNG)
L.tileLayer('/ndvi_tiles/{z}/{x}/{y}.png', {
attribution: 'NDVI from Sentinel-2',
opacity: 0.6,
maxZoom: 15
}).addTo(map);
// OSM contextual overlay (borders, labels)
fetch('/data/kaliningrad_districts.geojson')
.then(r => r.json())
.then(data => L.geoJSON(data, {
style: { color: '#fff', weight: 2, fillOpacity: 0 }
}).addTo(map));
Result — a three-layer analytical map: real satellite at bottom, NDVI on top with transparency, OSM district boundaries above. Ready for journalism, urban planning, academic publication.
Related formats and resources
- Satellite GeoTIFF — source data for tile generation
- Satellite JPG — lossy alternative when bandwidth is paramount
- PNG — base format for satellite PNG container
- PMTiles — single-file tile archive
- COG — Cloud-Optimized GeoTIFF for native streaming
Sources
- OGC WMS specification (PNG format) — ogc.org/standards/wms
- GDAL gdal2tiles, PNG output — gdal.org/programs/gdal2tiles.html
- TiTiler dynamic PNG tile server — developmentseed.org/titiler
- GeoServer WMS layer publishing — docs.geoserver.org
- PNG specification, W3C — w3.org/TR/PNG
- MapServer raster format options — mapserver.org/output