kopia lustrzana https://github.com/osm2vectortiles/osm2vectortiles
211 wiersze
8.3 KiB
Markdown
211 wiersze
8.3 KiB
Markdown
# Usage Documentation
|
|
|
|
If you've gotten this far, you've already explored the [documentation](http://osm2vectortiles.org/docs/) and likely have imported
|
|
a smaller extract of the planet. If you're looking to adapt OSM2VectorTiles for your own purposes
|
|
or run the process yourself this usage documentation is for you. Many thanks to @stirringhalo for much of the usage documentation.
|
|
|
|
## Requirements
|
|
|
|
The entire project is structured components using Docker containers
|
|
to work together. Ensure you meet the prerequisites for running the
|
|
OSM2VectorTiles workflow.
|
|
|
|
- Install [Docker](https://docs.docker.com/engine/installation/)
|
|
- Install [Docker Compose](https://docs.docker.com/compose/install/)
|
|
- Setup a S3 bucket (or compatible object storage)
|
|
|
|
We assume a single machine setup for this purpose and later go into detail
|
|
how to run the workflow in a distributed manner.
|
|
|
|
**Hardware Requirements:**
|
|
|
|
You can render small areas with OSM2VectorTiles on your local machine.
|
|
However to run the workflow at global scale you need significant infrastructure.
|
|
|
|
- 500GB disk space (150GB PostGIS, 30GB planet dump, 50GB imposm3 cache, 50 GB final MBTiles)
|
|
- 16GB+ RAM recommended (up until 50 GB RAM for PostGIS)
|
|
- 8+ CPU cores (up until 16-40 cores) for rendering vector tiles and PostGIS calculations
|
|
|
|
## High-level Procedure
|
|
|
|
The architecture of the project is structured into the import phase (ETL process),
|
|
the changed tiles detection phase and the export phase (render vector tiles).
|
|
|
|
If you run the distributed workflow yourself, the following steps take place.
|
|
A detailed explanation follows afterwards.
|
|
|
|
1. Import external data sources into PostGIS
|
|
2. Import OSM PBF into PostGIS
|
|
3. Create a low level global extract from z0 to z8
|
|
4. Generate jobs to render entire planet and submit them to message queue (RabbitMQ)
|
|
5. Start rendering processes to work through submitted jobs
|
|
6. Merge job results together into previous low level extract resulting in the final planet MBTiles
|
|
7. Create country and city extracts from MBTiles
|
|
|
|
![Workflow structured into components](/src/etl_components.png)
|
|
|
|
### Component Overview
|
|
|
|
Documentation for each component can be find in the respective source directory.
|
|
|
|
**Import Components**
|
|
|
|
- **[import-external](/src/import-external)**: Import all data that is not directly form OpenStreetMap (NaturalEarth, OpenStreetMapData, custom data files)
|
|
- **[import-osm](/src/import-osm)**: Import OpenStreetMap planet files into PostGIS using imposm3
|
|
- **[import-sql](/src/import-sql)**: Provision and generate SQL used in the different layers. Contains most of the SQL logic.
|
|
|
|
**Export Components**
|
|
|
|
- **[export-worker](/src/export-worker)**: Responsible for rendering vector tiles using the vector data source **[osm2vectortiles.tm2source](/osm2vectortiles.tm2source)**. Exports can be run together with a message queue like RabbitMQ or standalone for smaller extracts where it is not necessary to divide the work into several parts.
|
|
- **[merge-jobs](/src/merge-jobs)**: Merges results of distributed rendering together into a single planet MBTiles file.
|
|
|
|
**Changed Tile Detection Components**
|
|
|
|
- **[changed-tiles](/src/changed-tiles)**: Calculate list of changed tiles
|
|
- **[generate-jobs](/src/generate-jobs)**: Responsible for creating JSON jobs for rendering the planet initially or jobs for updating the planet.
|
|
- **[update-osm-diff](/src/import-osm)**: Download diffs from OpenStreetMap based on imported planet file.
|
|
- **[import-osm-diff](/src/import-osm)**: Import OpenStreetMap diff file created by **update-osm-diff**.
|
|
- **[merge-osm-diff](/src/import-osm)**: Merge latest diff file into the old planet file.
|
|
|
|
## Processing Steps
|
|
|
|
### Prepare
|
|
|
|
1. Clone repository `git clone https://github.com/osm2vectortiles/osm2vectortiles.git && cd osm2vectortiles`.
|
|
2. If you want to build the containers yourself execute `make fast` or `make`. Otherwise you will use the public prebuilt Docker images by default.
|
|
3. Start and initialize database `docker-compose up -d postgis`
|
|
4. Import external data sources `docker-compose run import-external`
|
|
|
|
### Import OSM
|
|
|
|
**Download planet file or extract** from [Planet OSM](http://planet.osm.org/) or [Geofabrik](https://www.geofabrik.de/data/download.html) and store it in `import` folder.
|
|
|
|
```bash
|
|
wget http://planet.osm.org/pbf/planet-latest.osm.pbf
|
|
```
|
|
|
|
**Import OSM** into PostGIS. Since the import happens in diff mode this can take up to 14hrs for the full planet.
|
|
|
|
```bash
|
|
docker-compose run import-osm
|
|
```
|
|
|
|
**Provision SQL** needed to render the different layers.
|
|
|
|
```bash
|
|
docker-compose run import-sql
|
|
```
|
|
|
|
### Create Extract using Local Worker
|
|
|
|
You are now able to use a single local worker to render a extract. This can be used to create a extract
|
|
for a specific reason or generating low level vector tiles.
|
|
|
|
1. First **choose a specific bounding box** or export global bounding box from http://tools.geofabrik.de/calc/.
|
|
2. **Run the local export** which will store the resulting MBTiles in `export/tiles.mbtiles`
|
|
|
|
```bash
|
|
# Create low level extract from z0 to z8 for entire planet
|
|
docker-compose run \
|
|
-e BBOX="-180, -85, 180, 85" \
|
|
-e MIN_ZOOM="0" \
|
|
-e MAX_ZOOM="8" \
|
|
export
|
|
# Create extract for Albania from z10 to z14
|
|
docker-compose run \
|
|
-e BBOX="19.6875,40.97989806962015,20.390625,41.50857729743933" \
|
|
-e MIN_ZOOM="10" \
|
|
-e MAX_ZOOM="14" \
|
|
export
|
|
```
|
|
|
|
### Distributed Planet Export
|
|
|
|
You need to distribute the jobs to multiple workers for rendering the entire planet.
|
|
To work with the message queues and jobs we recommend using [pipecat](https://github.com/lukasmartinelli/pipecat).
|
|
|
|
**Start up message queue server**. The message queue server will track the jobs and results.
|
|
|
|
```bash
|
|
docker-compose up -d rabbitmq
|
|
```
|
|
|
|
**Divide the planet into jobs** from z8 down to z14 and publish the jobs to RabbitMQ.
|
|
To render the entire planet choose the top level tile `0/0/0` and choose job zoom level `8`.
|
|
|
|
```bash
|
|
docker-compose run \
|
|
-e TILE_X=0 -e TILE_Y=0 -e TILE_Z=0 \
|
|
-e JOB_ZOOM=8 \
|
|
generate-jobs
|
|
```
|
|
|
|
**Scale up the workers** to render the jobs. Make sure the `BUCKET_NAME`, `AWS_ACCESS_KEY`, `AWS_SECRET_ACCESS_KEY` and `AWS_S3_HOST` are configured correctly in order for the worker to upload the results to S3.
|
|
|
|
```bash
|
|
docker-compose scale export-worker=4
|
|
```
|
|
|
|
Watch progress at RabbitMQ management interface. Check the exposed external Docker port of the RabbitMQ management interface at port `15672`.
|
|
|
|
|
|
### Merge MBTiles
|
|
|
|
Please take a look at the component documentation of **[merge-jobs]((/src/merge-jobs))**.
|
|
If you are using a public S3 url merging the job results is fairly straightforward.
|
|
|
|
1. Ensure you have `export/planet.mbtiles` file present to merge the jobs into. Reuse a low level zoom extract generated earlier or download an existing low level zoom extract from http://osm2vectortiles.org/downloads/.
|
|
2. **Merge jobs** into planet file
|
|
|
|
```bash
|
|
docker-compose run merge-jobs
|
|
```
|
|
|
|
### Apply Diff Updates
|
|
|
|
Updates are performed on a rolling basis, where diffs are applied.
|
|
At this stage we assume you have successfully imported the PBF into the database
|
|
and rendered the planet once.
|
|
|
|
**Download latest OSM changelogs**. If you are working with the planet remove the `OSM_UPDATE_BASEURL` from the `environment` section in `update-osm-diff`. If you are using a custom extract from Geofabrik you can specify a custom update url there.
|
|
|
|
Download latest changelogs **since the last change date of the planet.pbf**.
|
|
|
|
```bash
|
|
docker-compose run update-osm-diff
|
|
```
|
|
|
|
Now **import the downloaded OSM diffs** in `export/latest.osc.gz` into the database. This may take up to half a day.
|
|
|
|
```bash
|
|
docker-compose run import-osm-diff
|
|
```
|
|
|
|
After that you have successfully applied the diff updates to the database and you can either rerender the entire planet or just the tiles that have changed.
|
|
|
|
After importing the diffs **you can reapply the diffs to the original PBF** file to keep it up to date.
|
|
|
|
```bash
|
|
docker-compose run merge-osm-diff
|
|
```
|
|
|
|
### Render Diff Updates
|
|
|
|
**Calculate the changed tiles** since the last diff import. This will store the changed tiles in `export/tiles.txt`.
|
|
|
|
```bash
|
|
docker-compose run changed-tiles
|
|
```
|
|
|
|
**Create batch jobs** from the large text file and publish them to RabbitMQ.
|
|
|
|
```bash
|
|
docker-compose run generate-diff-jobs
|
|
```
|
|
|
|
**Now schedule the workers** again (similar to scheduling the entire planet) and **merge the results**.
|
|
```bash
|
|
docker-compose scale export-worker=4
|
|
docker-compose run merge-jobs
|
|
```
|