Supported Data Formats¶
This page lists the data formats RustGIS reads and writes, how to add each one, and the main limits. Data covers adding data, large files and rasters in more detail; Maps and Basemaps covers web tile layers.
Most formats open in the desktop app and in the web app alike. Those that need C libraries (GDAL, DuckDB) or files on disk are desktop-only, as the tables say. The web app reads GeoPackages without SQLite, with a small SQLite file reader written in Rust.
Vector and tabular files¶
| Format | Extensions or source | How to add it | Notes |
|---|---|---|---|
| GeoJSON | .geojson, .json |
Home › Add Data, or drop the file | Features with typed attributes; a GeometryCollection keeps its first member. On the desktop, a FeatureCollection larger than 32 MB is read in place, a view at a time, however large; otherwise files up to 256 MB load whole. |
| Delimited text | .csv, .tsv, .txt |
Add Data, or Add Data › Delimited Text… to choose the columns from the file's header | Comma, semicolon, tab or pipe separated (found from the header, or "delimiter"); info.fileColumns lists the columns and the ones found. Points from x/y columns (named like longitude/latitude or easting/northing, or chosen with "x" and "y"), or any geometry from a WKT/EWKT column (named like wkt or geometry, or "wkt"). Coordinates in another system are converted from "crs" (EPSG:2263, or WKT) or an EWKT SRID=; without either, coordinates outside longitude/latitude are pointed out. A file without coordinates opens as a standalone table. |
| Shapefile | .shp with .dbf (and .shx), or zipped (.zip) |
Add Data or drop the file; in the web app, pick or drop the .shp and .dbf together, with the .shx and .prj if there are (they open as one layer), or the zip |
A zip may hold several Shapefiles, in folders, and other vector files (GeoJSON, CSV, GeoParquet, FlatGeobuf); each becomes a layer, at most 32 for the whole archive (Shapefiles first, so other files are left out when Shapefiles fill it). .txt files and macOS __MACOSX entries are passed over, and a member that can't be read is skipped and named in a notice. Converted to longitude/latitude from the coordinate system in its .prj (EPSG, Esri or OGC WKT, or WKT2 as PROJ and QGIS write it; Web Mercator, UTM, State Plane and other common projections); without a .prj it must be in longitude/latitude. On the desktop, one with more than 100,000 shapes (counted from its .shx) is read in place, a view at a time. |
| KML / KMZ | .kml, .kmz |
Add Data, drop the file, or upload it in the web app | A layer for each kind of geometry (points, lines, polygons), with each placemark's name, description, folder path and extended data. Styles are kept: the layer is drawn by unique values of its style field, with each KML style's line and fill colours, widths and icon colours (up to 64 styles). Multi-geometries and gx:Tracks are read. Ground overlays (pictures on a LatLonBox, turned by its rotation) are raster layers kept in the project: the picture inside a KMZ, or a file beside a KML (not a web address, nor outside its folder); a gx:LatLonQuad isn't drawn. |
| GPX | .gpx |
Add Data, drop the file, or upload it in the web app | Waypoints, routes, tracks (one line per track, its segments as parts) and track points (with elevation and time) as separate layers. |
| Spreadsheets | .xlsx, .xlsm, .xlsb, .xls, .ods |
Add Data (or Delimited Text… to choose the columns), drop the file, or upload it in the web app | One sheet at a time, read like delimited text: the first non-empty row names the columns, and x/y or WKT columns (found, or given with "x", "y", "wkt" and "crs") make the geometry; a sheet without them is a table. The first sheet is added and the others named in a notice; "layer" picks one, and info.fileLayers lists them. Dates read as ISO 8601. |
| GeoRSS | .rss, .atom, .georss, or .xml |
Add Data, drop the file, upload, or From URL… | RSS 2.0, RSS 1.0 and Atom feeds with GeoRSS Simple, GeoRSS GML or W3C Basic Geo places: points, lines and polygons layers with each item's title, link, description, date, id and category. |
| LandXML | .landxml, or .xml |
Add Data, drop the file, or upload | Coordinate geometry points, parcels (polygons), alignments (lines; curves as chords) and TIN surfaces (a triangle per face, with its mean elevation), converted from the file's epsgCode or "crs". |
| Encoded polylines | text | layer.addEncodedPolyline with "polyline" (one or a list) |
Google's encoding, precision 5, or 6 ("precision") as OSRM and Valhalla can give: a line layer. |
| GML | .gml |
Add Data, drop the file, or upload | Simple features in GML 2 and 3 (WFS answers, OGR's GML): a layer per feature type, its simple elements as fields. Converted from the srsName (EPSG codes, URNs and URLs; the URN and URL forms of geographic systems are latitude first). |
| MapInfo Interchange | .mif with its .mid (or both zipped) |
Add Data, drop the file, or upload the zip | Points, lines, polylines, regions (holes found by nesting), rectangles and ellipses; text and arcs are rows without geometry. Converted from the CoordSys: longitude/latitude, Transverse Mercator, Lambert Conformal Conic, Albers or Mercator. |
| OpenStreetMap PBF | .osm.pbf |
Add Data, drop the file, or upload | Points (tagged nodes), lines and multipolygons (closed ways that are areas, and multipolygon and boundary relations), with common tags as fields and the rest in other_tags, as GDAL gives them. Up to 40 million nodes (4 million in the web app); on the desktop, extracts over 256 MB open through GDAL when it is installed. |
| TopoJSON | .topojson, or .json |
Add Data, drop the file, or upload | A layer per object, its geometries rebuilt from the shared arcs (quantized or not). |
| AutoCAD DXF | .dxf (ASCII) |
Add Data, drop the file, or upload | Points, lines and polygons layers from the drawing's entities: POINT, LINE, LWPOLYLINE and POLYLINE (bulges drawn as arcs; closed ones stay lines; polyface meshes become polygons), CIRCLE, ARC, ELLIPSE, SPLINE, HELIX, LEADER, MLINE (its centre line), TEXT, MTEXT, ATTRIB and constant ATTDEF (points with their text, at the alignment point of justified text), HATCH boundaries (holes found by nesting), SOLID, TRACE and 3DFACE (polygons). Blocks (named in any case) are drawn where INSERTs place them (scaled, rotated, in arrays, nested up to 8 deep), and so are DIMENSIONs' blocks (a linear dimension without one draws its lines and measured text). Entities in an object's own coordinate system are turned into the drawing's. Fields: layer, entity, color (ACI, BYLAYER and BYBLOCK resolved), linetype, text, height, rotation, block, elevation and paperspace. The drawing's layouts (paper space: title blocks, viewport frames) are left out, with a notice, unless "paperSpace": true. A drawing never says its coordinate system: give "crs" (such as EPSG:2263), or its coordinates are kept as they are, with a notice. "layer" picks one of the drawing's own layers, and info.fileLayers lists them. Up to 2 million features (500,000 in the web app). Not read: binary DXF, MULTILEADER, WIPEOUT, IMAGE and ACIS solids (3DSOLID, REGION), named in a notice. |
| Geotagged photos | .jpg, .jpeg |
Add Data (several at once in the web app), drop them, upload, or layer.addPhotos with "paths" or a "folder" |
JPEGs with a GPS position in their EXIF become points in the Photos layer (photos added one at a time join it): each with its name, file, time (when it was taken), altitude, direction (where the camera faced), camera and a thumbnail of at most 160 pixels, kept with the feature so the project needs no other file. Identify shows the thumbnail. Photos without a position are named in a notice and left out; a layer holds up to 2,000 photos. A JPEG is always read as a photo unless layer.addData or layer.addDataBytes is given "as": "scan" (a phone photo of a paper map, say: see Scans with no coordinates). |
| LiDAR point clouds | .las, .laz (COPC too) |
Add Data, drop the file, upload, or From URL… | LAS 1.0–1.4 (point formats 0–10) and LAZ, on the desktop and in the web app: a point layer with each point's z, intensity, classification, return and colour (red, green, blue), coloured by ASPRS class (or by elevation when the cloud has one class). A cloud past 2 million points (500,000 in the web app) shows an evenly spread sample of them. Converted from the coordinate system its WKT or GeoTIFF-key record names (the horizontal part of a compound one); a file that names none keeps its coordinates, with a notice. Read in place, so a project keeps the file's path, not its points. |
| GeoPackage | .gpkg |
Add Data, or upload in the web app | Every feature table becomes a layer, up to 32 at once (the result counts the rest in skippedCount and names up to 100 of them in skipped); "layer" picks one, and info.fileLayers lists them all. Read in place by its R-tree; any EPSG system is reprojected. The web app reads the file with its own SQLite reader (tables scanned, the envelope in each geometry header tested first; no R-tree); UTF-16 databases aren't read there. |
| GeoParquet | .parquet, .geoparquet |
Add Data, or upload in the web app | WKB geometry, with the CRS from the file's geo metadata. Row groups are pruned by the bbox covering. Snappy, gzip, LZ4 and zstd compression are read, in the browser too; Brotli isn't. |
| FlatGeobuf | .fgb |
Add Data, or upload | Read in place by its packed R-tree. |
| Esri File Geodatabase | .gdb folder (desktop) |
A file dialog can't pick a folder: in Add Data pick any .gdbtable file inside it; or double-click the .gdb in the Browser, or drop the folder on the window |
Read without GDAL: every feature class becomes a layer and every table a standalone table, with their fields (dates as text) and coordinate system (by its code, EPSG or Esri; else its WKT). "layer" picks one, and info.fileLayers lists them. 3D multipatches (such as swissBUILDINGS3D's buildings) are drawn as their footprints, the union of their faces seen from above, with their lowest and highest Z in z_min and z_max and the difference in height, which an extrusion (Style › Extrusion) can stand them up by; one with no face seen from above (only walls) is drawn as the outline of its points. Curves are drawn as straight segments between their ends. Compressed tables, raster fields and some newer row indexes aren't read: with GDAL installed, such a geodatabase opens through GDAL instead (see below). Loaded whole, up to 2 GB a table. |
| Standalone tables | CSV, or any layer without geometry | Add Data | Listed under the map in Layers; join or relate them to layers. |
Files with more than 100,000 features (GeoPackage, GeoParquet, FlatGeobuf, and Shapefile on the desktop) are read in place, a view at a time, rather than loaded whole: see Large files. They draw, label, identify and run through tools like any layer; Load All Features loads one to edit it.
Formats read through GDAL¶
With GDAL installed (its ogr2ogr and ogrinfo on the PATH, GDAL 3.7 or
later), the desktop app also reads the vector formats below. Each layer is converted once into a
cached, indexed FlatGeobuf, so large ones stream too: see Formats through
GDAL.
| Format | Extensions or source | Notes |
|---|---|---|
| AutoCAD DWG | .dwg |
Through GDAL's CAD driver, when it is built in. Give "crs" (such as EPSG:2263) when the drawing doesn't say its coordinate system. |
| MapInfo tables | .tab |
Keep the companion files together. |
| OpenStreetMap XML | .osm |
|
| GeoJSON Lines, GMT | .geojsonl, .geojsons, .gmt |
Files on the web¶
Home › Add Data › From URL… (layer.addUrl with "url") downloads a file by its https://
(or s3://, see S3 buckets) address and adds it like a file from this computer: GeoJSON, CSV, GeoParquet, FlatGeobuf,
GeoPackage, zipped Shapefiles, KML/KMZ, GPX or GeoTIFF/COG, up to 512 MB on the desktop and 256 MB
in the web app (where the server must allow requests from web pages, CORS). On the desktop, with
GDAL installed, a JPEG 2000 file (.jp2, .j2k: Sentinel-2's imagery on S3)
is downloaded too, converted to a GeoTIFF that the project keeps, and added. Desktop byte uploads
(layer.addDataBytes) of .jp2 and .j2k use the same conversion. The web app rejects both JPEG
2000 uploads and downloads with an explicit GDAL limitation; convert them to GeoTIFF first.
The format comes from the address, or from the contents when the address has no extension (an API
endpoint, say), JPEG 2000 included: its signature is recognised in the contents, so the desktop
converts it and the web app gives the same GDAL limitation. The
app downloads in the background and adds the layer when the file arrives (to the project it was
started in: opening another meanwhile drops it). A .pmtiles address is added as a tile layer
and read a tile at a time instead.
For JPEG 2000 uploads and downloads on the desktop, the converted GeoTIFF must fit within 512 MiB. The private conversion workspace (source file, output and GDAL scratch files together) is monitored every 50 ms against a budget of the input file's byte length plus three times that output limit (1.5 GiB). Conversion stops when the workspace exceeds the budget, but files can grow between checks: this is not a strict operating-system disk quota. Ordinary conversions of files opened from disk do not use this workspace budget.
Conversion runs synchronously while the layer is added and can temporarily make the app unresponsive. The original JPEG 2000 byte buffer is released once it has been staged on disk, before GDAL runs or the GeoTIFF is read back. The converted GeoTIFF and decoded raster still occupy memory together; the 512 MiB file limit is not a limit on total process memory.
A cloud-optimised GeoTIFF (a tiled .tif with overviews, as most published imagery is) is read
in place rather than downloaded: its header first, then, by HTTP range requests, only the tiles of
the overview each part of the view needs, so a Sentinel-2 scene of 300 MB draws in a couple of
seconds and full detail comes as you zoom in. It is a tile layer (map.addTiles kind cog,
saved in the project by its address), drawn under the map's own layers like other tile layers:
RGB(A) 8-bit images as they are, other images in grey stretched between the 2nd and 98th
percentiles of their coarsest overview. A GeoTIFF in strips, with bands stored apart, or without
tiles is downloaded whole as a raster layer, as is any GeoTIFF added with "whole": true (for
the raster tools and symbology). The web app needs the server to allow range requests from web
pages (CORS with the Range header), as public buckets such as Sentinel-2's do.
A GeoParquet or FlatGeobuf file by its address is read in place too, a view at a time, however
large: the layer is streamed like a large local file, and the view's features are fetched in the
background by HTTP range requests and drawn as they land. A FlatGeobuf's header and packed R-tree
index are read first (a level of the tree per round of requests), then only the features in the
view. A GeoParquet's footer is read first, then the row groups the view meets, by their bounding
box covering column (bbox) and its statistics: the covering of groups on the view's edge, then
the geometry and attribute columns of the rows taken. A view holding more than a read takes (60,000
features on the desktop, 30,000 in the web app) shows an evenly spread sample of it, in patches;
zoom in for all of them. So a 12 GB FlatGeobuf of 11 million areas opens after 65 KB and
draws a city in about a second from 9 MB, and a 525 MB Overture buildings file opens after 1 MB.
The project keeps the address and reads it the same way when it opens. A FlatGeobuf without an
index, a GeoParquet without a covering column, or a server that doesn't answer range requests
means the file is downloaded whole instead, as is any file added
with "whole": true; Load All Features and the geoprocessing tools fetch the whole file on the
desktop, while in the web app they need the file downloaded first.
layer.addUrl waits for the download, up to a minute, which suits the command line, MCP and the
desktop app's assistant; a larger file comes through the From URL… dialog, which downloads in the
background. In the web app, where nothing may wait, it adds .pmtiles and GeoTIFF addresses only
(a GeoTIFF read in place); other files, GeoParquet and FlatGeobuf read in place among them,
come through the From URL… dialog (ui.addUrl) or a ?data= link. GeoJSON, CSV, KML and GPX files are read up to
256 MB; larger downloads (GeoParquet, FlatGeobuf, GeoPackage, GeoTIFF) up to the limits above.
Map and feature services¶
Home › Add Data › From Service… connects to a service by its address, lists what it offers from
its capabilities. For OGC API feature collections, enter a group name (initially My OGC Layer)
and choose Import All. The group expands into ordinary point, line and polygon layers with
the same legends, styling and attribute tables as file imports. Other offerings have individual
Add buttons (service.layers and service.add from scripts, the command line and MCP).
An OGC API landing page works directly: RustGIS follows its advertised
JSON collections link, so you don't need to append /collections. If the landing page also
offers map tiles, they remain listed alongside the collections. A failed collections request
leaves any available map layers usable and shows the error.
When a service can't be reached or refuses the request, the dialog says what happened in plain
words and what to try next: a sign-in or token it needs (401), access refused (403), nothing at
that address (404), too many requests (429), a problem on the server (5xx), or a server that
couldn't be reached or took too long. When a firewall in front of the server (Cloudflare,
Akamai, Imperva, Sucuri or AWS WAF) blocked or challenged RustGIS itself, told by its own block
page or a header it sends only then, it says so: only the service's administrator can let
RustGIS through. A firewall that only passed on the service's own refusal (a private service
wanting a token) isn't blamed for it. Details, folded below, lists
what the server said for an expert or the administrator: the address (without keys or tokens),
the status, the server, the firewall and the request's id, the User-Agent RustGIS sent, and
the title or first words of the server's answer (as text). Copy details copies them to send.
In the web app the browser hides most of a refused answer, so it tells the status only.
Right-click the group and choose Refresh to rediscover its collections and update them all, including newly added or removed collections. Right-click a child and choose Refresh to update only that collection. Existing children keep their names, styles and visibility (a changed geometry type gets a suitable default symbol); selections are cleared because row positions can change. Refresh replaces local feature edits with the service's data. Failed imports or refreshes leave the map intact; a successful operation is one undo step. Groups and their source connections are saved in the project. Group downloads are limited to 2000 collections and 64 MB in total and use the existing per-collection feature limits.
Scripts use service.import {"url":"…","name":"My OGC Layer"} and
service.refresh {"group":id} or service.refresh {"layer":id}. The browser uses
service.groupPlan to discover the requests, then supplies text, documents, and
responses: [{"url":"…","text":"GeoJSON"}] to import or refresh without blocking network calls.
| Service | What it lists | How a layer is added |
|---|---|---|
| WMS 1.1.1 / 1.3.0 | Named layers offered in Web Mercator | A tile layer of GetMap images (PNG when the service offers it, else JPEG) |
| WMTS | Layers whose tile matrix set is Web Mercator's pyramid | A tile layer from the tile template (or KVP GetTile) |
| WFS 1.1 / 2.0 | Feature types | Their features downloaded as GeoJSON, in the output format the service names (up to 50,000) |
| OGC API Features | Collections | Their items downloaded as GeoJSON, following the service's next pages up to 100,000 features or a minute of downloading (the web app reads the first page) |
| OGC API Tiles | Collections' map and vector tiles; a landing page's dataset map tiles | A tile layer in WebMercatorQuad, from the tile template the tileset advertises (its item link; …/tiles/WebMercatorQuad/{z}/{y}/{x}, the usual path, when that can't be read), keeping the tiles link's query (a token), map tiles in the server's image format, vector tiles drawn layer by layer in colours of their own |
| WCS 1.0 / 2.0 (a 1.1 service is asked in 1.0) | Coverages, with their bounds | A raster: GetCoverage of the map's view within the coverage's bounds (or its whole extent: "bbox": "full"), as a GeoTIFF in EPSG:4326, at most 2048 pixels on a side |
| ArcGIS REST | FeatureServer and MapServer layers; a MapServer's map; an ImageServer; a VectorTileServer | Layers queried as GeoJSON (up to the server's record limit); a map as its tile cache when it is Web Mercator's pyramid, else exported images; an ImageServer as exported images; a VectorTileServer as its MapLibre style |
The type is guessed from the address (?SERVICE=, /wmts, /wfs, /wcs, /collections, /rest/services…) or
chosen (select OGC API Features and Tiles when a landing page's address doesn't identify
its type). A WebMercatorQuad tileset is found by its
tile matrix set, whatever the server calls it. A service that asks for a token says so. In the web app the server must allow requests
from web pages (CORS).
A coverage is read once, for the view when it was added (its DescribeCoverage first, for its axes,
format and bounds; service.coverage gives the GetCoverage address alone). Moving the map doesn't
ask for it again: add it again for another area. The server reprojects it to EPSG:4326 (WCS 2.0
through its CRS extension); one that can't answers with an error, which is shown.
For callers that fetch documents themselves (including the web app), service.layers accepts
text for the initial document and documents: [{"url": "…", "text": "…"}] for subsequent
responses. It returns next while another collections document is needed; supplied documents
never cause a blocking capabilities fetch. Each listed layer includes source_url; pass it
and the same documents to service.add to distinguish layers with the same name. Discovery
follows at most four documents and rejects loops and disallowed addresses. Collection lists
aren't paged. On the desktop, feature downloads follow their next pages (see the table above).
Catalogues¶
The same dialog's Catalogue search (CSW) type searches a CSW 2.0.2 catalogue (GeoNetwork,
pycsw, geocat.ch…) by words anywhere in its records and, if you like, the map's area
(catalog.search). Its records are listed 20 at a time (More asks for the next), with their
titles, abstracts (on hover) and bounds (Zoom), and a button per link RustGIS can follow: a WMS,
WMTS, WFS, WCS, OGC API or ArcGIS service connects in the dialog, a download is added as From URL…
does. Links pointing where a document on the web may not send RustGIS (the local network) are left
out.
PostgreSQL and PostGIS¶
The desktop app reads the geometry and geography columns of a PostGIS database live, talking to the server itself: see PostgreSQL and PostGIS.
| Source | How to add it | Notes |
|---|---|---|
| PostGIS table or view | Add Data › Database… (layer.addDatabase) with a libpq connection string or postgresql:// address |
Large tables read a view at a time by their spatial index, others loaded whole. Converted to longitude/latitude by the server; "crs" for geometry that doesn't say. A column of mixed types becomes a layer per type. The password is kept for the session only. |
MySQL and MariaDB¶
The desktop app reads the spatial columns of a MySQL (8 or later) or MariaDB (10.2 or later) database live, talking to the server itself: see MySQL and MariaDB.
| Source | How to add it | Notes |
|---|---|---|
| MySQL or MariaDB table or view | Add Data › Database… (layer.addDatabase) with a mysql://user@host:3306/database or mariadb://… address |
Large tables read a view at a time by their spatial index, others loaded whole. Converted to longitude/latitude by RustGIS from the column's SRID; "crs" for an SRID of 0. A column of mixed types becomes a layer per type. ssl-mode sets the encryption. The password is kept for the session only. |
SQL Server and Azure SQL¶
The desktop app reads SQL Server 2012 or later and Azure SQL spatial tables live, without an external client: see SQL Server and Azure SQL.
| Source | How to add it | Notes |
|---|---|---|
| SQL Server table or view | Add Data › Database… (layer.addDatabase) with an mssql://user@host:1433/database address |
Read only; large tables read a view at a time. Geometry and geography, including curves, are converted to longitude/latitude. "crs" supplies SRID 0; mixed types become separate layers. TLS and certificate checking are on by default. SQL Server logins on every desktop platform; Windows logins on Windows only. Passwords are kept for the session, never in projects. |
SQL queries and DuckDB databases¶
With DuckDB installed (the duckdb program on the PATH, DuckDB 1.5 or
later), the desktop app adds the result of an SQL query as a layer, and opens DuckDB database files.
Results are written as cached GeoParquet, so large ones stream too: see SQL queries and DuckDB
databases.
| Source | How to add it | Notes |
|---|---|---|
| SQL query | layer.addSql with "sql" |
One DuckDB SELECT with DuckDB Spatial: Parquet, CSV, GeoParquet and ST_Read files, web addresses (https://, s3://). Give "crs" for a geometry that doesn't say its coordinate system. |
| DuckDB database | .duckdb, .ddb: Add Data |
Every table with a geometry column becomes a layer ("layer" picks one). Converted once, until the file changes. |
Rasters¶
| Format | Extensions or source | How to add it | Notes |
|---|---|---|---|
| GeoTIFF / Cloud-optimised GeoTIFF | .tif, .tiff |
Add Data, or upload | Regular or cloud-optimised, striped or tiled; grey, RGB(A), palette (with its colour table) or multiband; Deflate, LZW, PackBits, JPEG or Zstandard compression. Any EPSG system, or the file's own projection from its GeoKeys (Albers, LCC, transverse Mercator…), reprojected as it draws. A rotated or skewed image (a transformation matrix with rotation terms) is resampled to a north-up grid as it's read. A large file opens from its overview, or one made as it is read when it has none. |
| JPEG 2000 | .jp2, .j2k |
Add Data, byte upload (layer.addDataBytes), or From URL… (desktop, with GDAL installed) |
Converted through GDAL. Uploads and downloads keep the converted GeoTIFF in the project, so reopening it needs neither GDAL nor the original file or address; their output and workspace limits are described under Files on the web. The web app rejects JPEG 2000 uploads and downloads with an explicit GDAL limitation: use GeoTIFF instead. |
| Scans with no coordinates | a .tif with no GeoTIFF tags, .png; any .tif, .png or .jpg/.jpeg with "as": "scan" |
Add Data, or upload (layer.addData, layer.addDataBytes) |
Keeps its pixel size and bands (grey, RGB(A); 8 or 16 bits). An untagged TIFF or a PNG opens as a scan by default; a JPEG only with "as": "scan" (otherwise it is a photo), which also drops the coordinates of a GeoTIFF. It has no coordinates, so it is drawn over the current view, the command's result says so (georeferenced: false), and the layer is marked not georeferenced until Georeference places it. Until then it can't be exported, and tools that would give a result a place on the ground (raster functions, pixel edits, clip, resample, mosaic) refuse it. A PNG or JPEG is decoded whole: up to four times the sample limit in decoded bytes is read at every second pixel, and anything larger is refused, so save it as a TIFF (read at a reduced size). A TIFF is reduced as a GeoTIFF is. |
| ASCII grid | .asc (with an optional .prj) |
Add Data, or upload | |
| Zarr | a store's folder (.zarr) or web address, format 2 (consolidated) or 3 |
Add Data › Zarr… (layer.addZarr), Add Data on the folder, or a ?zarr= link |
A variable's latitude/longitude (or y/x) map at the steps picked of its other dimensions (time, level), read chunk by chunk in pure Rust (blosc, zlib, gzip, zstd, LZ4; sharded arrays too), on the desktop and the web. See Zarr stores. |
| Rasters GDAL reads | .img, .hgt, .dem, .dt0–.dt2, .nc, .hdf, .h5, .bil, .grd, .sdat, .kea, .ers, .rst, .ntf, .ecw, .sid… |
Add Data (desktop, with GDAL installed: gdal_translate, gdalinfo and gdalwarp) |
Converted once to a cloud-optimised GeoTIFF in the cache, then read as one. A NetCDF or HDF file's variables are its subdatasets: the first is added, the others are named in a notice, and "layer" picks one. A file that doesn't say its coordinate system is read as WGS 84 when its coordinates look like longitude/latitude (0–360° longitudes are moved to -180–180°); otherwise give "crs". |
Tiles and web services¶
| Format | Extensions or source | How to add it | Notes |
|---|---|---|---|
| Raster tiles | XYZ/TMS template ({z}/{x}/{y}, {-y}, {s}, {q}), WMS ({bbox-epsg-3857}) |
Home › Add › Basemap › Add Tile Layer | PNG, JPEG and WebP. |
| Vector tiles | Mapbox Vector Tiles (.pbf, .mvt) template, or TileJSON |
Add Tile Layer | Drawn in a built-in style that knows the OpenMapTiles, Protomaps and Shortbread schemas. |
| MapLibre styles | style.json |
Add Tile Layer | The style's vector and raster sources, sprite, expressions and zoom functions. |
| PMTiles | .pmtiles: a web address, or a file on the desktop |
Add Tile Layer (or its Tile Archive File… button), Add Data, or drop the file | Raster or vector, as the archive says; uncompressed, gzip, Brotli or Zstandard. Read a tile at a time by byte ranges (the server must allow them, and CORS in the web app). The map moves to the archive's bounds when it is added (not for a world archive). A vector archive is drawn in the built-in style when it is a basemap, otherwise with each of its layers in its own colour. |
| MBTiles | .mbtiles: a file |
Add Data, drop the file, Add Tile Layer's Tile Archive File… button, or upload in the web app | Raster (PNG, JPEG, WebP) or vector tiles, as its metadata says, drawn as PMTiles archives are. The desktop reads the file in place, a tile at a time. The web app reads an upload into memory (the plain tiles table and the deduplicated layouts of mbutil, TileMill and Planetiler) and keeps it for the session: a project saved there asks for the file again. |
Writing¶
| Format | How to write it | Notes |
|---|---|---|
| GeoJSON, CSV | Data › Export (share.exportLayer) |
The Export Features dialog picks the format; the file is saved in it whatever extension is typed. In the web app it downloads (any format below but GeoPackage; a Shapefile as one zip). A streamed layer writes its whole source (as every format below does). |
| GeoPackage | Data › Export to .gpkg (desktop) |
One feature table (an attributes table for a layer without geometry) in the layer's coordinate system (see below), with an R-tree spatial index and the GeoPackage 1.4 triggers that keep it current when other software edits the file. Feature ids are kept. |
| GeoParquet | Data › Export to .parquet |
GeoParquet 1.1: WKB geometry in WGS 84, Snappy compression, row groups of 65,536 features and a bbox covering column so readers can skip rows by extent. |
| Shapefile | Data › Export to .shp (or .zip for the files zipped) |
Writes .shp, .shx, .dbf, .prj (the coordinate system, see below) and .cpg (UTF-8). Field names are cut to 10 characters (made unique), text to 254 bytes, and numbers too wide for a dBase field are left empty; features without geometry, and lines of a single point, are left out (and reported). |
| FlatGeobuf | Data › Export to .fgb |
In the layer's coordinate system (see below), with a spatial index; features without geometry are left out (and reported). |
| KML, KMZ, GPX | Data › Export to .kml, .kmz or .gpx |
Placemarks named by a name field, if there is one; features without geometry are left out. |
| KML, GPX, CSV with WKT | Analyze › Workflows › Data Interop | |
| GeoTIFF | Data › Export | |
| PNG | Publish › Export Map (share.exportMap) |
At any DPI, with labels, scale bar and tile credits. |
| Layouts, reports and presentations | ||
| Wavefront OBJ, glTF | Publish › Export To 3D, Share As › Web Scene | Polygons extruded by a field. |
| Web map, OGC API Features, MapLibre style | Publish › Share As | Open-format files that need no server: see Sharing. |
| Raster tiles | Analyze › Create Hosted Imagery |
GeoPackage, Shapefile and FlatGeobuf exports are written in the coordinate system the layer was
read in: a Shapefile's .prj, a GeoPackage's or FlatGeobuf's own system, or the crs a CSV was
added with (EPSG:25832 data goes back out as EPSG:25832). A layer read in longitude/latitude, or
made in RustGIS, is written in WGS 84 (EPSG:4326). share.exportLayer takes "crs" to choose
another, such as {"layer": "Parcels", "path": "parcels.gpkg", "crs": "EPSG:4647"}. GeoJSON, KML,
GPX, GeoParquet and CSV are always written in WGS 84.
RustGIS files¶
| File | Extension | Notes |
|---|---|---|
| Project | .rgis (older .rgisx open too) |
Saves streamed layers' file paths, not their features; a browser upload is kept inside. |
| Map, layer, style, color ramp, template, task, bookmark and layout files | .rgismap, .rgislyr, .rgisstyle, .rgisramp, .rgistemplate, .rgistask, .rgisbookmarks, .rgislayout |
See Project items. |
| Project package | .rgispkg |
Everything, rasters included. |
| Plugin | .rgplugin |
See Plugins. |
| Color ramps from other tools | QGIS style .xml and layer style .qml, GDAL color-relief .txt, GMT .cpt |
Read as custom color ramps; see Custom color ramps. |