Skip to content

OpenRailwayMap-vector integration - #132

Open
hiddewie wants to merge 825 commits into
OpenRailwayMap:masterfrom
hiddewie:master
Open

hiddewie wants to merge 825 commits into
OpenRailwayMap:masterfrom
hiddewie:master

Conversation

@hiddewie

@hiddewie hiddewie commented Jun 7, 2025

Copy link
Copy Markdown
Contributor

Hi!

Over the past years I have been working on a fork of the OpenRailwayMap.

The announcement can be found on the OpenRailwayMap mailing list and on the OpenStreetMap community forum.

The fork has several features, and is actively being developed by me and several more contributors:

  • Vector-based data: the map is interactive with e.g. hover and popup showing data details.
  • Map style improvements: station size, state of lines and statons, signal support for many new countries.
  • Visual UI improvements like: configurable background map, map settings and dark mode.
  • Additional layers: loading gauge and track class.
  • Daily data updates for the entire planet.
  • OpenHistoricalMap integration for historical railway infrastructure.

At the moment the fork is hosted on https://openrailwaymap.app using Fly.io. This is purely practical, it could be hosted anywhere else.

This pull request is a starter to discuss:

  • Can we integrate the fork into the Github OpenRailwayMap organization
  • Can we publish the fork on the domain openrailwaymap.org?

These are open questions, any response is appreciated!

hiddewie and others added 7 commits December 19, 2025 20:23
Fixes #713

There is a bit of duplication, but this is needed because of the
`default` icons.

On station of Reading
(http://localhost:8000/#view=19.6/51.4598362/-0.9749119&style=signals):
<img width="394" height="429" alt="image"
src="https://github.com/user-attachments/assets/4add97a7-075d-4519-a208-c8e6653203b6"
/>
Usable since Maplibre GL JS 5.15, see
#722 and
maplibre/maplibre-gl-js#6659.

The same structure will be used for #600 to toggle layer visibility.
From https://wiki.openstreetmap.org/wiki/OpenRailwayMap/Tagging

See https://en.wikipedia.org/wiki/ATACS,
https://en.wikipedia.org/wiki/Automatic_train_stop,
https://en.wikipedia.org/wiki/Korean_Train_Control_System.

South Korea
(http://localhost:8000/#view=7.85/36.168/128.101&style=signals):

Some lines are combined ATS and ETCS actually, this will be shown once
#549 is implemented.

Before:
<img width="1431" height="1115" alt="image"
src="https://github.com/user-attachments/assets/8c1235c6-ecc7-41c6-b493-d6c6cd42f44e"
/>


After:
<img width="1431" height="1115" alt="image"
src="https://github.com/user-attachments/assets/34ac45b1-fee7-4b71-9ba3-5fde498b57b5"
/>
Part of #495 

Related to #246 and #336.

There are requests to be able to render abandoned and razed railways,
together with the existing infrastructure. This pull request makes that
possible, either by including the OpenHistoricalMap data in the main
infrastructure layer, or by showing the abandoned and razed railways.
For future railways, the same can be chosen: railways under construction
or also those proposed.

Changes:
- Configuration screen for historical and future railways
- Map style adapts to using OpenHistoricalMap or OpenStreetMap as
historical data source
- Map style hides abandoned lines / stations if disabled in the
configuration
- Map style hides construction or proposed lines / stations if disabled
in the configuration
- UI to allow viewing OpenHistoricalMap data together with OpenStreetMap
data for all times.
- Include note that it is discouraged to map dismantled railway features
in OpenStreetMap, with link to documentation.

Depends on maplibre/maplibre-gl-js#6495 to
ensure source data is not loaded if the layer is disabled through
global-state.
--> This has been integrated

## Testing

### Configuration
<img width="846" height="291" alt="image"
src="https://github.com/user-attachments/assets/ab6a5a84-0ce1-430f-a1ad-1ac8a9e6f158"
/>

### Future infrastructure
(http://localhost:8000/#view=14.87/50.94355/10.99233)

Enabled:
<img width="1125" height="873" alt="image"
src="https://github.com/user-attachments/assets/491b59c9-cfb9-4e57-809a-c2b8dcb26d13"
/>

Disabled:
<img width="1125" height="873" alt="image"
src="https://github.com/user-attachments/assets/ce061c9d-06da-4ae5-aa14-66d4d62f0bb4"
/>

### Historical infrastructure

(http://localhost:8000/#view=12/50.62073/12.34528)

OpenStreetMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/162910da-41b8-4b3b-9246-9a942e064fb5"
/>

OpenHistoricalMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/78612948-296d-4510-b9af-0815df540727"
/>

(http://localhost:8000/#view=11.61/51.1841/12.3729)

OpenStreetMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/55a30b53-cf84-4176-ad04-128d670b8cce"
/>

OpenHistoricalMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/2c4b6f2f-cde9-4fef-915d-179e83a1e4d0"
/>

(http://localhost:8000/#view=17.53/51.178254/12.389887)

OpenStreetMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/7662e555-6afb-4e20-b6ab-cf0cd576309b"
/>

OpenHistoricalMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/e8cd8cad-2440-4091-a557-5e599c21638b"
/>

(http://localhost:8000/#view=12.93/54.96675/-1.58696&date=all)

OpenStreetMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/830a8a44-df47-4ecc-af36-093564a4c491"
/>

OpenHistoricalMap:
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/cc40a3a1-9b56-4751-8ab2-1f61aa807f7b"
/>

(year 1896)
<img width="1686" height="939" alt="image"
src="https://github.com/user-attachments/assets/8c16393f-8dac-4f99-b333-fa05cfb36566"
/>
Part of #272

Only import and display in popup. The visualization as a map layer with
colors on the railway lines will come later.

<img width="1430" height="867" alt="image"
src="https://github.com/user-attachments/assets/77bb99dd-bce8-4513-8bc0-8b41a52ae1a7"
/>
From #723

Followup from
#396.

There are more services than needed in the Docker Compose file. The
SETUP.md instructions will only start the actual needed services to run
the project, not the tests or extra data services.
hiddewie and others added 21 commits December 28, 2025 10:09
Goal: allow generating the dynamic legend, to take account the user
configuration for showing which entries to show.

Needed for #731, which will contain legend entries for either the
voltage / frequency, or maximum current.

Changes:
- Generate the legend in the UI, instead of during style generation.
- Simplify legend generation:
  - Only generate for current map zoom
  - Only generate legend when the legend is shown
- Encapsulate legend fully in the legend control, less global state in
UI
- Fixes legend for OpenHistoricalMap-powered historical railways
- Makes legend show relevant entries like abandoned/razed railways when
OpenStreetMap is used to show historical data, or when constructed or
proposed rail/stations are enabled

Additionally, this change improves the performance of the UI somewhat,
because the legend and corresponding map, style and icons are not loaded
when not needed.

Legend for low zooms, present, historical, all time:
<img width="318" height="454" alt="image"
src="https://github.com/user-attachments/assets/ab8d4206-2306-44b2-abde-ccc524fc8306"
/><img width="318" height="454" alt="image"
src="https://github.com/user-attachments/assets/2e5eb626-5fbb-4b39-af04-9798d447fc9d"
/><img width="318" height="454" alt="image"
src="https://github.com/user-attachments/assets/4a1a849d-22d8-4761-abe4-095fb9b9b68f"
/>

Legend without and with construction and proposed railways enabled:
<img width="318" height="454" alt="image"
src="https://github.com/user-attachments/assets/b57a0643-68b5-4991-9e29-a372b583be38"
/><img width="318" height="454" alt="image"
src="https://github.com/user-attachments/assets/b86ca6cb-74d8-45e8-a9b1-f25c0b636526"
/>

Legend without and with OpenStreetMap historical railway lines enabled:
<img width="318" height="454" alt="image"
src="https://github.com/user-attachments/assets/56a79594-2a08-48fc-adf7-25796d8e0f1d"
/><img width="318" height="454" alt="image"
src="https://github.com/user-attachments/assets/bf981668-7765-4e24-84b8-34903ea73da3"
/>
…n layer (#731)

Part of #272

Followup of #730

Pre-work for discussion
#527.

Changes:
- Addition of tabs in the configuration modal to support configuration
per map layer
- Addition of configuration of the electrification layer to support both
voltage/frequency and maximum current

~TODO: move some configuration to its own section in the configuration
modal~ --> #738

~TODO: make legend work~ --> #742

## Testing

### Configuration

<img width="292" height="285" alt="image"
src="https://github.com/user-attachments/assets/53f7c760-0086-49c8-85f2-becb35396f75"
/>

<img width="1430" height="586" alt="image"
src="https://github.com/user-attachments/assets/308d1812-808c-44dc-babb-2fbb18ff3286"
/>

### Belgium

(http://localhost:8000/#view=7.95/50.771/4.453&style=electrification)

<img width="1432" height="1107" alt="image"
src="https://github.com/user-attachments/assets/0d48819e-c7c4-4121-866f-418810fb5526"
/>

### Germany

(http://localhost:8000/#view=9/49.1888/8.9868&style=electrification)

<img width="1430" height="1107" alt="image"
src="https://github.com/user-attachments/assets/a381190b-a076-4bc4-8fc2-44e290d9affd"
/>

### Italy

(http://localhost:8000/#view=7.64/45.826/11.885&style=electrification)

<img width="1430" height="1107" alt="image"
src="https://github.com/user-attachments/assets/af025b96-7258-436a-94b7-40be2509f795"
/>


### Legend

<img width="1429" height="743" alt="image"
src="https://github.com/user-attachments/assets/3f19b82b-a08a-40c5-b1c7-71b65da52419"
/>
<img width="1429" height="743" alt="image"
src="https://github.com/user-attachments/assets/1f6efcb5-5395-4e02-9a98-9e60ea04708d"
/>
Built on #731.

Move configuration of the infrastructure layer to the separate
configuration section.

<img width="1432" height="588" alt="image"
src="https://github.com/user-attachments/assets/ed149c1c-1713-4479-baef-5f15de6568d5"
/>
Includes https://github.com/hiddewie/OpenRailwayMap-vector/pulls/731

Part of #272

Render the maximum delivered power of a railway line, if both voltage
and maximum current are known.

~Dummy PR until the maximum current is done.~


## Testing

### Configuration

<img width="1431" height="338" alt="image"
src="https://github.com/user-attachments/assets/3d318e5d-4b52-4b95-ba5f-115613d93f77"
/>

### Belgium

(http://localhost:8000/#view=7.71/50.725/4.074&style=electrification)

<img width="1431" height="827" alt="image"
src="https://github.com/user-attachments/assets/3ab41710-a1dd-4f58-9398-f9b704831c4a"
/>

### Germany

(http://localhost:8000/#view=8.51/49.1678/8.8557&style=electrification)

<img width="1431" height="827" alt="image"
src="https://github.com/user-attachments/assets/dc1bf496-707a-41cd-9177-7dd577b85e1f"
/>

### Italy

(http://localhost:8000/#view=7.72/46.154/12.237&style=electrification)

<img width="1431" height="827" alt="image"
src="https://github.com/user-attachments/assets/7c4cb2fb-47d0-44ec-aa2d-c60a5cf96141"
/>
Same as #706, now
for the operator layer.

(http://localhost:8000/#view=16.06/45.447618/10.949145&style=operator)

Before:
<img width="705" height="702" alt="image"
src="https://github.com/user-attachments/assets/de2cdfa0-9798-4ed6-a1fd-cfdd7595f7f8"
/>

After:
<img width="705" height="702" alt="image"
src="https://github.com/user-attachments/assets/d27b9e5b-cc94-420d-8ae1-a6cf391cf57a"
/>
Similar to bridges: only render them based on the zoom level and a
minimum length.

(http://localhost:8000/#view=9.27/44.4522/9.039&style=electrification)

Before:
<img width="944" height="540" alt="image"
src="https://github.com/user-attachments/assets/fd2465ce-5183-4ebc-aa96-00225d4d007b"
/>


After:
<img width="944" height="540" alt="image"
src="https://github.com/user-attachments/assets/c0ff4daf-2e0b-431d-8e7f-c3a23e963f27"
/>
)

Goal: reduce the amount of styles visible by default, to allow for new
styles like routes (#413) and diagnostics (#648).

The gauge, loading gauge and track class styles all have to do with the
track, space around the track and their size/weight bearing properties.

The three styles are merged into a single **Track** style, with
configuration to render the railway lines using the gauge, loading gauge
or track class colors.

The legend updates automatically.

Existing links to the the `gauge`, `loading_gauge` and `track_class`
styles as hash parameters are automatically updated to change the
configuration and show the new track style.

Configuration:
<img width="1431" height="826" alt="image"
src="https://github.com/user-attachments/assets/dd21d2f4-d8ad-4d7e-9f9c-6c4e2cb7ae79"
/>


Gauge:
<img width="1431" height="826" alt="image"
src="https://github.com/user-attachments/assets/21805e1d-c06e-4e28-9d76-cb05beb7357c"
/>


Loading gauge:
<img width="1431" height="826" alt="image"
src="https://github.com/user-attachments/assets/9febefcf-5d95-444d-9552-8946f1e50aed"
/>

Track class:
<img width="1431" height="826" alt="image"
src="https://github.com/user-attachments/assets/90f23817-23d2-4cf2-a34c-035b4fd48ccb"
/>
Fixes #732

Render historical railway landuse.

Example Tegola UI link:
https://vtiles.openhistoricalmap.org/#16/52.330959/4.966813

Layer: `landuse_areas`
Class: `landuse`
Type: `railway`

(http://localhost:8000/#view=14.65/52.33033/4.96296&date=all):

<img width="1399" height="793" alt="image"
src="https://github.com/user-attachments/assets/b0bfd800-09ad-4ae8-9811-ee4d25b2497e"
/>

(http://localhost:8000/#view=14.65/52.33033/4.96296&date=1978):

<img width="1434" height="679" alt="image"
src="https://github.com/user-attachments/assets/1468ebc8-ec39-42f5-bf51-fe0775a37646"
/>
Added [badges](https://github.com/badges/shields).
Maintainers feel free to modify or discard changes.

[See changes
visually](https://github.com/danieldegroot2/OpenRailwayMap-vector/tree/readme-badges?tab=readme-ov-file#openrailwaymap-vector-map-styles)
(Scroll up slightly. You might have to (Ctrl+)(Shift+)F5 clear cache to
see valid BMC supporters count.)

---

I am aware this repository is [possibly being
integrated](OpenRailwayMap#132)
into the OpenRailwayMap-CartoCSS repository.
Check with the maintainers which content should be kept from each
repository / how ie. funding might be handled.

---------

Co-authored-by: Hidde Wieringa <hidde@hiddewieringa.nl>
Noticed during
#734 (comment)

For tall icons for the bottom icon of a signal feature, the reference is
always offset using the same fixed offset. This will overlap the
reference text with the icon.

Instead, output the icon offset such that the text label for the
reference can be offset by the same value (plus some padding).


(http://localhost:8000/#view=18.41/49.010647/8.384991/-19.5&style=signals):
<img width="1074" height="574" alt="image"
src="https://github.com/user-attachments/assets/c2288181-d5f6-4327-ab5d-0ac441065624"
/>


(http://localhost:8000/#view=18.08/49.00242/8.394911/-19.5&style=signals)
<img width="1074" height="574" alt="image"
src="https://github.com/user-attachments/assets/8ab6c7b6-c929-4611-9b9d-beadda7b015b"
/>


(http://localhost:8000/#view=19/48.9970422/8.4158721/-19.5&style=signals)
<img width="1074" height="574" alt="image"
src="https://github.com/user-attachments/assets/283ae76b-cfd9-44cc-8129-b91b11545251"
/>
AKN
<img width="361" height="822" alt="image"
src="https://github.com/user-attachments/assets/e7a6a3ff-d728-4a5d-b6d0-3228565b315f"
/>

Deutsche Regionaleisenbahn
<img width="1045" height="382" alt="image"
src="https://github.com/user-attachments/assets/27d2b859-a6e9-4c4a-8352-299a5a652a73"
/>

Thüringer Eisenbahn GmbH and Deutsche Regionaleisenbahn
<img width="567" height="395" alt="image"
src="https://github.com/user-attachments/assets/40323e54-e392-41ab-a14b-5691b1506567"
/>

Schieneninfrastruktur Ost-Niedersachsen GmbH
<img width="703" height="811" alt="image"
src="https://github.com/user-attachments/assets/218f9496-b8a5-4688-a214-f0e4a197354b"
/>
Adds GB stop & fixed distant boards.

Distant signals kept together.
Stop board placed to allow for a position light (shunt) signal, but
below an LC indicator. Only thing of note is that the order would be
slightly at issue with ETCS block markers, however I will create an
issue and then PR shortly after this is merged, as there are also other
order issues to work on.
For stacked signal icons, with multiple icons that have an icon with a
position defined, only the first position was removed on the catalog
lookup.

Found during testing of
#734 (comment)


(http://localhost:8000/#view=17.65/49.00464/8.411248/-19.5&style=signals):
<img width="847" height="596" alt="image"
src="https://github.com/user-attachments/assets/8a0731fe-6a35-402f-8e44-83b417428464"
/>
… lines (#748)

Part of #413 

Integrate railway routes for stations, platforms, stop positions and
railway lines in the popup UI and on the map when clicked.

Changes:
- [x] Import route details
- [x] Add routes in popup for lines
- [x] Add routes in popup for platforms
- [x] Add routes in popup for stop positions
- [x] Add routes in popup for stations
- [x] Add display of route on map when clicking route
- [x] Add display of route information when clicking route 

See:
- https://wiki.openstreetmap.org/wiki/Relation:route
- https://wiki.openstreetmap.org/wiki/Tag:route=train?uselang=en
Fixes #749

The wrong tag for opposite regime signals was used.

Related to #541, which fixed this for main signals.

Also, add the yellow distant signal marker board

Before:
<img width="524" height="556" alt="image"
src="https://github.com/user-attachments/assets/f794962a-e0aa-47d6-8540-d58059a7ff79"
/>

After:
<img width="433" height="501" alt="image"
src="https://github.com/user-attachments/assets/d6d898c1-69ce-4ba5-8dd7-66fdcd811e9b"
/>
Reverts the changes of the distant plates introduced in
#756.

Discussed in #749
…date (#760)

From #748

The nightly update fails because of timeouts on a delete query to reduce
data, and because of disk space issues.
After managing to go through the Podman pain, finally a new MR...

<img width="1389" height="737" alt="image"
src="https://github.com/user-attachments/assets/0b03a1fa-4340-4eed-9c7b-8d220d6c885a"
/>
<img width="1389" height="737" alt="image"
src="https://github.com/user-attachments/assets/935e9cf6-1e94-4ab0-9509-2a5b674437b4"
/>
<img width="1389" height="737" alt="image"
src="https://github.com/user-attachments/assets/b3572a1c-a153-45e5-a753-50073a1a627f"
/>


Downside is that F0 only, or signals without states, look weird, so
suggestions would be nice:

<img width="1389" height="737" alt="image"
src="https://github.com/user-attachments/assets/dcd20f24-4bd3-40c2-bc99-7cfad4353513"
/>

Ref can look weird too on long signals:
<img width="485" height="361" alt="image"
src="https://github.com/user-attachments/assets/1c43e9d8-1012-484c-b44e-fad8c7cca9f6"
/>
Followup on #748

Part of #413

Currently the API calls to display routes on the map are very slow, and
sometimes time out.

## API

Route 18173306, https://www.openstreetmap.org/relation/18173306.

Example query
```sql
explain analyze
SELECT jsonb_build_object(
         'type', 'Feature',
         'id', osm_id,
         'geometry', ST_AsGeoJSON(ST_Transform(way, 4326))::jsonb,
         'properties', to_jsonb(row) - 'way'
       ) as data
FROM (SELECT r.osm_id                        as osm_id,
             ST_LineMerge(st_collect(l.way)) as way,
             any_value(r.type)               as type,
             any_value(r.name)               as name,
             any_value(r.ref)                as ref,
             any_value(r.from)               as "from",
             any_value(r.to)                 as "to",
             any_value(r.operator)           as operator,
             any_value(r.brand)              as brand,
             any_value(r.color)              as color
      from routes r
             join route_line rl
                  on rl.route_id = r.osm_id
             join railway_line l
                  on rl.line_id = l.osm_id
      where r.osm_id = 18173306
      group by r.osm_id) row;
```

Before:

```
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|QUERY PLAN                                                                                                                                                                      |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|Subquery Scan on "row"  (cost=2484.03..211196.87 rows=1 width=32) (actual time=493.106..530.542 rows=1.00 loops=1)                                                              |
|  Buffers: shared hit=117464 read=55500                                                                                                                                         |
|  ->  GroupAggregate  (cost=2484.03..211183.72 rows=1 width=268) (actual time=490.630..527.912 rows=1.00 loops=1)                                                               |
|        Buffers: shared hit=117461 read=55500                                                                                                                                   |
|        ->  Gather  (cost=2484.03..211111.43 rows=408 width=336) (actual time=488.180..526.951 rows=73.00 loops=1)                                                              |
|              Workers Planned: 2                                                                                                                                                |
|              Workers Launched: 2                                                                                                                                               |
|              Buffers: shared hit=117461 read=55500                                                                                                                             |
|              ->  Parallel Hash Join  (cost=1484.03..210070.63 rows=170 width=336) (actual time=351.275..441.764 rows=24.33 loops=3)                                            |
|                    Hash Cond: (l.osm_id = rl.line_id)                                                                                                                          |
|                    Buffers: shared hit=117461 read=55500                                                                                                                       |
|                    ->  Parallel Seq Scan on railway_line l  (cost=0.00..188076.38 rows=1640738 width=199) (actual time=0.198..193.818 rows=1312590.00 loops=3)                 |
|                          Buffers: shared hit=116169 read=55500                                                                                                                 |
|                    ->  Parallel Hash  (cost=1481.94..1481.94 rows=167 width=153) (actual time=14.694..14.697 rows=24.33 loops=3)                                               |
|                          Buckets: 1024  Batches: 1  Memory Usage: 40kB                                                                                                         |
|                          Buffers: shared hit=1292                                                                                                                              |
|                          ->  Nested Loop  (cost=0.43..1481.94 rows=167 width=153) (actual time=43.639..43.921 rows=73.00 loops=1)                                              |
|                                Buffers: shared hit=1292                                                                                                                        |
|                                ->  Parallel Seq Scan on routes r  (cost=0.00..1472.50 rows=1 width=145) (actual time=43.549..43.795 rows=1.00 loops=1)                         |
|                                      Filter: (osm_id = 18173306)                                                                                                               |
|                                      Rows Removed by Filter: 25091                                                                                                             |
|                                      Buffers: shared hit=1288                                                                                                                  |
|                                ->  Index Scan using route_line_route_id_idx on route_line rl  (cost=0.43..6.60 rows=284 width=16) (actual time=0.055..0.074 rows=73.00 loops=1)|
|                                      Index Cond: (route_id = 18173306)                                                                                                         |
|                                      Index Searches: 1                                                                                                                         |
|                                      Buffers: shared hit=4                                                                                                                     |
|Planning:                                                                                                                                                                       |
|  Buffers: shared hit=8                                                                                                                                                         |
|Planning Time: 0.649 ms                                                                                                                                                         |
|JIT:                                                                                                                                                                            |
|  Functions: 51                                                                                                                                                                 |
|  Options: Inlining false, Optimization false, Expressions true, Deforming true                                                                                                 |
|  Timing: Generation 7.196 ms (Deform 3.479 ms), Inlining 0.000 ms, Optimization 3.535 ms, Emission 75.353 ms, Total 86.085 ms                                                  |
|Execution Time: 533.884 ms                                                                                                                                                      |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

After:
```
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|QUERY PLAN                                                                                                                                                          |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|Subquery Scan on "row"  (cost=0.86..1882.96 rows=1 width=32) (actual time=6.435..6.554 rows=1.00 loops=1)                                                           |
|  Buffers: shared hit=1559 read=28                                                                                                                                  |
|  ->  GroupAggregate  (cost=0.86..1869.82 rows=1 width=268) (actual time=4.411..4.414 rows=1.00 loops=1)                                                            |
|        Buffers: shared hit=1556 read=28                                                                                                                            |
|        ->  Nested Loop  (cost=0.86..1797.52 rows=408 width=336) (actual time=3.092..3.775 rows=73.00 loops=1)                                                      |
|              Buffers: shared hit=1556 read=28                                                                                                                      |
|              ->  Nested Loop  (cost=0.43..1611.09 rows=284 width=153) (actual time=3.048..3.330 rows=73.00 loops=1)                                                |
|                    Buffers: shared hit=1292                                                                                                                        |
|                    ->  Seq Scan on routes r  (cost=0.00..1601.65 rows=1 width=145) (actual time=3.004..3.255 rows=1.00 loops=1)                                    |
|                          Filter: (osm_id = 18173306)                                                                                                               |
|                          Rows Removed by Filter: 25091                                                                                                             |
|                          Buffers: shared hit=1288                                                                                                                  |
|                    ->  Index Scan using route_line_route_id_idx on route_line rl  (cost=0.43..6.60 rows=284 width=16) (actual time=0.039..0.054 rows=73.00 loops=1)|
|                          Index Cond: (route_id = 18173306)                                                                                                         |
|                          Index Searches: 1                                                                                                                         |
|                          Buffers: shared hit=4                                                                                                                     |
|              ->  Index Scan using railway_line_osm_id_index on railway_line l  (cost=0.43..0.65 rows=1 width=199) (actual time=0.005..0.005 rows=1.00 loops=73)    |
|                    Index Cond: (osm_id = rl.line_id)                                                                                                               |
|                    Index Searches: 73                                                                                                                              |
|                    Buffers: shared hit=264 read=28                                                                                                                 |
|Planning:                                                                                                                                                           |
|  Buffers: shared hit=30 read=6                                                                                                                                     |
|Planning Time: 1.357 ms                                                                                                                                             |
|Execution Time: 6.716 ms                                                                                                                                            |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```
Problem: milestones and other positions are only rendered from zoom 10
onwards. Between zoom 10 and 13, only the zero-position markers are
rendered. From zoom 13 onwards, every position is rendered. The source
is queried from zoom 8 onwards, wasting bandwidth and performance on
not-shown position markers.

Before:
<img width="1432" height="168" alt="image"
src="https://github.com/user-attachments/assets/29931b09-3d1a-4a8a-ba05-65836582f39b"
/>

After:
<img width="1432" height="168" alt="image"
src="https://github.com/user-attachments/assets/c2285639-da31-42a4-b58e-91031cd05f4f"
/>
hiddewie and others added 30 commits August 19, 2026 21:13
Closes #1035 

Modify the yard size classification calculation:
- Ensure only points are buffered with 50 meters, not polygons which
already contain all the railway tracks they need to. This ensures
railway lines which pass the yard are not included in the yard length
calculation.
- Adjust the yard calculation parameter from 4 to 6 to make yards be
classified slightly smaller.
- Adjust the yard track length calculation to use the correct geo
reference system for calculations using meters instead of latitude
measurement errors.

## Classification

Some countries like US, Belgium and Poland have yard sizes tagged.

Below is a comparison of the classification, per country.

The `importance_before` and `station_size_before` is the old numeric and
classified value of the yard size.
The `importance` and `station_size` is the new numeric and classified
value of the yard size, with this pull request.
The `tagged_size` value in the tables below is the `railway:yard:size`
tagged value.

### Belgium

Comparison in Belgium:

<details>

| id | importance\_before | station\_size\_before | importance |
station\_size | tagged\_size |
| :--- | :--- | :--- | :--- | :--- | :--- |
| way-1511566546-train | 55.923647274560565 | large | 24.649600994523258
| large | large |
| way-1466053114-train | 51.42745062723331 | large | 22.58532500024853 |
large | large |
| node-12662645628-train | 40.4321677402639 | large | 21.638039570146688
| large | medium |
| way-1511566545-train | 44.34686284721076 | large | 20.11046362550488 |
normal | large |
| way-1483131761-train | 36.774614888255435 | large | 18.770590473420604
| normal | large |
| way-1487273188-train | 31.790569415182304 | large | 15.126590525486854
| normal | large |
| way-97377639-train | 38.705987114753576 | large | 15.07074738596649 |
normal | medium |
| way-1524925541-train | 22.073404503730057 | large | 11.829120156750713
| normal | medium |
| way-116020403-train | 29.55511708384298 | large | 11.766182028190011 |
normal | medium |
| way-1500849512-train | 23.050942865759072 | large | 11.170132510885617
| normal | medium |
| way-1503605053-train | 24.096510774703734 | large | 10.664789442629354
| normal | medium |
| way-1504129356-train | 24.059680494964827 | large | 10.095902466048413
| normal | medium |
| way-1480399360-train | 20.92586137799755 | normal | 9.27086064066703 |
normal | medium |
| way-1535562131-train | 24.389757990553004 | large | 8.808782299815963
| small | small |
| way-191914614-train | 24.509865201069914 | large | 8.581283264292718 |
small | medium |
| way-1500849513-train | 20.76915799197847 | normal | 8.35722265733914 |
small | medium |
| way-1087740578-train | 23.683837101546764 | large | 8.091648429828822
| small | small |
| way-1509384155-train | 23.85659939812393 | large | 7.6623148541355635
| small | small |
| way-1529042941-train | 19.251859223930463 | normal | 6.461249628235454
| small | small |
| way-1529042946-train | 17.1794052160704 | normal | 5.757073297412311 |
small | small |
| way-116022011-train | 23.630345304989696 | large | 5.564571889869238 |
small | small |
| way-1524925542-train | 9.477516085076337 | normal | 5.40360268725622 |
small | small |
| way-1529042942-train | 9.697606981267246 | normal | 4.312689204263192
| small | small |

</details>

Discrepancies:

https://www.openstreetmap.org/node/12662645628: medium (tagged) » large
(calculated)
https://www.openstreetmap.org/way/1511566545: large (tagged) » normal
(calculated)
https://www.openstreetmap.org/way/1483131761: large (tagged) » normal
(calculated)
https://www.openstreetmap.org/way/1487273188: large (tagged) » normal
(calculated)
https://www.openstreetmap.org/way/191914614: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/way/1500849513: medium (tagged) » small
(calculated)


### US

Comparison in US north east:

<details>

| id | importance\_before | station\_size\_before | importance |
station\_size | tagged\_size |
| :--- | :--- | :--- | :--- | :--- | :--- |
| node-7820904890-train | 145.415841410794 | large | 84.7326364696379 |
large | very large |
| node-1254693292-train | 142.2689644338279 | large | 81.6400008125173 |
large | very large |
| node-7823687859-train | 118.75688875389412 | large | 65.30942658747608
| large | large |
| node-11090502645-train | 108.33176383343452 | large |
61.87598481756692 | large | very\_large |
| node-11082054404-train | 95.23974851705604 | large | 54.5327875238973
| large | medium |
| node-7811274280-train | 72.90866110900107 | large | 40.45888786056202
| large | medium |
| node-11090502643-train | 72.22420415568544 | large | 39.94678976293917
| large | medium |
| node-11133096881-train | 61.372209589479546 | large | 34.4997539605382
| large | medium |
| node-7820403495-train | 67.80626133719723 | large | 31.193378861427664
| large | large |
| node-7820960103-train | 59.79103405148769 | large | 30.671382677255398
| large | medium |
| node-7823687861-train | 59.47230085416883 | large | 29.873303534249967
| large | medium |
| node-11090502642-train | 51.359896456409935 | large |
28.669731413352903 | large | medium |
| node-11123957265-train | 55.051262850373114 | large |
27.800472091556284 | large | small |
| node-11124073792-train | 47.5485592780394 | large | 27.771798733824536
| large | medium |
| node-11123840621-train | 48.60659051672071 | large |
26.119780359909708 | large | medium |
| node-11090502641-train | 45.25685229946745 | large | 25.7893731297643
| large | medium |
| node-11627389117-train | 45.09825079802383 | large |
25.014684990951793 | large | small |
| node-11090502639-train | 47.17266288088384 | large | 20.98441925872859
| normal | large |
| way-1509093838-train | 36.17854911441565 | large | 16.49333244083904 |
normal | medium |
| relation-21049061-train | 27.58550101447521 | large |
16.17780990607345 | normal | medium |
| node-13731547612-train | 27.58550101447521 | large | 16.17780990607345
| normal | medium |
| node-11133082227-train | 34.19557485014673 | large |
15.601134294708151 | normal | small |
| node-11090502644-train | 23.91242584230633 | large |
13.399326074391526 | normal | small |
| way-1509913874-train | 22.863538139008256 | large | 13.25171301816282
| normal | medium |
| node-10906431111-train | 19.343979528270076 | normal |
11.299278438825038 | normal | small |
| way-1371949093-train | 21.989554479062754 | large | 10.69185390351373
| normal | small |
| node-11124008879-train | 5.8411501476730825 | small | 1 | small |
small |
| node-11123957264-train | 5.680693306760305 | small | 1 | small | small
|
| node-11123957263-train | 6.077678181048749 | small | 1 | small |
medium |
| node-11123957262-train | 6.589418424596375 | small | 1 | small | small
|
| node-11137229131-train | 5.863478213283729 | small | 1 | small |
medium |
| node-11123957261-train | 7.112969455288632 | small | 1 | small |
medium |
| node-11123957260-train | 5.640877969599533 | small | 1 | small |
medium |
| node-11123957259-train | 7.1045644829225125 | small | 1 | small |
small |
| node-11123957258-train | 4.736093112266822 | small | 1 | small | small
|
| node-7811274282-train | 6.900642472491288 | small | 1 | small | medium
|
| node-11123957257-train | 7.646233144528313 | small | 1 | small | small
|
| node-11123957256-train | 5.056947371763632 | small | 1 | small | small
|
| node-11123957255-train | 4.927235805363343 | small | 1 | small | small
|
| node-11123957254-train | 5.745718499963564 | small | 1 | small | large
|
| node-7823687860-train | 8.02170727192101 | small | 1 | small | medium
|
| node-11090502640-train | 4.912111767680694 | small | 1 | small | small
|
| node-7824113164-train | 10.241061324106585 | normal | 1 | small |
meduium |
| node-7826330163-train | 8.410610087906235 | small | 1 | small | medium
|
| node-11076303060-train | 5.279269414471205 | small | 1 | small | small
|
| node-11076303059-train | 5.187446966642485 | small | 1 | small |
medium |
| node-11124008866-train | 6.061597524264933 | small | 1 | small |
medium |
| node-11070321570-train | 6.874076324667953 | small | 1 | small | small
|

</details>

Many discrepancies because the yards are tagged as node, and sometimes
use the wrong railway landuse classifying a small yard as part of a
larger yard using the entire landuse area (and contained railway lines)

For example https://www.openstreetmap.org/node/11123957262,
https://openrailwaymap.app/#view=18.17/40.343798/-79.898794, does not
have an area or railway landuse.

For example https://www.openstreetmap.org/node/7820403495,
https://openrailwaymap.app/#view=15.2/40.744233/-74.106655, uses the
entire railway landuse classifying the yard as larger than it should be.

### Poland

<details>

| id | importance\_before | station\_size\_before | importance |
station\_size | tagged\_size |
| :--- | :--- | :--- | :--- | :--- | :--- |
| node-9588851935-train | 127.47678471809382 | large | 63.64348642409899
| large | large |
| node-4634131656-train | 120.30576000561089 | large | 62.75987219321768
| large | very\_large |
| node-11561464826-train | 115.04721557913263 | large |
61.39640719858259 | large | large |
| node-10310735660-train | 113.66969059222404 | large |
60.05075918138912 | large | very\_large |
| node-9258510861-train | 109.26794114181347 | large | 57.89966016947278
| large | very\_large |
| node-4290859700-train | 109.15010599266915 | large |
56.749450218593545 | large | large |
| node-7629121108-train | 110.26450619203577 | large | 55.99774698628775
| large | large |
| node-9160881069-train | 100.18480803614636 | large | 53.51830928452844
| large | very\_large |
| node-3502962068-train | 86.69787957680596 | large | 43.58261755173873
| large | large |
| node-9215829078-train | 78.97492355721569 | large | 39.91002342317538
| large | very large |
| node-622509997-train | 71.32052793281258 | large | 36.14731501769985 |
large | very\_large |
| node-9056263871-train | 76.19929274033395 | large | 35.77286174350236
| large | very\_large |
| node-545089000-train | 65.99515318706773 | large | 35.371615326422834
| large | large |
| node-9588851941-train | 63.31841469152907 | large | 33.45418580243432
| large | large |
| node-386577386-train | 58.58486641278871 | large | 31.08157246244946 |
large | medium |
| node-9056263869-train | 73.80146718595401 | large | 30.998142013045825
| large | large |
| node-11107636909-train | 63.301738663997824 | large |
30.21672692098919 | large | large |
| node-3436700747-train | 57.69691119049318 | large | 30.105020635228584
| large | medium |
| node-3497791323-train | 55.48203618286575 | large | 28.85251998954727
| large | large |
| node-9723659543-train | 53.90075335584052 | large | 28.435329226413973
| large | large |
| node-9056263870-train | 62.367489549822274 | large | 27.22871723248022
| large | very\_large |
| node-9056263872-train | 55.08624175746482 | large | 26.86552891170447
| large | very\_large |
| node-655388166-train | 48.293992375766884 | large | 25.958332466308594
| large | large |
| node-626623662-train | 50.31607316606184 | large | 25.687357968935217
| large | large |
| node-9060585849-train | 55.23278955426675 | large | 25.41265885146227
| large | medium |
| node-10193023207-train | 49.56367123350351 | large |
25.319596819184486 | large | large |
| node-3700975323-train | 50.59836849404884 | large | 24.90549031230935
| large | medium |
| node-3474843860-train | 48.093222912179804 | large | 23.88467542630913
| large | medium |
| node-3884398161-train | 44.03393665471145 | large | 22.63840947454754
| large | large |
| node-10998435742-train | 44.38794380420779 | large |
22.322415594460967 | large | medium |
| node-3701251989-train | 39.92343278257809 | large | 21.3748112835241 |
large | small |
| node-10755686841-train | 38.540251400240166 | large |
20.883487466482098 | normal | medium |
| node-1908157897-train | 38.05086266174645 | large | 19.799227712240803
| normal | medium |
| node-3415944554-train | 37.62500203851556 | large | 19.781387239255377
| normal | small |
| node-1829995036-train | 36.70437902478702 | large | 19.641059874592784
| normal | medium |
| node-3661604648-train | 36.15755923845969 | large | 19.333057559092882
| normal | medium |
| node-1043624447-train | 35.9923682292329 | large | 18.88795199771599 |
normal | medium |
| node-6697196741-train | 36.071429526677 | large | 18.785312261188697 |
normal | medium |
| node-3439493675-train | 35.528959131333 | large | 18.766561574832572 |
normal | medium |
| node-3735918918-train | 37.4875739563211 | large | 18.74439380662437 |
normal | medium |
| node-3727624805-train | 34.51145781067479 | large | 18.586139632828637
| normal | medium |
| node-9672789772-train | 34.4927440858636 | large | 18.55825251250922 |
normal | small |
| node-9212732831-train | 39.989765455915226 | large | 18.5009552209192
| normal | medium |
| node-3390988551-train | 34.27779394095527 | large | 18.35357292498563
| normal | small |
| node-529051019-train | 35.34990268751597 | large | 18.190405826703298
| normal | small |
| node-3659855222-train | 41.415352409281766 | large |
17.687039945673074 | normal | small |
| node-12066389744-train | 32.911145076340915 | large |
17.386074476090602 | normal | medium |
| node-9229865736-train | 31.901710464935032 | large |
17.015127010909143 | normal | large |
| node-3885958406-train | 31.695923366242337 | large |
16.402727382836744 | normal | medium |
| node-655388172-train | 30.248616892330258 | large | 16.36762690256886
| normal | medium |
| node-1908157898-train | 34.46427800767029 | large | 16.260497471957734
| normal | medium |
| node-3881556257-train | 30.895196523987938 | large |
16.074985534155445 | normal | medium |
| node-3396120384-train | 33.47593996021947 | large | 16.03229405570172
| normal | medium |
| node-3846440157-train | 29.344746416703057 | large |
15.534990721635799 | normal | medium |
| node-9723659544-train | 28.680280817289066 | large | 15.44923802881992
| normal | medium |
| node-1991387669-train | 28.695906150767858 | large |
15.336889247758963 | normal | small |
| node-7096269528-train | 29.157583376437323 | large |
15.328360573985215 | normal | medium |
| node-9327843941-train | 27.962932965989534 | large | 15.18157800386067
| normal | medium |
| node-291768074-train | 27.944096337540238 | large | 15.090336647725534
| normal | medium |
| node-9056685266-train | 29.526508733802338 | large |
15.067799187138164 | normal | small |
| node-2429010733-train | 27.94309269315308 | large | 14.778806015519566
| normal | small |
| node-3423942331-train | 27.638315086434865 | large |
14.748074846792882 | normal | small |
| node-9210377654-train | 29.032499029150156 | large |
14.692352931842876 | normal | medium |
| node-3776210472-train | 28.272982063988707 | large |
14.370290903715665 | normal | small |
| node-10772798328-train | 31.62385008709555 | large |
14.309394788994169 | normal | medium |
| node-3514143823-train | 28.76278381323106 | large | 14.269032408727538
| normal | medium |
| node-3764978186-train | 26.124014999232287 | large |
14.203640695658349 | normal | small |
| node-11398889086-train | 27.657793721909105 | large |
13.99367092335836 | normal | medium |
| node-11104539106-train | 26.17964566747567 | large |
13.780856499578157 | normal | medium |
| node-8643487024-train | 26.79212845033201 | large | 13.580509025648603
| normal | medium |
| node-3702565053-train | 28.366320732016653 | large |
13.108543995806832 | normal | medium |
| node-5635194684-train | 23.790758067914552 | large | 12.82794366397499
| normal | medium |
| node-9225167670-train | 24.22789980864288 | large | 12.617076093654882
| normal | small |
| node-3428332027-train | 23.748725830046936 | large | 12.60260360908791
| normal | small |
| node-9053455939-train | 24.002371007621317 | large |
12.292359297979166 | normal | small |
| node-3016218903-train | 23.31452851923329 | large | 12.214683737890361
| normal | small |
| node-4545281665-train | 21.920603759107724 | large | 11.94526676887783
| normal | medium |
| node-2081722791-train | 20.999501862662445 | normal |
11.35758698463868 | normal | medium |
| node-3004352018-train | 20.02101535332786 | normal |
10.871585363861678 | normal | small |
| node-3932003721-train | 23.000005978915425 | large |
10.237162307308143 | normal | small |
| node-3884637706-train | 19.82227354028401 | normal | 9.920973157446591
| normal | small |
| node-4072941627-train | 18.220421229392084 | normal |
9.755878201437744 | normal | small |
| node-9186674851-train | 15.77991978036381 | normal | 8.73584370541608
| small | small |
| node-867581963-train | 14.978208912288105 | normal | 8.317016600001256
| small | small |
| node-9178404519-train | 14.523642786983105 | normal | 8.05572159492489
| small | small |
| node-3517446618-train | 14.769073820073732 | normal |
7.983022632090104 | small | small |
| node-9178404518-train | 13.225253072746971 | normal | 7.34750601025645
| small | small |
| node-2152465751-train | 13.077703525436037 | normal |
7.074416466925798 | small | small |
| node-3671630910-train | 8.719138559806375 | small | 5.105871517572376
| small | large |
| node-10727730899-train | 8.541815979525875 | small | 5.016949347241798
| small | large |
| node-10997033866-train | 8.166560727467312 | small | 4.829577832116383
| small | large |
| node-10998435661-train | 8.140837748760475 | small |
4.8158932134558885 | small | medium |
| node-2839093793-train | 8.314588474982859 | small | 4.778507754658241
| small | medium |
| node-3722938126-train | 8.037953820235376 | small | 4.7479515674945585
| small | medium |
| node-9747028044-train | 8.03106810128655 | small | 4.742298065249081 |
small | medium |
| node-11433159595-train | 8.002684163925682 | small | 4.727321443335079
| small | small |
| node-3725991462-train | 7.628428891713411 | small | 4.524047184450641
| small | medium |
| node-3718252838-train | 7.458940061160051 | small | 4.375473728836765
| small | large |
| node-3310908777-train | 7.401159377037452 | small | 4.375205357512298
| small | medium |
| node-3405489205-train | 7.39544308005418 | small | 4.36088279758893 |
small | medium |
| node-9121150648-train | 7.317894427095966 | small | 4.350760328876902
| small | medium |
| node-2053612978-train | 7.3526940348520196 | small |
4.2938248945061925 | small | medium |
| node-9057402084-train | 7.222394055066258 | small | 4.2830003511255 |
small | medium |
| node-1586996067-train | 7.286621942197655 | small | 4.2554823999333955
| small | medium |
| node-5618266186-train | 7.232702106214263 | small | 4.208304436653121
| small | medium |
| node-11003080970-train | 7.015195210929295 | small |
4.1650728301535125 | small | medium |
| node-2861512043-train | 6.930118526582972 | small | 4.076657931122204
| small | medium |
| node-1586996063-train | 6.9142425242873085 | small | 4.06398111481797
| small | small |
| node-9056263864-train | 6.85594935196208 | small | 4.0615663415673335
| small | small |
| node-2428994222-train | 6.892877451155809 | small | 4.045842049092659
| small | small |
| node-2859997788-train | 6.850702757042433 | small | 4.032760718620157
| small | small |
| node-1991400827-train | 6.663200152055517 | small | 3.9615523768352623
| small | small |
| node-8497276942-train | 6.4947233183427295 | small | 3.901770735047568
| small | small |
| node-3500661292-train | 6.464891998404026 | small | 3.900654422805179
| small | medium |
| node-3390960208-train | 6.43452771761012 | small | 3.8807057311571103
| small | medium |
| node-431237714-train | 6.449600185119957 | small | 3.8796126431154896
| small | medium |
| node-3393496166-train | 6.463149506391382 | small | 3.8488375130251367
| small | medium |
| node-3458961439-train | 6.432157341608329 | small | 3.840660612051203
| small | small |
| node-3631161539-train | 6.287073186827367 | small | 3.829786362149486
| small | small |
| node-3170964677-train | 6.542474024236943 | small | 3.8215147120881245
| small | small |
| node-9949192438-train | 6.308148515599393 | small | 3.698816405754022
| small | small |
| node-3390869367-train | 5.95941534156506 | small | 3.618561047613525 |
small | small |
| node-4098328060-train | 5.950913373612914 | small | 3.612960540759721
| small | medium |
| node-3415725769-train | 5.952961046955196 | small | 3.606549830855196
| small | medium |
| node-10224419344-train | 5.943955027506459 | small | 3.594844213436691
| small | small |
| node-2157512334-train | 5.9570487170220465 | small |
3.5840498759325032 | small | small |
| node-3517472782-train | 5.859920533232766 | small | 3.5816483182980807
| small | small |
| node-9057402085-train | 5.887721398621651 | small | 3.579094117648842
| small | small |
| node-9056263865-train | 5.928299351503365 | small | 3.5762827732119056
| small | medium |
| node-3421438328-train | 5.947475693092928 | small | 3.5740686514265687
| small | small |
| node-2872332514-train | 5.934926893938189 | small | 3.571723846598185
| small | small |
| node-3463181117-train | 5.922803100983279 | small | 3.5435761543791022
| small | small |
| node-11866635439-train | 5.920634755486359 | small | 3.530859065797364
| small | small |
| node-3461368870-train | 5.883266827963753 | small | 3.52917818743874 |
small | small |
| node-4012854714-train | 5.2970883823816255 | small |
3.2769578771897034 | small | small |
| node-9159421474-train | 5.417887316993997 | small | 3.2723806636312758
| small | small |
| node-9324880156-train | 5.299921306861023 | small | 3.2695155031877716
| small | small |
| node-3519597687-train | 5.30548052054339 | small | 3.264058321555146 |
small | small |
| node-4078166095-train | 5.292407788641406 | small | 3.260698784795387
| small | small |
| node-2187731625-train | 5.297192536163727 | small | 3.2597573256728256
| small | small |
| node-634798552-train | 5.282440981871868 | small | 3.2300117337102017
| small | small |
| node-4971046908-train | 5.2890639224033205 | small |
3.2159916684184844 | small | small |
| node-2872707914-train | 5.2784844620823375 | small | 3.205557008325077
| small | small |
| node-3944165527-train | 5.291800651788056 | small | 3.1874805404611366
| small | small |
| node-1507923333-train | 5.268914086738566 | small | 3.1859121572746543
| small | small |
| node-11065353089-train | 5.179720030904963 | small |
3.1843452573716857 | small | medium |
| node-10801144140-train | 4.920477916808309 | small |
3.0425527690305736 | small | small |
| node-3744316827-train | 4.521229651317418 | small | 2.8796653393048333
| small | small |
| node-2183602705-train | 4.521312011304429 | small | 2.8557396777576116
| small | small |
| node-2471989474-train | 4.519609883699735 | small | 2.8338991856693925
| small | small |
| node-11064704052-train | 4.517913922622156 | small |
2.8308782687193537 | small | small |
| node-2872737645-train | 4.520209964358882 | small | 2.812824429550198
| small | small |
| node-10773961203-train | 3.4953292080562846 | small |
2.266337417657498 | small | small |

</details>

Discrepancies

https://www.openstreetmap.org/node/386577386: medium (tagged) » large
(calculated)
https://www.openstreetmap.org/node/3436700747: medium (tagged) » large
(calculated)
https://www.openstreetmap.org/node/9060585849: medium (tagged) » large
(calculated)
https://www.openstreetmap.org/node/3700975323: medium (tagged) » large
(calculated)
https://www.openstreetmap.org/node/3474843860: medium (tagged) » large
(calculated)
https://www.openstreetmap.org/node/10998435742: medium (tagged) » large
(calculated)
https://www.openstreetmap.org/node/3701251989: small (tagged) » large
(calculated)
https://www.openstreetmap.org/node/3415944554: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/9672789772: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3390988551: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3659855222: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/9229865736: large (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/1991387669: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/9056685266: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/2429010733: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3423942331: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3776210472: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3764978186: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/9225167670: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3428332027: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/9053455939: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3016218903: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3004352018: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3932003721: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3884637706: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/4072941627: small (tagged) » normal
(calculated)
https://www.openstreetmap.org/node/3671630910: large (tagged) » small
(calculated)
https://www.openstreetmap.org/node/10727730899: large (tagged) » small
(calculated)
https://www.openstreetmap.org/node/10997033866: large (tagged) » small
(calculated)
https://www.openstreetmap.org/node/10998435661: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/2839093793: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3722938126: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/9747028044: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3725991462: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3718252838: large (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3310908777: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3405489205: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/9121150648: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/2053612978: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/9057402084: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/1586996067: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/5618266186: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/11003080970: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/2861512043: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3500661292: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3390960208: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/431237714: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3393496166: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/4098328060: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/3415725769: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/9056263865: medium (tagged) » small
(calculated)
https://www.openstreetmap.org/node/11065353089: medium (tagged) » small
(calculated)
Adds [AWS (Automatic Warning
System)](https://en.wikipedia.org/wiki/Automatic_Warning_System) system
related signs, namely:

- AA01 - Commencement of AWS Gap
- AA02 - Termination of AWS Gap
- AA03 - Commencement of AWS Special Working
- AA04 - Termination of AWS Special Working

See https://www.railsigns.uk/sect12page1.html for an explanation of the
signs and their associated uses

- [x] Signs tagged exist on the map*
- [x] Added to the [wiki
page](https://wiki.openstreetmap.org/wiki/OpenRailwayMap/Tagging_in_the_United_Kingdom)

\* Sign AA01 - Commencement of AWS Gap has not yet been tagged as far as
I am aware on the map.
Added more danish signals and unified the graphics state so it shows the
passive state for each signal, ie. a red light ("stop") for main signals
and 2 whites horizontally ("forbikørsel forbudt") for dwarfes and PU
type signal.

Based on 20 years of driving trains and educating train drivers in
Denmark, and on the tags in
[wiki/OpenRailwayMap/Tagging_in_Denmark](https://wiki.openstreetmap.org/wiki/OpenRailwayMap/Tagging_in_Denmark),
so the signals should be pretty solid. But it is my first attempt at a
pull request, so fingers crossed that I have done everything according
to book on the technical side.

---------

Co-authored-by: Hidde Wieringa <hidde@hiddewieringa.nl>
This adds rendering for the ZST-90 train protection system in
Switzerland. I tried to choose a color which doesn't clash with the
other train protection systems in Switzerland and the border areas in
AT/DE/FR/IT.

Example:
<img width="1224" height="791" alt="image"
src="https://github.com/user-attachments/assets/6e2940ae-bfbd-4c43-9ade-87ce15145d49"
/>

---------

Co-authored-by: Hidde Wieringa <hidde@hiddewieringa.nl>
The white cross indicating a deactivated signal, was visible in other
layers than the train protection layer.


https://openrailwaymap.app/#view=18/50.944849/6.957327&style=electrification
<img width="1005" height="608" alt="image"
src="https://github.com/user-attachments/assets/1e009efa-5a43-4960-91fd-93d43b859467"
/>
This adds the diamond-shaped board placed at the last signal before
station entry signals in system N.

I tried to add it the same way like the additional board for repeated
distant signals (with two stars), but it seems that is not possible
since I wanted to match for two tags
(`railway:signal:station_distant=CH-FDV:568` and
`railway:signal:station_distant:form=sign`). So I just added it as a
separate signal, and placed it in the file so it always (correctly)
appears above the distant/main signal.

I created the SVG myself from scratch.

http://localhost:8000/#view=18.66/47.4052253/8.5358631&style=signals
(the additional unknown signal is an unrelated shunting signal)
<img width="457" height="477" alt="image"
src="https://github.com/user-attachments/assets/65c3f71d-2181-4d69-ac2b-df171084f952"
/>
Just like junctions and spur junctions.

Closes #809

http://localhost:8000/#view=16.1/52.35218/4.949464
<img width="679" height="516" alt="image"
src="https://github.com/user-attachments/assets/1ea1dafa-5cd8-4a18-8416-ed6779beb974"
/>

http://localhost:8000/#view=14.81/52.36714/4.93524
<img width="456" height="1060" alt="image"
src="https://github.com/user-attachments/assets/beecbe22-501b-4547-af70-cf252cfb0b17"
/>
This is mostly noticable when clicking on a signal, and waiting up to a
few seconds to view the popup content.

The problem was the SQL query, filtering by the primary key. The indices
were not the problem, but the casting of the primary key, confusing
Postgres whether or not the index could be used.

Essentially a query with a perfect index lookup became a full table
scan...

Comparison of the executed signals query below.

Before:
```sql
SELECT * from signals_railway_signals_view where id = '123'::numeric;
```
with plan
```
Gather  (cost=1001.27..13590.01 rows=1371 width=3811) (actual time=148.976..159.662 rows=0.00 loops=1)
  Workers Planned: 2
  Workers Launched: 2
  Buffers: shared hit=312358
  ->  Nested Loop  (cost=1.27..12452.91 rows=571 width=3811) (actual time=136.218..136.221 rows=0.00 loops=3)
        Join Filter: (s.osm_id = sd.signal_id)
        Buffers: shared hit=312358
        ->  Nested Loop  (cost=0.85..11998.10 rows=902 width=3623) (actual time=136.217..136.219 rows=0.00 loops=3)
              Buffers: shared hit=312358
              ->  Parallel Index Scan using signals_pkey on signals s  (cost=0.42..11030.48 rows=1685 width=3507) (actual time=136.216..136.216 rows=0.00 loops=3)
                    Filter: ((osm_id)::numeric = '123'::numeric)
                    Rows Removed by Filter: 269676
                    Index Searches: 1
                    Buffers: shared hit=312358
              ->  Index Scan using signal_features_signal_id_index on signal_features sf  (cost=0.42..0.56 rows=1 width=116) (never executed)
                    Index Cond: (signal_id = s.osm_id)
                    Filter: (layer = 'signals'::signal_layer)
                    Index Searches: 0
        ->  Index Scan using signal_direction_signal_id_index on signal_direction sd  (cost=0.42..0.44 rows=1 width=17) (never executed)
              Index Cond: (signal_id = sf.signal_id)
              Index Searches: 0
Planning:
  Buffers: shared hit=48
Planning Time: 1.692 ms
Execution Time: 160.141 ms
```

After:
```sql
SELECT * from signals_railway_signals_view where id = 123;
```
with plan
```
Nested Loop  (cost=1.27..2.03 rows=1 width=3811) (actual time=0.029..0.030 rows=0.00 loops=1)
  Buffers: shared hit=3
  ->  Nested Loop  (cost=0.85..1.30 rows=1 width=3615) (actual time=0.028..0.029 rows=0.00 loops=1)
        Buffers: shared hit=3
        ->  Index Scan using signals_pkey on signals s  (cost=0.42..0.64 rows=1 width=3507) (actual time=0.028..0.028 rows=0.00 loops=1)
              Index Cond: (osm_id = 123)
              Index Searches: 1
              Buffers: shared hit=3
        ->  Index Scan using signal_features_signal_id_index on signal_features sf  (cost=0.42..0.65 rows=1 width=116) (never executed)
              Index Cond: (signal_id = 123)
              Filter: (layer = 'signals'::signal_layer)
              Index Searches: 0
  ->  Index Scan using signal_direction_signal_id_index on signal_direction sd  (cost=0.42..0.64 rows=1 width=17) (never executed)
        Index Cond: (signal_id = 123)
        Index Searches: 0
Planning Time: 2.104 ms
Execution Time: 0.342 ms
```
Part of #970 

This pull request reorders all similar, so they are not grouped by the
current style names, but by their functional element, such as stations,
railway lines, signals boxes, signals, etc.

No functional changes.
Part of #970 

Merge all map layers for the same features, which were previously
duplicated because of different map styles.

New global map state is introduced per feature type (group of map style
layers), to distinguish how to render each feature. For example stations
can be rendered with their `station` attribute (infrastructure and route
styles), with their operator, or not at all.

This pull request will remove the need to have a global map state named
`style`, and each map style will configure the relevant map features
using the UI.

At a later time, these map features will become fully configurable to be
able to create custom map views.

The only visible change will be that while changing map styles using the
map buttons, features that remain on the map will not disappear and
re-appear, but just be restyled.
This aligns the shown features between the infrastructure and operator
layer

Features on the map in the operator layer, where no operator is known,
are shown with a gray color.
http://localhost:8000/#view=9.93/48.6653/17.2549&style=operator:
<img width="1108" height="567" alt="image"
src="https://github.com/user-attachments/assets/feb00bc8-b6d7-4117-bf3a-58d3ccc96231"
/>
Currently, the icons for feather junction indicators bear a resemblance
to the actual signal, but there is no shared 'pivot light'.
The re-drawn icons now share a common pivot light, and have been created
referencing dimensions from the relevant RSSB standard generally, and
technical drawings for feather JIs from signalling equipment
manufacturers.

Whilst there is also the option for an LED 'bar' of light, this is not
tagged, and I have not created the icons for it.

Additionally, this adds 4 new icons for the following combinations
(relatively easy to do so when drawing the others):
1245,
12345,
12456, and
123456.

I am aware of a signal using feather JI 12345, W55 signal just outside
London Waterloo, which is part of why I decided to do this. It is
currently rendered as 1234.
Adds Queensland (Australia) [AWS
signs](https://wiki.openstreetmap.org/wiki/Australian_Tagging_Guidelines/Railway_Signals/QLD#:~:text=AWS%20applies)
to ORM.

Height 16 has been used for all elements for consistency.
W55 signal is still rendered as a JI with positions 1,2,3,4, and not
1,2,3,4,5.
(https://openrailwaymap.app/#view=20/51.4980595/-0.1147942&style=signals)
This is because whilst the icons were added in #1048, I mistakenly
thought that it was already supported, and just lacking the icon, and
thus falling back to an available icon.
However this was not the case, and new tagging interpretation lines were
required for the 4 new icons of 1245, 12345, 12456, and 123456.
This PR adds those lines to the relevant JI feather tagging selections.

Co-authored-by: Hidde Wieringa <hidde@hiddewieringa.nl>
This tag will replace ref:FR:IDFM as the gtfs:stop_id:* tag got
standardized on OpenStreetMap.

Co-authored-by: Hidde Wieringa <hidde@hiddewieringa.nl>
Last section of taginfo now contains the known operator values: 
<img width="1205" height="343" alt="image"
src="https://github.com/user-attachments/assets/4dfb1f8f-3c65-4e86-b58e-187de51d1115"
/>
Fixes #1065

The visibility was always set to `none`, for every layer.

http://localhost:8000/#view=16.67/51.189027/6.687403/0/3
<img width="864" height="651" alt="image"
src="https://github.com/user-attachments/assets/bbb044f6-3f48-401f-82ae-83fd3f6c6c7d"
/>
Part of #970 

Reduce the amount of layers for the high zoom railway track style.

Before: 821 layers in style
After: 586 layers in style
Currently, Australia has 3 different systems using yellow, which are
hard to distinguish ($`{\color{#b58a00} \blacksquare\color{#ccaa00}
\blacksquare\color{#ffcc00} \blacksquare}`$).

One of these systems is also used in the UK, and the other is also used
in Korea. so we have to play a game a sudoku to keep the colours unique
in all regions 😆

This PR proposes 4 changes:

1. 🇦🇺 TMACS $`{\color{#ffcc00} \blacksquare}`$ → $`{\color{#66cc33}
\blacksquare}`$
2. 🇦🇺 ATMS $`{\color{#0096d4} \blacksquare}`$ → $`{\color{#4fb8af}
\blacksquare}`$
3. 🇦🇺🇰🇷 ATS $`{\color{#b58a00} \blacksquare}`$ → $`{\color{#ff7033}
\blacksquare}`$
4. 🇰🇷 KTCS $`{\color{#c54800} \blacksquare}`$ → $`{\color{#654321}
\blacksquare}`$

---

Full list for each affected country:

AU:

- ATS $`{\color{#b58a00} \blacksquare}`$ → $`{\color{#ff7033}
\blacksquare}`$
- AWS $`{\color{#ccaa00} \blacksquare}`$
- TMACS $`{\color{#ffcc00} \blacksquare}`$ → $`{\color{#66cc33}
\blacksquare}`$
- TOW $`{\color{#884400} \blacksquare}`$
- TPWS $`{\color{#ffc0cb} \blacksquare}`$
- PTC $`{\color{#cc0033} \blacksquare}`$
- CBTC $`{\color{#cc0052} \blacksquare}`$
- ATP $`{\color{#cc00bb} \blacksquare}`$
- ATC $`{\color{#6600cc} \blacksquare}`$
- ETCS-2 $`{\color{#0058cc} \blacksquare}`$
- ETCS-1 $`{\color{#006eff} \blacksquare}`$
- ATMS $`{\color{#0096d4} \blacksquare}`$ → $`{\color{#4fb8af}
\blacksquare}`$
- None $`{\color{#000000} \blacksquare}`$
- Unknown $`{\color{#999999} \blacksquare}`$

KR:

- ATS $`{\color{#b58a00} \blacksquare}`$ → $`{\color{#ff7033}
\blacksquare}`$
- KTCS $`{\color{#c54800} \blacksquare}`$ → $`{\color{#654321}
\blacksquare}`$
- CBTC $`{\color{#cc0052} \blacksquare}`$
- ATC $`{\color{#6600cc} \blacksquare}`$
- ETCS-1 $`{\color{#006eff} \blacksquare}`$
- TVM $`{\color{#66cc33} \blacksquare}`$
- Unknown $`{\color{#999999} \blacksquare}`$

GB (no change):

- AWS $`{\color{#ccaa00} \blacksquare}`$
- TPWS $`{\color{#ffc0cb} \blacksquare}`$
- CBTC $`{\color{#cc0052} \blacksquare}`$
- ATP $`{\color{#cc00bb} \blacksquare}`$
- ETCS-2 $`{\color{#0058cc} \blacksquare}`$
- ETCS-1 $`{\color{#006eff} \blacksquare}`$
- TVM $`{\color{#66cc33} \blacksquare}`$
- None $`{\color{#000000} \blacksquare}`$
- Unknown $`{\color{#999999} \blacksquare}`$

<table>
<tr>
<td></td>
<td>Before</td>
<td>After</td>
</tr>
<tr>
<td>🇦🇺</td>
<td>
<img width="932" height="699" alt="image"
src="https://github.com/user-attachments/assets/b303d91c-c14a-4df7-b2e6-1f6f49b256f4"
/>
<img width="334" height="240" alt="image"
src="https://github.com/user-attachments/assets/0e6daedd-f9ed-40e5-adf1-478c9f6ba475"
/>
</td>
<td>
<img width="985" height="708" alt="image"
src="https://github.com/user-attachments/assets/7f2406d2-0204-4a22-9aa1-63e6644dbd4d"
/>
<img width="393" height="262" alt="image"
src="https://github.com/user-attachments/assets/6f9515d9-6bd9-48dc-8fed-7d5389d988ea"
/>
</td>
</tr>
<tr>
<td>🇰🇷</td>
<td>
<img width="582" height="669" alt="image"
src="https://github.com/user-attachments/assets/a9519fa5-8e33-41e5-a869-b0355fe1fbef"
/>
</td>
<td>
<img width="561" height="713" alt="image"
src="https://github.com/user-attachments/assets/71e923dc-6100-42f4-a266-6a7410fff689"
/></td>
</tr>
<tr>
<td>🇬🇧</td>
<td colspan=2>no change</td>
</tr>
</table>

---
An alterantive idea is to change AWS $`{\color{#ccaa00} \blacksquare}`$
instead of ATS $`{\color{#b58a00} \blacksquare}`$. Then it would impact
AU+GB intead of AU+KR.
…1072)

Hi. I would like to add three more metropolitan railway operator in
Indonesia, as well as new tagging system for Indonesian railway signals.
These tags has been implemented in some stations, like Bandung area and
Kertosono.

---------

Co-authored-by: Hidde Wieringa <hidde@hiddewieringa.nl>
For example http://localhost:8000/#view=16.34/52.006429/4.359293,
https://www.openstreetmap.org/relation/19784864,
https://www.openstreetmap.org/relation/19784824.

Tram stops are both stations and stop positions.

Before
<img width="1213" height="971" alt="image"
src="https://github.com/user-attachments/assets/fb1cc992-0f28-4b02-81b2-518521216c6a"
/>

After
<img width="1213" height="971" alt="image"
src="https://github.com/user-attachments/assets/ab638a2d-8fb7-469d-b281-be0f12978447"
/>
Part of #970

Closes #1010
Closes #1064

## Goal

Allow configuring custom map styles alongside the current map style
presets.

## Changes

### Map style

The map style can be selected for each element on the map. Current list
is:
- Tracks
- Operating sites (stations)
- Platforms
- Switches
- Points of interest
- Turntables
- Boxes
- Substations
- Catenaries

<img width="1084" height="631" alt="image"
src="https://github.com/user-attachments/assets/3aaf1c19-d1ce-4c83-af27-e4603993f139"
/>
<img width="548" height="717" alt="image"
src="https://github.com/user-attachments/assets/3518725b-b64c-4bbc-8e45-451f9ff4f176"
/>

The style will be expanded in separate pull requests, such as
configuring which signals to see, separating different types of points
of interest, etc.

### Presets

The presets are listed under a button, and work the same way as they
used to.
Selecting a preset will select the matching style.
The preset is no longer stored in the URL. If the styles are shown on
the map that match a preset exactly, the preset is considered "active"
and shows the active indicator (small colored circle).
<img width="915" height="437" alt="image"
src="https://github.com/user-attachments/assets/5eacb7ea-6abd-4683-9c09-8ff5c5dac43f"
/>
<img width="650" height="783" alt="image"
src="https://github.com/user-attachments/assets/c2ef8340-3942-491b-b7f5-9ffeb04ab205"
/>

### Browser URL

The browser URL will contain the selected styles which are different
than the defaults. This means that sharing an URL to a map view, will
let the other person see the same map.

### Historical view

If OpenHistoricalMap is used as a historical railway infrastructure, the
date control is always shown. If another style than "usage" is used for
the tracks, the lines will be gray because the historical lines do not
have speed, electrification, train protection, operator or route
information.

### Legend

The legend will show all elements of the chosen map style.
Closes: #1028

http://localhost:8000/#view=16.95/56.246804/12.854042
<img width="774" height="599" alt="image"
src="https://github.com/user-attachments/assets/be5f3090-c121-4cc1-af56-e96b35e366b0"
/>

Names and values taken from Taginfo and wiki
Fixes #1076

On
http://localhost:8000/#view=17.46/51.5042/-0.107255&stations=none&switches=none&pois=none&turntables=none

Before
<img width="1632" height="387" alt="image"
src="https://github.com/user-attachments/assets/cb75a122-ec0f-4ae4-9069-fe415be74d17"
/>

After
<img width="1632" height="387" alt="image"
src="https://github.com/user-attachments/assets/4428d37b-cd6f-4ecd-80d8-3b72b2c6676a"
/>
Closes #1061


http://localhost:8000/#view=16.07/51.347293/0.737758&switches=none&pois=none&turntables=none
<img width="1083" height="658" alt="image"
src="https://github.com/user-attachments/assets/d5cc5461-a1dc-429c-926d-efc56ab4ecc8"
/>
The configured language is configured when the map is loaded, but is not
re-configured when the language configuration is updated.

This is a regression since migrating to a single style without a dynamic
style reloading while the map is loaded.

This pull request adds a language control which does not have any UI,
but modifies the map style as the language configuration is updated
through the settings, or the browser / OS language configuration
(`languagechange` browser event).
Currently, when clicking a feature on the map, the properties of the
features are retrieved through the OpenRailwayMap API.

When the response contains images (Wikidata and Wikimedia commons), the
UI makes another request to the API to fetch the image metadata, URL and
attribution information.

This pull request removes the second roundtrip, and resolves the images
from the feature properties directly. A single response is returned that
contains the required images for display in the popup.

In addition, the image metadata from the Wikimedia response is emitted
in the OpenRailwayMap feature API output as well. This is used in the
UI, to resize the image before it is fully loaded. The popup will then
no longer change in size.
Italian combined and main signals' aspect is very similar: in a certain
sense, an Italian combined signal is main signal, but an Italian main
signal may or may not be a combined one (because combined signal is like
main signal + distant signal).
They differ in this: Italian main signals (strictly speaking i.e. main
signal not combined with a distant one) can show any of these tree light
states: red, green, red-green. Combined signals may show much more then
the previous list of three light states.
For this reason i fixed Italian combined and main signal tagging scheme
very close to each other. In the proposed tagging scheme, main signal
states could be combined, for reason of tagging compatibility.
In my opinion this is a good compromise.
I also fixed an error in the 3 lights combined signal tagging scheme.

---------

Co-authored-by: Hidde Wieringa <hidde@hiddewieringa.nl>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.