cli

The utiles cli can be installed via cargo or pip; the python library bundles a version of the cli that can be run just as utiles and/or python -m utiles.

The cli is a collection of commands for streaming tiles in text format (excellent for piping) and working with mbtiles/tile-db files.

All of the mercantile cli commands are available, and burn and edges from supermercado are also available.


What about the mbtiles cli in the martin repo? [2025-01-14]

The mbtiles cli is very good and has significant overlap with the utiles cli.

(imo) The most intriguing feature of the mbtiles cli is the diff/patch commands that allow for comparing and updating mbtiles files; utiles does not have this feature.

utiles does have a streaming mode copy command that allows copying tiles from one mbtiles db to another without using the sqlite-ATTACH command; this is in my testing and experience less crash-prone and much faster on super large tile-dbs.

The cli commands in utiles that interact with mbtiles are more focused raster format mbtiles files.

agg-hash

utiles adopted the standardized way of calculating an aggregate-tiles-hash for an mbtiles file, and builds on it to allow for hash-algorithms aside from md5. The cli command also allows for selecting zoom-levels, and bounding-boxes to calculate the hash over.

The default hashing alg is md5 to match the martin mbtiles cli; but may change if I get around to updating some of our (dgi’s) very large datasets; xxh64 is generally very fast.

> utiles agg-hash -z 2 osm-standard.z0z4.mbtiles
{
  "hash_type": "md5",
  "hash": "F211FF7D9FF917B58808302E0AAE82FF",
  "ntiles": 16,
  "dt": {
    "secs": 0,
    "nanos": 709600
  }
}

> utiles agg-hash osm-standard.z0z4.mbtiles --hash md5
{
  "hash_type": "md5",
  "hash": "3A9279283D4D6B5B12362E3A76AF7201",
  "ntiles": 341,
  "dt": {
    "secs": 0,
    "nanos": 10092400
  }
}

> utiles agg-hash osm-standard.z0z4.mbtiles
{
  "hash_type": "md5",
  "hash": "3A9279283D4D6B5B12362E3A76AF7201",
  "ntiles": 341,
  "dt": {
    "secs": 0,
    "nanos": 10108300
  }
}

copy

> utiles tj osm-standard.z0z4.mbtiles
{
  "tilejson": "3.0.0",
  "tiles": [],
  "bounds": [
    -180.0,
    -85.05113,
    180.0,
    85.05113
  ],
  "center": [
    0.0,
    0.0,
    2
  ],
  "description": "osm standard png tiles 256",
  "maxzoom": 4,
  "minzoom": 0,
  "name": "osm-standard",
  "format": "png",
  "type": "overlay"
}

> utiles copy osm-standard.z0z4.mbtiles osm-standard.z4.mbtiles -z 4
2025-01-14T22:17:07.113799Z  INFO utiles::copy: copy-config-json: {
  "src": "osm-standard.z0z4.mbtiles",
  "dst": "osm-standard.z4.mbtiles",
  "zset": 16,
  "zooms": [
    4
  ],
  "bboxes": null,
  "bounds_string": null,
  "verbose": true,
  "dryrun": false,
  "force": false,
  "jobs": null,
  "istrat": "None",
  "dst_type": null,
  "hash": null,
  "stream": false
}
2025-01-14T22:17:07.114507Z  WARN utiles::copy::pasta: mbtiles-2-mbtiles copy is a WIP
2025-01-14T22:17:07.116782Z  INFO utiles::copy::pasta: dst_db_type_if_new: Some(Flat)
2025-01-14T22:17:07.154346Z  INFO utiles::copy::pasta: Copying from "osm-standard.z0z4.mbtiles" (flat) -> "osm-standard.z4.mbtiles" flat
2025-01-14T22:17:07.154803Z  INFO utiles::copy::pasta: Copying tiles: "osm-standard.z0z4.mbtiles" -> "osm-standard.z4.mbtiles"
2025-01-14T22:17:07.165062Z  INFO utiles::copy::pasta: Copied 256 tiles from "osm-standard.z0z4.mbtiles" -> "osm-standard.z4.mbtiles" in 10.0263ms

> utiles tj osm-standard.z4.mbtiles
{
  "tilejson": "3.0.0",
  "tiles": [],
  "bounds": [
    -180.0,
    -85.05113,
    180.0,
    85.05113
  ],
  "center": [
    0.0,
    0.0,
    2
  ],
  "description": "osm standard png tiles 256",
  "maxzoom": 4,
  "minzoom": 4,
  "name": "osm-standard",
  "dbtype": "flat",
  "format": "png",
  "type": "overlay"
}