• This repository has been archived on 03/Jun/2024
  • Stars
    star
    379
  • Rank 113,004 (Top 3 %)
  • Language
  • License
    Apache License 2.0
  • Created over 6 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Central repository for Qwant Maps resources

QwantMaps

Maps | Contribute | About | Frontend | Tile server | Geocoder | Internal API

🗺️ Qwant Maps is a map application that respects your privacy 🔍

Qwant Maps screenshot

Qwant Maps URLs

Qwant Maps provides links you can share with your friends to help them to #SwitchToQwant and #SwitchToOSM. For instance, you can:

A routing request

This endpoint points to a routing form and can pre-fill some of the fields.
For instance: https://www.qwant.com/maps/routes/?origin=latlon:48.8459543:2.3714015&destination=latlon:48.8702200:2.27863300&mode[]=walking#map=18.00/48.8459543/2.3714015

The parameters corresponding to this endpoint are the following:

Name Required Description
origin id of some place to use as the starting point
destination id of some place to use as the ending point
mode if you want to pre-select a routing mode in the routing form. One of walking, cycling, driving, public_transport

Architecture

Qwant Maps can be seen as 4 separated components:

  • a tile server,
  • a search engine (geocoder),
  • an API to detail points of interest and places,
  • a front end.

Tile server

A tile server is a service whose job is to give all that is needed to display a fraction of a map.

Qwant Maps provides only vector tiles so the tile server does not serve images (as it is done with raster tiles) but raw data. It is the front end, Erdapfel, that takes the data and renders it into a user browsable map.

The tile server is a combination of 2 great opensource projects:

  • kartotherian, the Wikimedia stack to have a highly available tile server. It is itself based on a number of mapbox components,
  • OpenMapTiles, for their great and flexible tile schema.

OpenMapTiles makes it possible for Qwant Maps to have an easy to define/extend vector tile schema.

All the data (see below) are imported in a PostgreSQL database using mainly imposm. All the world's vector tiles are then generated using kartotherian's tilerator and stored in Cassandra. This enables Qwant Maps to have a fast and scalable way to serve tiles.

Geocoder

The geographical search engine (also called geocoder) used for Qwant Maps is Mimirsbrunn.

Mimirsbrunn is a geocoder based on Elasticsearch and rust components developed by Kisio Digital.

Places API

To get more details on places and Points Of Interest (POIs), Qwant Maps uses an additional API: Idunn, that combines the information in the geocoder with external APIs to format detailed POIs data to display in the front end.

Front end

Qwant Maps's front, Erdapfel, is a Javascript single page app that allows to browse the map, search for places, see your position on the map, etc.

The front end uses Mapbox GL to render the map, using both the tiles from the tile server, and Qwant Maps custom map style.

Data

Tiles data

The main source of data for the tile server is the awesome OpenStreetMap (OSM) data ❤️ but other data like natural earth, better water polygon... are also used.

All the tile's data import process is defined in python scripts.

This tool imports all the data into the PostgreSQL database and runs lots of post-process SQL functions (those functions are defined as postgresql triggers), so they will also be able to run on the OSM updates.

When the data is loaded in PostgreSQL, we use tilerator to generate all the tiles from the zoom level 0 to 14 and store them in Cassandra. This way, when a vector tile is requested to the tiles API kartotherian, no computation needs to be done, only a simple query by id on the highly available Cassandra to get the raw protobuf tiles stored in it.

Geocoder data

The data import process in Mimirsbrunn is defined in a python script.

First, the OSM data is given to Cosmogony which outputs a big JSON file with all the world's administrative regions.

This file is then imported in Mimir by cosmogony2mimir.

We then import addresses using addresses-importer. It downloads datasets of addresses (from OpenAddresses and OpenStreetMap mostly), deduplicate them and then import them into our geocoder using openaddresses2mimir.

The streets are imported afterwards from the OSM pbf file with osm2mimir.

Finally the POIs are extracted from the PostgreSQL database (thus we have a unified POI handling) using Fafnir.

Places API data

Idunn does not need its own data import process, but the API depends on:

  • the data of the geocoder,
  • Wikipedia data, fetched either on the Wikipedia APIs or in a custom Elasticsearch database.
OSM updates

The 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. The import of the world's data is quite a long process, so after the initial import, a dedicated task is used to read the OSM differential updates and apply the changes in the PostgreSQL database on a daily basis.

Once we have up-to-date data in PostgreSQL, we can import again the geocoder POIs data and regenerate the tiles impacted by the changes.

We update the remaining geocoder data (administrative regions, streets and addresses) on a monthly basis.

Global picture

global architecture

NB: To provide the Qwant Maps service, Qwant hosts instances of the tile server, the geocoder and the Idunn API on its own servers.

Please 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

How to run

Tiles

To run the tileserver, the easiest way is to use Docker.

The project kartotherian_docker provides a docker-compose with all that is needed.

This repository notably includes glue code to initiate and maintain Qwant Maps tiles:

Geocoder

The repository docker_mimir contains a docker-compose to easily spawn the needed Docker containers and to import the needed data in them.

Places API

Idunn is a custom Python API for Qwant Maps places and features (based on FastAPI).

The readme details the way to run it.

Front end

Erdapfel is a simple node application but you can also use Docker to run it.

You will need to set a few environment variables to link it to the other Qwant Maps components. Check out the readme to know more about its configuration.

More Repositories

1

erdapfel

Qwant Maps front-end
JavaScript
101
star
2

Instant-Answers

The Instant Answers project is no longer maintained by Qwant for technical reasons.
JavaScript
49
star
3

idunn

Qwant Maps internal API for Points of Interest, directions and more.
Python
36
star
4

qwant-viprivacy

Qwant VIPrivacy Extension
JavaScript
30
star
5

kartotherian_docker

Docker deployment for Qwant Maps tile server, based on Kartotherian (https://github.com/kartotherian/kartotherian)
Python
28
star
6

qwant-basic-gl-style

Default map style for Qwant Maps, following mapbox-gl style specification
JavaScript
28
star
7

fafnir

Import Qwant Maps POIs from PostgreSQL to Mímirsbrunn Elasticsearch
Rust
15
star
8

WebExtension

This addon allows you to expand your websearch
JavaScript
15
star
9

osm_boundaries_utils_rs

Read OpenStretMap relations with type=boundary as valid MultiPolygon in Rust
Rust
8
star
10

docker_mimir

Docker Compose configuration for Qwant Maps geocoder, based on Mimirsbrunn (https://github.com/CanalTP/mimirsbrunn)
Python
8
star
11

QwantBrowserAndroidCompose

Android browser rework using modern app architecture standards
JavaScript
7
star
12

chrome-extension

This addon allows you to expand your websearch with a preview of the best qwant results embedded in other search engines
JavaScript
7
star
13

firefox-extension

This addon allows you to expand your websearch with a preview of the best qwant results embedded in other search engines
JavaScript
6
star
14

addresses-importer

Read and deduplicate geographical addresses from OpenStreetMap and OpenAddresses
Rust
6
star
15

qwant-search-extension

Qwant Search Extension
JavaScript
5
star
16

QwantBrowserAndroid

Qwant browser for android
JavaScript
5
star
17

wikimedia-dumps

Import data from various Wikimedia sources
Python
5
star
18

safari-extension

This addon allows you to expand your websearch with a preview of the best qwant results embedded in other search engines
HTML
3
star
19

QwantLiteExtension

Qwant Lite as default search engine
JavaScript
3
star
20

MobileAppIOS

Qwant Mobile app for iOS
Swift
3
star
21

opera-extension

This addon allows you to expand your websearch with a preview of the best qwant results embedded in other search engines
JavaScript
3
star
22

fdroiddata

Python
1
star
23

MobileAppJunior_Desktop

1
star
24

firefoxios-l10n

1
star
25

snapearthapis

Jupyter Notebook
1
star
26

ios-l10n-scripts

Python
1
star
27

ie-extension

This addon allows you to expand your websearch with a preview of the best qwant results embedded in other search engines
1
star
28

qwant-junior-ios

Swift
1
star
29

qwant-vip-for-safari

Swift
1
star