{"id":19258804,"url":"https://github.com/outdooractive/mvt-tools","last_synced_at":"2025-04-21T16:30:33.075Z","repository":{"id":40367092,"uuid":"378957054","full_name":"Outdooractive/mvt-tools","owner":"Outdooractive","description":"MapLibre/Mapbox/Mapnik vector tiles (mvt) reader/writer for Swift","archived":false,"fork":false,"pushed_at":"2024-09-11T17:38:22.000Z","size":2242,"stargazers_count":8,"open_issues_count":11,"forks_count":4,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-01T14:21:01.862Z","etag":null,"topics":["command-line-tool","geojson","geojson-data","geojson-library","geojson-vt","geospatial","gis","ios","linux","macos","mapbox","maplibre","mapnik","mvt","swift","vector-tiles","watchos"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Outdooractive.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-06-21T14:22:39.000Z","updated_at":"2025-03-26T15:04:02.000Z","dependencies_parsed_at":"2024-01-09T16:40:35.886Z","dependency_job_id":"f9c5a005-050f-45ff-a888-187d0922b0a2","html_url":"https://github.com/Outdooractive/mvt-tools","commit_stats":{"total_commits":33,"total_committers":2,"mean_commits":16.5,"dds":0.06060606060606055,"last_synced_commit":"447002c8a1c161d4440df941ca0cd6018791078a"},"previous_names":[],"tags_count":64,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Outdooractive%2Fmvt-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Outdooractive%2Fmvt-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Outdooractive%2Fmvt-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Outdooractive%2Fmvt-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Outdooractive","download_url":"https://codeload.github.com/Outdooractive/mvt-tools/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250090608,"owners_count":21373216,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command-line-tool","geojson","geojson-data","geojson-library","geojson-vt","geospatial","gis","ios","linux","macos","mapbox","maplibre","mapnik","mvt","swift","vector-tiles","watchos"],"created_at":"2024-11-09T19:14:24.341Z","updated_at":"2025-04-21T16:30:32.426Z","avatar_url":"https://github.com/Outdooractive.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FOutdooractive%2Fmvt-tools%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/Outdooractive/mvt-tools)  \n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FOutdooractive%2Fmvt-tools%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/Outdooractive/mvt-tools)  \n[![](https://img.shields.io/github/license/Outdooractive/mvt-tools)](https://github.com/Outdooractive/mvt-tools/blob/main/LICENSE)  \n[![](https://img.shields.io/badge/Homebrew-Outdooractive%2Fhomebrew--tap%2Fmvt--tools-blue\n)](#command-line-tool)  \n[![](https://img.shields.io/github/v/release/Outdooractive/mvt-tools?sort=semver\u0026display_name=tag)](https://github.com/Outdooractive/mvt-tools/releases) [![](https://img.shields.io/github/release-date/Outdooractive/mvt-tools?display_date=published_at\n)](https://github.com/Outdooractive/mvt-tools/releases)  \n[![](https://img.shields.io/github/issues/Outdooractive/mvt-tools\n)](https://github.com/Outdooractive/mvt-tools/issues) [![](https://img.shields.io/github/issues-pr/Outdooractive/mvt-tools\n)](https://github.com/Outdooractive/mvt-tools/pulls)  \n[![](https://img.shields.io/github/check-runs/Outdooractive/mvt-tools/main)](https://github.com/Outdooractive/mvt-tools/actions)\n\n# MVTTools\n\nMapLibre/Mapbox vector tiles (MVT) reader/writer library for Swift, together with a powerful tool for working with vector tiles and GeoJSONs from the command line.\n\n## Features\n\n- Load and write MapLibre/Mapbox Vector Tiles from/to disk, data objects or URLs (also handles gzipped input).\n- Export options: Zipped, buffered (in pixels or extents), simplified (in meters or extents).\n- Can dump a tile as a GeoJSON object.\n- Supported projections: EPSG:4326, EPSG:3857 or none (uses the tile's coordinate space).\n- Fast search (supports indexing), either within a bounding box or with center and radius.\n- Extract selected layers into a new tile.\n- Merge tiles into one.\n- Can extract some infos from tiles like feature count, etc.\n- Powerful command line tool (via [Homebrew](#command-line-tool), documentation below) for working with vector tiles and GeoJSON files.\n\n## Requirements\n\nThis package requires Swift 5.10 or higher (at least Xcode 14), and compiles on iOS (\\\u003e= iOS 13), macOS (\\\u003e= macOS 13), tvOS (\\\u003e= tvOS 13), watchOS (\\\u003e= watchOS 6) as well as Linux.\n\n## Installation with Swift Package Manager\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/Outdooractive/mvt-tools\", from: \"1.8.0\"),\n],\ntargets: [\n    .target(name: \"MyTarget\", dependencies: [\n        .product(name: \"MVTTools\", package: \"mvt-tools\"),\n    ]),\n]\n```\n\nThis package uses the [gis-tools](https://github.com/Outdooractive/gis-tools) library, and is being used by the [mvt-postgis](https://github.com/Outdooractive/mvt-postgis) library, please have a look at them as well.\n\n## Usage\n\nSee the [API documentation](https://swiftpackageindex.com/Outdooractive/mvt-tools/main/documentation/mvttools) (via Swift Package Index).\n\n### Read\n\n```swift\nimport MVTTools\n\n// Load\nlet mvtData = Data(contentsOf: URL(fileURLWithPath: \"14_8716_8015.vector.mvt\"))!\nlet tile = VectorTile(data: mvtData, x: 8716, y: 8015, z: 14, indexed: .hilbert)!\n\nprint(tile.isIndexed)\nprint(tile.layerNames.sorted())\n\nlet tileAsGeoJsonData: Data? = tile.toGeoJson(prettyPrinted: true)\n...\n\nlet result = tile.query(at: Coordinate3D(latitude: 3.870163, longitude: 11.518585), tolerance: 100.0)\n...\n```\n\n### Write\n\n```swift\nimport MVTTools\n\nvar tile = VectorTile(x: 8716, y: 8015, z: 14)!\nvar feature = Feature(Point(Coordinate3D(latitude: 3.870163, longitude: 11.518585)))\nfeature.properties = [\n    \"test\": 1,\n    \"test2\": 5.567,\n    \"test3\": [1, 2, 3],\n    \"test4\": [\n        \"sub1\": 1,\n        \"sub2\": 2\n    ]\n]\n\ntile.setFeatures([feature], for: \"test\")\n\n// Also have a look at ``VectorTile.ExportOptions``\nlet tileData = tile.data()\n...\n```\n\n### Playground\n\nOn macOS you can use a Swift Playground to inspect the MVTTools API such as `layerNames` and `projection`.\n\n* Load tile using MVTTools\n* Inspect the properties of the `VectorTile`\n\n# Command line tool\n\nYou can install the command line tool `mvt` either\n- with homebrew: `brew install Outdooractive/homebrew-tap/mvt-tools`\n- or locally to `/usr/local/bin` with `./install_mvt.sh`\n\n`mvt` works with vector tiles or GeoJSON files from local disk or served from a web server.\n\nGeoJSONs can contain a layer name in their Feature properties (default name is `vt_layer`), and any resulting GeoJSON will automatically include this property.\nThis can be controlled with the options `--property-name` (or `-P`), `--disable-input-layer-property` (or `-Di`) and `--disable-output-layer-property` (or `-Do`).\nSome commands allow limiting the result to certain layers with `--layer` (or `-l`), which can be repeated for as many layers as necessary.\n\n```bash\n# mvt -h\nOVERVIEW: A utility for inspecting and working with vector tiles (MVT) and GeoJSON files.\n\nA x/y/z tile coordinate is needed for encoding/decoding vector tiles (MVT).\nThis tile coordinate can be extracted from the file path/URL if it's either in the form '/z/x/y' or 'z_x_y'.\nTile coordinates are not necessary for GeoJSON input files.\n\nExamples:\n- Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt\n- https://demotiles.maplibre.org/tiles/2/2/1.pbf\n\nUSAGE: mvt \u003csubcommand\u003e\n\nOPTIONS:\n  --version               Show the version.\n  -h, --help              Show help information.\n\nSUBCOMMANDS:\n  dump (default)          Print the input file (mvt or GeoJSON) as pretty-printed GeoJSON to the console\n  info                    Print information about the input file (mvt or GeoJSON)\n  query                   Query the features in the input file (mvt or GeoJSON)\n  merge                   Merge any number of vector tiles or GeoJSONs\n  import                  Import some GeoJSONs into a vector tile\n  export                  Export a vector tile as GeoJSON to a file\n\n  See 'mvt help \u003csubcommand\u003e' for detailed help.\n```\n---\n### mvt dump\n\nPrint a vector tile or GeoJSON file as pretty-printed GeoJSON.\n\n```bash\nmvt dump Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt\n{\n  \"type\" : \"FeatureCollection\",\n  \"features\" : [\n    {\n      \"bbox\" : [\n        11.516327261924731,\n        3.8807821163834175,\n        11.516590118408191,\n        3.8815421167424793\n      ],\n      \"properties\" : {\n        \"oneway\" : 1,\n        \"vt_layer\" : \"tunnel\",\n        \"class\" : \"motorway\"\n      },\n      \"geometry\" : {\n        \"coordinates\" : [\n          ...\n        ],\n        \"type\" : \"LineString\"\n      },\n      \"id\" : 1,\n      \"type\" : \"Feature\"\n    },\n    ...\n}\n```\n---\n### mvt info\n\nPrint some informations about vector tiles/GeoJSONs:\n- The number of features, points, linestrings, polygons per layer\n- The properties for each layer\n- Counts of specific properties\n\n**Example 1**: Print information about the MVTTools test vector tile at zoom 14, at Yaoundé, Cameroon.\n\n```bash\nmvt info Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt\n\n Name               | Features | Points | LineStrings | Polygons | Unknown | Version\n--------------------+----------+--------+-------------+----------+---------+--------\n area_label         | 55       | 55     | 0           | 0        | 0       | 2\n barrier_line       | 4219     | 0      | 4219        | 0        | 0       | 2\n bridge             | 14       | 0      | 14          | 0        | 0       | 2\n building           | 5414     | 0      | 0           | 5414     | 0       | 2\n building_label     | 413      | 413    | 0           | 0        | 0       | 2\n ...\n road               | 502      | 1      | 497         | 4        | 0       | 2\n road_label         | 309      | 0      | 309         | 0        | 0       | 2\n```\n---\n\n**Example 2**: Inspect a MapLibre vector tile at zoom 2, with an extent showing Norway to India.\n\n```bash\nmvt info https://demotiles.maplibre.org/tiles/2/2/1.pbf\n\n Name      | Features | Points | LineStrings | Polygons | Unknown | Version\n-----------+----------+--------+-------------+----------+---------+--------\n centroids | 104      | 104    | 0           | 0        | 0       | 2\n countries | 113      | 0      | 0           | 113      | 0       | 2\n geolines  | 4        | 0      | 4           | 0        | 0       | 2\n```\n---\n\n**Example 3**: Print information about the properties for each layer.\n\n```bash\nmvt info Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt\n\n Name               | area | class | group | layer | ldir | len | name | name_de | name_en | name_es | name_fr | network | oneway | ref | reflen | scalerank | type\n--------------------+------+-------+-------+-------+------+-----+------+---------+---------+---------+---------+---------+--------+-----+--------+-----------+-----\n airport_label      | 0    | 0     | 0     | 0     | 0    | 0   | 0    | 0       | 0       | 0       | 0       | 0       | 0      | 0   | 0      | 0         | 0\n area_label         | 55   | 55    | 0     | 0     | 0    | 0   | 55   | 55      | 55      | 55      | 55      | 0       | 0      | 0   | 0      | 0         | 0\n barrier_line       | 0    | 4219  | 0     | 0     | 0    | 0   | 0    | 0       | 0       | 0       | 0       | 0       | 0      | 0   | 0      | 0         | 0\n bridge             | 0    | 14    | 0     | 13    | 0    | 0   | 0    | 0       | 0       | 0       | 0       | 0       | 14     | 0   | 0      | 0         | 0\n...\n```\n---\n\n**Example 4**: Print information about specific properties.\n\n```bash\nmvt info -p class Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt\n\n Name  | cemetery | driveway | fence | hedge | hospital | industrial | main | major_rail | mini_roundabout | minor_rail | motorway | park | parking | path | pitch | rail | school | service | street | street_limited | wetland | wood\n-------+----------+----------+-------+-------+----------+------------+------+------------+-----------------+------------+----------+------+---------+------+-------+------+--------+---------+--------+----------------+---------+-----\n class | 4        | 36       | 3895  | 324   | 9        | 2          | 113  | 21         | 1               | 13         | 30       | 95   | 59      | 46   | 21    | 2    | 59     | 187     | 376    | 4              | 4       | 12\n```\n\n---\n### mvt query\n\n**Example 1**: Query a vector tile or GeoJSON file with a search term.\n\n```bash\nmvt query Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt \"École\"\n{\n  \"features\" : [\n    {\n      \"bbox\" : [\n        11.537318229675295,\n        3.8732409490233337,\n        11.537318229675295,\n        3.8732409490233337\n      ],\n      \"geometry\" : {\n        \"coordinates\" : [\n          11.537318229675295,\n          3.8732409490233337\n        ],\n        \"type\" : \"Point\"\n      },\n      \"id\" : 51,\n      \"layer\" : \"building_label\",\n      \"properties\" : {\n        \"area\" : 173.97920227050781,\n        \"name\" : \"École Maternelle\",\n        \"name_de\" : \"École Maternelle\",\n        \"name_en\" : \"École Maternelle\",\n        \"name_es\" : \"École Maternelle\",\n        \"name_fr\" : \"École Maternelle\"\n      },\n      \"type\" : \"Feature\"\n    },\n    ...\n}\n```\n---\n**Example 2**: Query a tile with `latitude,longitude,radius`.\n\n```bash\nmvt query Tests/MVTToolsTests/TestData/14_8716_8015.geojson \"3.87324,11.53731,1000\"\n{\n  \"features\" : [\n    {\n      \"bbox\" : [\n        11.529276967048643,\n        3.8803432426251487,\n        11.530832648277283,\n        3.8823074685255259\n      ],\n      \"geometry\" : {\n        \"coordinates\" : [\n          ...\n        ],\n        \"type\" : \"LineString\"\n      },\n      \"id\" : 48,\n      \"layer\" : \"road\",\n      \"properties\" : {\n        \"class\" : \"driveway\",\n        \"oneway\" : 0\n      },\n      \"type\" : \"Feature\"\n    },\n    ...\n}\n```\n---\n**Example 3**: Query Feature properties in a tile.\n\n```bash\nmvt query -p Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt \".area \u003e 40000 and .class == 'hospital'\"\n\n{\n  \"features\" : [\n    {\n      \"bbox\" : [\n        11.510410308837876,\n        3.871287406415171,\n        11.510410308837876,\n        3.871287406415171\n      ],\n      \"geometry\" : {\n        \"coordinates\" : [\n          11.510410308837876,\n          3.871287406415171\n        ],\n        \"type\" : \"Point\"\n      },\n      \"id\" : 2,\n      \"properties\" : {\n        \"area\" : 48364.9375,\n        \"class\" : \"hospital\",\n        \"name\" : \"Hopital Central de Yaoundé\",\n        \"name_de\" : \"Hopital Central de Yaoundé\",\n        \"name_en\" : \"Hopital Central de Yaoundé\",\n        \"name_es\" : \"Hopital Central de Yaoundé\",\n        \"name_fr\" : \"Hopital Central de Yaoundé\",\n        \"vt_layer\" : \"area_label\"\n      },\n      \"type\" : \"Feature\"\n    }\n  ],\n  \"type\" : \"FeatureCollection\"\n}\n```\n\nThe query language is very loosely modeled after the jq query language.\nThe output will contain all features where the query returns `true`.\n\nHere is an overview. Example:\n```\n\"properties\": {\n  \"foo\": {\"bar\": 1},\n  \"some\": [\"a\", \"b\"],\n  \"value\": 1,\n  \"string\": \"Some name\"\n}\n```\n\nValues are retrieved by putting a `.` in front of the property name. The property name must be quoted\nif it is a number or contains non-alphabetic characters. Elements in arrays can be\naccessed either by simply using the array index after the dot, or by wrapping it in brackets.\n\n```\n.foo       // true, property \"foo\" exists\n.foo.bar   // true, property \"foo\" is a dictionary containing \"bar\"\n.\"foo\".\"bar\" // true, same as above but quoted\n.'foo'.'bar' // true, same as above but quoted\n.foo.x     // false, \"foo\" doesn't contain \"x\"\n.\"foo.bar\" // false, property \"foo.bar\" doesn't exist\n.foo.[0]   // false, \"foo\" is not an array\n.some.[0]  // true, \"some\" is an array and has an element at index \"0\"\n.some.0    // true, same as above but without brackets\n.some.\"0\"  // false, \"0\" is a string key but \"some\" is not a dictionary\n```\n\nComparisons can be expressed like this:\n```\n.value == \"bar\" // false\n.value == 1  // true\n.value != 1  // false\n.value \u003e 1   // false\n.value \u003e= 1  // true\n.value \u003c 1   // false\n.value \u003c= 1  // true\n.string =~ /[Ss]ome/ // true\n.string =~ /some/    // false\n.string =~ /some/i   // true, case insensitive regexp\n.string =~ \"^Some\"   // true, can also use quotes\n```\n\nConditions (evaluated left to right):\n```\n.foo.bar == 1 and .value == 1 // true\n.foo == 1 or .bar == 2        // false\n.foo == 1 or .value == 1      // true\n.foo not          // false, true if foo does not exist\n.foo and .bar not // true, foo and bar don't exist together\n.foo or .bar not  // false, true if neither foo nor bar exist\n.foo.bar not      // false, true if \"bar\" in dictionary \"foo\" doesn't exist\n```\n\nOther:\n```\nnear(latitude,longitude,tolerance) // true if the feature is within \"tolerance\" around the coordinate\n```\n\nSome complete examples:\n```\n// Can use single quotes for strings\nmvt query -p 14_8716_8015.vector.mvt \".area \u003e 20000 and .class == 'hospital'\"\n\n// ... or double quotes, but they must be escaped\nmvt query -p 14_8716_8015.vector.mvt \".area \u003e 20000 and .class == \\\"hospital\\\"\"\n\n// No need to quote the query if it doesn't conflict with your shell\n// Print all features that have an \"area\" property\nmvt query -p 14_8716_8015.vector.mvt .area\n// Features which don't have \"area\" and \"name\" properties\nmvt query -p 14_8716_8015.vector.mvt .area and .name not\n\n// Case insensitive regular expression\nvt query -p 14_8716_8015.vector.mvt \".name =~ /hopital/i\"\n\n// Case sensitive regular expression\nmvt query -p 14_8716_8015.vector.mvt \".name =~ /Recherches?/\"\n// Can also use quotes instead of slashes\nmvt query -p 14_8716_8015.vector.mvt \".name =~ 'Recherches?'\"\n\n// Features around a coordinate\nmvt query -p 14_8716_8015.vector.mvt \"near(3.87324,11.53731,1000)\"\n// With other conditions\nmvt query -p 14_8716_8015.vector.mvt \".name =~ /^lac/i and near(3.87324,11.53731,10000)\"\n```\n\n---\n### mvt merge\n\nMerge two or more vector tiles or GeoJSON files in any combination.\n\n```bash\n# All vector tiles:\nmvt merge --output merged.mvt path/to/first.mvt path/to/second.mvt\n\n# All GeoJSON files:\nmvt merge --output merged.geojson path/to/first.geojson path/to/second.geojson\n\n# Merge GeoJSON files into a vector tile:\nmvt merge --output merged.mvt --output-format mvt path/to/first.geojson path/to/second.geojson\n\n# Merge vector tiles into a GeoJSOn file:\nmvt merge --output merged.geojson --output-format geojson path/to/first.mvt path/to/second.mvt\n```\n---\n### mvt export\n\nWrite a vector tile as GeoJSON to a file.\n\n```bash\nmvt export --output dumped.geojson --pretty-print Tests/MVTToolsTests/TestData/14_8716_8015.vector.mvt\n```\n---\n### mvt import\n\nCreate a vector tile from GeoJSON.\n\n```bash\nmvt import new.mvt -x 8716 -y 8015 -z 14 Tests/MVTToolsTests/TestData/14_8716_8015.geojson\n```\n---\n\n# Contributing\n\nPlease [create an issue](https://github.com/Outdooractive/mvt-tools/issues) or [open a pull request](https://github.com/Outdooractive/mvt-tools/pulls).\n\n### Dependencies (for development)\n\n```\nbrew install protobuf swift-protobuf swiftlint\n```\n\n# TODOs and future improvements\n\n- Documentation (!)\n- Tests\n- Locking (when updating/deleting features, indexing)\n- Query option: within/intersects\n\n- https://github.com/mapbox/vtcomposite\n- https://github.com/mapbox/geosimplify-js\n\n# Links\n\n- Libraries\n    - https://github.com/Outdooractive/gis-tools\n    - https://github.com/Outdooractive/mvt-postgis\n    - https://github.com/apple/swift-protobuf\n\n- Vector tiles\n    - https://github.com/mapbox/vector-tile-spec/tree/master/2.1\n    - https://github.com/mapbox/vector-tile-spec/blob/master/2.1/vector_tile.proto\n    - https://docs.mapbox.com/vector-tiles/specification/#format\n\n- Sample data for testing:\n    - https://github.com/mapbox/mvt-fixtures\n    - https://github.com/mapbox/mapnik-vector-tile/tree/master/bench\n    - https://github.com/mapbox/mapnik-vector-tile/tree/master/examples\n    - https://github.com/mapbox/mapnik-vector-tile/tree/master/test\n\n- Other code for inspiration:\n    - https://github.com/mapnik/node-mapnik/blob/master/src/mapnik_vector_tile.cpp\n    - https://github.com/mapbox/vt2geojson\n\n# License\n\nMIT\n\n# Authors\n\nThomas Rasch, Outdooractive\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutdooractive%2Fmvt-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutdooractive%2Fmvt-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutdooractive%2Fmvt-tools/lists"}