Skip to content

Instantly share code, notes, and snippets.

@wipfli
Created March 11, 2022 13:27
Show Gist options
  • Save wipfli/036aceb4a8008a10253b34ac1ded728f to your computer and use it in GitHub Desktop.
Save wipfli/036aceb4a8008a10253b34ac1ded728f to your computer and use it in GitHub Desktop.
power-omt-planetiler.md

Adding a power layer to OpenMapTiles with planetiler

OpenMapTiles v3.14 does not include the power tag. This gist shows how to add it in a new layer with planetiler.

Step 1: OpenMapTiles

Fork OpenMapTiles, create a power branch, add the following (see https://github.com/wipfli/openmaptiles/commit/88eae3f48dcf46588f24adc499bad0d725ecb7e7):

Add layers/power/mapping.yaml:

generalized_tables:
  # etldoc: osm_power_linestring_gen_z11 -> osm_power_linestring_gen_z10
  power_linestring_gen_z10:
    source: power_linestring_gen_z11
    tolerance: ZRES11

  # etldoc: osm_power_linestring_gen_z12 -> osm_power_linestring_gen_z11
  power_linestring_gen_z11:
    source: power_linestring_gen_z12
    tolerance: ZRES12

  # etldoc: osm_power_linestring -> osm_power_linestring_gen_z12
  power_linestring_gen_z12:
    source: power_linestring
    sql_filter: ST_IsValid(geometry)
    tolerance: ZRES13

power_field: &power
  key: power
  name: power
  type: string

tables:
  # etldoc: imposm3 -> osm_power_linestring
  power_linestring:
    type: linestring
    columns:
    - name: osm_id
      type: id
    - name: geometry
      type: geometry
    - name: power
      key: power
      type: string
    mapping:
      power:
      - line
      - minor_line

Add layers/power/power.yaml:

layer:
  id: "power"
  description: |
      Power lines [power](http://wiki.openstreetmap.org/wiki/power).
  buffer_size: 4
  fields:
    power:
      description: |
          The original value of [`power`](http://wiki.openstreetmap.org/wiki/Key:power) tag
      values:
      - line
      - minor_line
  datasource:
    geometry_field: geometry
    query: (SELECT geometry, power FROM layer_power(!bbox!, z(!scale_denominator!))) AS t
schema:
  - ./power.sql
datasources:
  - type: imposm3
    mapping_file: ./mapping.yaml

Add to openmaptiles.yaml:

     - layers/aeroway/aeroway.yaml
+    - layers/power/power.yaml
     - layers/transportation/transportation.yaml

Step 2: Planetiler

Fork planetiler.

Point the automatic java code generation to your OpenMapTiles fork (see https://github.com/wipfli/planetiler/commit/14f16fa5536c8a6e88f32f2b068cc247be54c3b8).

Edit in planetiler-basemap/src/main/java/com/onthegomap/planetiler/basemap/Generate.java:

-    String base = "https://raw.githubusercontent.com/openmaptiles/openmaptiles/" + tag + "/";
+    String base = "https://raw.githubusercontent.com/wipfli/openmaptiles/power/";

Regenerate the OpenMapTiles java code from your updated OpenMapTiles yaml files:

scripts/regenerate-openmaptiles.sh

Add planetiler-basemap/src/main/java/com/onthegomap/planetiler/basemap/layers/Power.java:

package com.onthegomap.planetiler.basemap.layers;

import com.onthegomap.planetiler.FeatureCollector;
import com.onthegomap.planetiler.basemap.generated.OpenMapTilesSchema;
import com.onthegomap.planetiler.basemap.generated.Tables;
import com.onthegomap.planetiler.config.PlanetilerConfig;
import com.onthegomap.planetiler.stats.Stats;
import com.onthegomap.planetiler.util.Translations;

public class Power implements
  OpenMapTilesSchema.Power,
  Tables.OsmPowerLinestring.Handler {

  public Power(Translations translations, PlanetilerConfig config, Stats stats) {}

  @Override
  public void process(Tables.OsmPowerLinestring element, FeatureCollector features) {
    features.line(LAYER_NAME)
      .setMinZoom(10)
      .setAttr(Fields.POWER, element.power());
  }
}

Compile planetier:

./mvnm clean package

Run planetiler:

java -jar planetiler-dist/target/*with-deps.jar --force=true --area=switzerland

Inspect tiles:

sudo docker run --rm -it -v "$(pwd)/data":/data -p 8080:8080 maptiler/tileserver-gl -p 8080
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment