{"id":13556418,"url":"https://github.com/Qwant/qwantmaps","last_synced_at":"2025-04-03T09:31:20.818Z","repository":{"id":42377913,"uuid":"139039744","full_name":"Qwant/qwantmaps","owner":"Qwant","description":"Central repository for Qwant Maps resources","archived":true,"fork":false,"pushed_at":"2023-10-24T08:59:32.000Z","size":1433,"stargazers_count":380,"open_issues_count":73,"forks_count":34,"subscribers_count":23,"default_branch":"master","last_synced_at":"2024-11-04T05:33:55.161Z","etag":null,"topics":["geocoder","kartotherian","osm","qwant","qwant-maps","tile-data","tile-server","vector-tiles"],"latest_commit_sha":null,"homepage":"https://www.qwant.com/maps/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Qwant.png","metadata":{"files":{"readme":"readme.md","changelog":"CHANGELOG.md","contributing":"contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-06-28T15:54:17.000Z","updated_at":"2024-10-05T15:17:45.000Z","dependencies_parsed_at":"2022-08-26T10:11:16.471Z","dependency_job_id":"4b0093e7-c781-4250-b046-229fd95a366c","html_url":"https://github.com/Qwant/qwantmaps","commit_stats":null,"previous_names":["qwantresearch/qwantmaps"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwant%2Fqwantmaps","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwant%2Fqwantmaps/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwant%2Fqwantmaps/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qwant%2Fqwantmaps/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Qwant","download_url":"https://codeload.github.com/Qwant/qwantmaps/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246976250,"owners_count":20863047,"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":["geocoder","kartotherian","osm","qwant","qwant-maps","tile-data","tile-server","vector-tiles"],"created_at":"2024-08-01T12:03:49.513Z","updated_at":"2025-04-03T09:31:19.254Z","avatar_url":"https://github.com/Qwant.png","language":null,"funding_links":[],"categories":["Others","others"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"./images/logo.png\" alt=\"QwantMaps\" width=\"520\" height=\"200\" /\u003e\n\u003c/h1\u003e\n\n\u003ch5 align=\"center\"\u003e\n  \u003ca href=\"https://www.qwant.com/maps\"\u003eMaps\u003c/a\u003e |\n  \u003ca href=\"./contributing.md\"\u003eContribute\u003c/a\u003e |\n  \u003ca href=\"https://betterweb.qwant.com/en/qwant-maps-a-open-and-privacy-focused-map/\"\u003eAbout\u003c/a\u003e |\n  \u003ca href=\"https://github.com/Qwant/erdapfel\"\u003eFrontend\u003c/a\u003e |\n  \u003ca href=\"https://github.com/Qwant/kartotherian_docker\"\u003eTile server\u003c/a\u003e |\n  \u003ca href=\"https://github.com/CanalTP/mimirsbrunn\"\u003eGeocoder\u003c/a\u003e |\n  \u003ca href=\"https://github.com/Qwant/idunn\"\u003eInternal API\u003c/a\u003e\n\u003c/h5\u003e\n\n\u003cp align=\"center\"\u003e\n🗺️ \u003ca href=\"https://www.qwant.com/maps\"\u003e\u003cstrong\u003eQwant Maps\u003c/strong\u003e\u003c/a\u003e is a map application that respects your privacy 🔍\n\u003c/p\u003e\n\n![Qwant Maps screenshot](screenshot.png)\n\n## Qwant Maps URLs\n\nQwant Maps provides links you can share with your friends to help them to #SwitchToQwant and #SwitchToOSM.\nFor instance, you can:\n- search for a specific location on the map with the following format:  \n`https://www.qwant.com/maps/#map=\u003czoom level\u003e/\u003clatitude\u003e/\u003clongitude\u003e`  \nExample: https://www.qwant.com/maps/#map=12.08/48.8642287/2.3391427\n\n\n- search a specific place on the map with the following path:  \n`https://www.qwant.com/maps/place/\u003cid\u003e`  \nExample: https://www.qwant.com/maps/place/osm:node:532031656@LExpress_de_Lyon\n\n#### A routing request\n\nThis endpoint points to a routing form and can pre-fill some of the fields.  \nFor instance: https://www.qwant.com/maps/routes/?origin=latlon:48.8459543:2.3714015\u0026destination=latlon:48.8702200:2.27863300\u0026mode[]=walking#map=18.00/48.8459543/2.3714015\n\nThe parameters corresponding to this endpoint are the following:\n\n| Name | Required| Description |\n| -------- | :--------: | -------- |\n| origin    |   :x:   | `id` of some place to use as the starting point     |\n| destination    |   :x:   | `id` of some place to use as the ending point  |\n| mode   |   :x:   | if you want to pre-select a routing mode in the routing form. One of `walking`, `cycling`, `driving`, `public_transport`\n\n## Architecture\n\nQwant Maps can be seen as 4 separated components:\n\n* a tile server,\n* a search engine (geocoder),\n* an API to detail points of interest and places,\n* a front end.\n\n![global architecture](images/maps_archi.jpg)\n\nNB: To provide the Qwant Maps service, Qwant hosts instances of the tile server, the geocoder and the Idunn API on its own servers.\n\nPlease note that Qwant instances are internal components and are not meant (yet) to be used directly other than as part of Qwant Maps. You can learn more in our [Terms of services](https://about.qwant.com/fr/legal/cgu/qwant-maps/)\n\n#### Tile server\n\nA tile server is a service whose job is to give all that is needed to display a fraction of a map.\n\nQwant Maps provides only [vector tiles](https://en.wikipedia.org/wiki/Vector_tiles) so the tile server does not serve images (as it is done with [raster tiles](https://switch2osm.org/the-basics/)) but raw data. It is the front end, [Erdapfel](#erdapfel), that takes the data and renders it into a user browsable map.\n\nThe tile server is a combination of 2 great opensource projects:\n\n* [Planetiler](https://github.com/onthegomap/planetiler), a flexible tool to build planet-scale vector tilesets from OpenStreetMap data fast without database\n* [OpenMapTiles](https://github.com/openmaptiles/openmaptiles), for their great and flexible tile schema.\n\nOpenMapTiles makes it possible for Qwant Maps to have an [easy to define/extend](https://github.com/Qwant/openmaptiles) vector tile schema.\n\n#### Geocoder\n\nThe geographical search engine (also called geocoder) used for Qwant Maps is [Bragi](https://github.com/CanalTP/mimirsbrunn).\n\nBragi is a geocoder based on [Elasticsearch](https://www.elastic.co) and rust components developed by [Kisio Digital](http://www.kisiodigital.com/).\n\n#### Places API\n\nTo get more details on places and Points Of Interest (POIs), Qwant Maps uses an additional API: [Idunn](https://github.com/Qwant/idunn), that combines the information in the geocoder with external APIs to format detailed POIs data to display in the front end.\n\n#### Front end \u003ca name=\"erdapfel\"\u003e\u003c/a\u003e\n\nQwant Maps's front, [Erdapfel](https://github.com/Qwant/erdapfel), is a Javascript single page app that allows to browse the map, search for places, see your position on the map, etc.\n\nThe front end uses [Mapbox GL](https://www.mapbox.com/mapbox-gl-js/api/) to render the map, using both the tiles from the tile server, and Qwant Maps [custom map style](https://github.com/Qwant/qwant-basic-gl-style).\n\n## Data\n\n#### Tiles data \u003ca name=\"tilesdata\"\u003e\u003c/a\u003e\n\nThe main source of data for the tile server is the awesome [OpenStreetMap](https://www.openstreetmap.org) (OSM) data :heart: but other data like [natural earth](http://www.naturalearthdata.com/), better water polygon... are also used.\n\nTo run the tileserver, we utilize a custom version of [Openmaptiles](https://github.com/openmaptiles/openmaptiles) adapt to work with [Planetiler](https://github.com/onthegomap/planetiler): we have a fork project of [Planetiler Openmaptiles](https://github.com/openmaptiles/planetiler-openmaptiles).\n\nThis configuration leverages the  [PMtiles format](https://github.com/protomaps/PMTiles), served by [Martin](https://github.com/maplibre/martin)\n\n#### Geocoder data \u003ca name=\"geocoder_data\"\u003e\u003ca/\u003e\n\nThe data import process in [Mimirsbrunn](https://github.com/CanalTP/mimirsbrunn) is defined in a [python script](https://github.com/Qwant/docker_mimir/blob/master/tasks.py).\n\nFirst, the OSM data is given to [Cosmogony](https://github.com/osm-without-borders/cosmogony) which outputs a big JSON file with all the world's administrative regions.\n\nThis file is then imported in Mimir by [cosmogony2mimir](https://github.com/CanalTP/mimirsbrunn#cosmogony2mimir).\n\nWe then import addresses using [addresses-importer](https://github.com/Qwant/addresses-importer). It downloads datasets of addresses (from [OpenAddresses](http://openaddresses.io/) and [OpenStreetMap](https://www.openstreetmap.org) mostly), deduplicate them and then import them into our geocoder using [openaddresses2mimir](https://github.com/CanalTP/mimirsbrunn#openaddresses2mimir).\n\nThe streets are imported afterwards, from the OSM pbf file with [osm2mimir](https://github.com/CanalTP/mimirsbrunn#osm2mimir).\n\nFinally, the POIs are extracted from the PostgreSQL database created thanks to [imposm](https://github.com/omniscale/imposm3) using [Fafnir](https://github.com/Qwant/fafnir).\n\n#### Places API data\n\nIdunn does not need its own data import process, but the API depends on:\n\n* the data of the [geocoder](#geocoder_data),\n* Wikipedia data, fetched either on the Wikipedia APIs or in a custom Elasticsearch database.\n\n##### OSM updates \u003ca name=\"osm_updates\"\u003e\u003c/a\u003e\n\nThe world keeps moving and OpenStreetMap data is getting better and better every day, so we need to update the data in all our components on a regular basis.\nWe update the tiles entirely on weekly basis from [OSM planet pbf](https://registry.opendata.aws/osm/)\n\nIn the same time we have to up-to-date data in PostgreSQL, we can import again the geocoder POIs data with  the current version of the tiles.\n\nWe update the remaining geocoder data (administrative regions, streets and addresses) on a monthly basis.\n\n## How to run\n\nQwant maps use to be fully Opensource but migrate to internal repository. Our idea is to keep update version on Github.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FQwant%2Fqwantmaps","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FQwant%2Fqwantmaps","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FQwant%2Fqwantmaps/lists"}