Awesome
Planetiler OpenMapTiles Profile
This OpenMapTiles profile for Planetiler is based on OpenMapTiles.
How to run
Using pre-built docker image:
docker run -v "$(pwd)/data":/data openmaptiles/planetiler-openmaptiles:latest --force --download --area=monaco
Or to build from source, after installing Java 21+:
# Build the project (use mvnw.cmd on windows):
./mvnw clean package
# Then run:
java -jar target/*with-deps.jar --force --download --area=monaco
See Planetiler README.md for more description of the available options.
Differences from OpenMapTiles
- Road name abbreviations are not implemented yet in the
transportation_name
layer brunnel
tag is excluded fromtransportation_name
layer to avoid breaking apart longtransportation_name
lines, to revert this behavior set--transportation-name-brunnel=true
rank
field onmountain_peak
linestrings only has 3 levels (1: has wikipedia page and name, 2: has name, 3: no name or wikipedia page or name)- Some line and polygon tolerances are different, can be tweaked with
--simplify-tolerance
parameter - For bigger bays whose label points show above Z9, centerline is used for Z9+
Customizing
If you want to exclude layers or only include certain layers, then run the project
with --exclude-layers=poi,housenumber,...
or --only-layers=water,transportation,...
command-line arguments.
If you want to customize existing layers in OpenMapTiles, then fork this repo, find the appropriate class from the layers package, and make a change to where it processes output features.
<details> <summary> Example adding an attribute to a built-in layer </summary>For example to copy over the name attribute from OpenStreetMap elements to the building layer, modify Building.java:
@@ -166,6 +166,7 @@ public class Building implements
.setAttrWithMinzoom(Fields.RENDER_MIN_HEIGHT, renderMinHeight, 14)
.setAttrWithMinzoom(Fields.COLOUR, color, 14)
.setAttrWithMinzoom(Fields.HIDE_3D, hide3d, 14)
+ .setAttrWithMinzoom("name", element.source().getTag("name"), 14)
.setSortKey(renderHeight);
if (mergeZ13Buildings) {
feature
</details>
If you want to generate a mbtiles file with OpenMapTiles base layers plus some extra ones then fork this repo and:
- Create a new class that implements the
Layer
interface in the addons package and make thepublic String name()
method return the ID of the new layer. - Make the new class implement interfaces from
OpenMapTilesProfile
to register handlers for elements from input sources. For example implementOpenMapTilesProfile.OsmAllProcessor
to handle every OSM element fromprocessAllOsm
method. See the built-in layers for examples. - Create a new instance of that class from the
ExtraLayers
class.
This layer would add a power
layer to OpenMapTiles output with power lines:
package org.openmaptiles.addons;
import com.onthegomap.planetiler.FeatureCollector;
import com.onthegomap.planetiler.reader.SourceFeature;
import org.openmaptiles.Layer;
import org.openmaptiles.OpenMapTilesProfile;
public class Power implements Layer, OpenMapTilesProfile.OsmAllProcessor {
private static final String LAYER_NAME = "power";
@Override
public String name() {
return LAYER_NAME;
}
@Override
public void processAllOsm(SourceFeature feature, FeatureCollector features) {
if (feature.canBeLine() && feature.hasTag("power", "line")) {
features.line("power")
.setBufferPixels(4)
.setMinZoom(6)
.setAttr("class", "line");
}
}
}
</details>
If you think your custom layer or change to a built-in layer might be useful to others, consider opening a pull request
to contribute it back to this repo. Any change that diverges from what is produced
by https://github.com/openmaptiles/openmaptiles should be disabled by default, and enabled through a command-line
argument that users can opt-into. For example, see how
the building layer exposes a building_merge_z13
command-line
argument to disable merging nearby buildings at z13.
Code Layout
Generate.java generates code in the generated package from an OpenMapTiles tag in GitHub:
- OpenMapTilesSchema contains an interface for each layer with constants for the name, attributes, and allowed values for each tag in that layer
- Tables contains a record for each table that OpenMapTiles imposm3 configuration generates (along with the tag-filtering expression) so layers can listen on instances of those records instead of doing the tag filtering and parsing themselves
The layers package contains a port of the SQL logic to generate each layer from OpenMapTiles. Layers define how source features (or parsed imposm3 table rows) map to vector tile features, and logic for post-processing tile geometries.
OpenMapTilesProfile dispatches source features to layer handlers and merges the results.
OpenMapTilesMain is the main driver that registers source data and output location.
Regenerating Code
To run Generate.java
,
use scripts/regenerate-openmaptiles.sh
script with the
OpenMapTiles release tag:
./scripts/regenerate-openmaptiles.sh v3.15
Then follow the instructions it prints for reformatting generated code.
If you want to regenerate from a different repository than the default openmaptiles, you can specify the url like this:
./scripts/regenerate-openmaptiles.sh v3.15 https://raw.githubusercontent.com/openmaptiles/openmaptiles/
License
All code in this repository is under the BSD license and the cartography decisions encoded in the schema and SQL are licensed under CC-BY.
Products or services using maps derived from OpenMapTiles schema need to visibly credit "OpenMapTiles.org" or reference "OpenMapTiles" with a link to https://openmaptiles.org/. Exceptions to attribution requirement can be granted on request.
For a browsable electronic map based on OpenMapTiles and OpenStreetMap data, the credit should appear in the corner of the map. For example:
© OpenMapTiles © OpenStreetMap contributors
For printed and static maps a similar attribution should be made in a textual description near the image, in the same fashion as if you cite a photograph.