OpenStreetMap

Hungerburg's Diary

Recent diary entries

In einer Korrespondenz auf dem issue-tracker eines Routers auf Basis von openstreetmap Daten bin ich auf die default Einschränkungen für die verschiedenen Arten von Wegen hingewiesen worden.

Im lokalen Forum wollte ich daraufhin anregen, dass die Berechtigungen von track auf etwas der Realität näheres als ein vollmundiges yes gestellt werden.

Ein Vorschlag eines Teilnehmers aus einem Drittland war partial, was meiner Auffassung so ungefähr das bedeutet, dass es vor Ort noch erhoben werden muss. Dergleichen finden sich aber nur auf zehn Prozent der als track erfassten Wege. Trotzdem hätte ich beinahe geglaubt, dass das auf ganz Österreich gut zutreffe.

Offensichtlich ist das nicht so. Von mancher Seite wird der Standpunkt vertreten, dass wenn vor Ort nichts ausgeschildert ist, dann ist yes sehr wohl richtig. Mir entzieht sich bis dato, was das damit zu tun hat, ob in den openstreetmap Daten eine Einschränkung erfasst ist oder nicht.

Nun ja, es könnte in der Tat in den meisten Fällen so sein, dass wenn nichts erfasst ist, auch nichts ausgeschildert ist. Das allerdings deckt sich nicht mit meinen Beobachtungen in Tirol.

Wie das nun belegen? Sind ja hier wie dort nur Anekdoten! Also amtliche Daten geholt, den Intermodales Verkehrsreferenzsystem Straßengraph, a.k.a die GIP für mein Bundesland.

Das Shapefile in JOSM laden dauerte ewig. Wenn einmal geladen lief das Schieben des Ausschnitts aber recht flott. Super Sache dieser Editor. So lässt sich gut beurteilen, wie die openstreetmap mappings und die Kategorien in den amtlichen Daten korrespondieren. Sie tun es, mit Unschärfen an den Rändern zwar, aber Ja!

Dann entdeckte ich das geojson Format und kam auf die Idee, damit wäre es möglich, die Daten direkt auszuwerten. Hier zwei jq Einzeiler:

  • Geh/Rad/Wanderwege extrahieren, kann in den Editor geladen werden:

    jq '. | .features |= map(select(.properties.OBJEKT=="S-FRW"))' Verkehrswege.geojson > Wanderwege.geojson

  • Statistik über die Gesamtstrecke der amtlichen Klassen:

    jq '[.features[].properties] | group_by(.OBJEKT) | map({(first.OBJEKTBEZEICHNUNG): (map(.Shape__Length/1000) | add | floor)}) | sort | add' Verkehrswege.geojson

Das Ergebnis vom zweiten Auftruf:

{
  "Autobahn": 310,
  "Autobahn - Brücke": 33,
  "Autobahn - Nebenanlage": 36,
  "Autobahn - Rampe": 107,
  "Autobahn - Rampe mit Brücke": 9,
  "Autobahn - Tunnel/Galerie": 39,
  "Bahnlinie - hochrangig": 878,
  "Bahnlinie - hochrangig: Brücke": 4,
  "Bahnlinie - hochrangig: Tunnel/Galerie": 132,
  "Bahnlinie - lokal": 66,
  "Bahnlinie - lokal: Brücke": 0,
  "Bahnlinie - lokal: Tunnel/Galerie": 1,
  "Forstwirtschaftliche Weg": 17695,
  "Landesstraße B": 926,
  "Landesstraße B - Brücke": 34,
  "Landesstraße B - Parkplatz": 15,
  "Landesstraße B - Rampe": 30,
  "Landesstraße B - Tunnel/Galerie": 34,
  "Landesstraße L": 1234,
  "Landesstraße L - Brücke": 28,
  "Landesstraße L - Tunnel/Galerie": 18,
  "Privatstraße": 34,
  "Privatstraße - Brücke": 2,
  "Privatstraße - Parkplatz": 0,
  "Privatstraße - Rampe": 0,
  "Privatstraße - Tunnel/Galerie": 5,
  "Radweg, Fußweg, Wanderweg": 1654,
  "Schnellstraße": 25,
  "Schnellstraße - Brücke": 1,
  "Schnellstraße - Nebenanlage": 0,
  "Schnellstraße - Rampe": 7,
  "Schnellstraße - Rampe mit Brücke": 1,
  "Schnellstraße - Tunnel/Galerie": 41,
  "Singletrail Strecke": 232,
  "Wirtschaftsweg": 3548,
  "Örtliches Straßennetz": 9191
}

Erklärung zu jq dazu. Die Kategorien an sich schon interessant. Überraschend jedoch: Mit knapp 18.000 Kilometern sind Forstwege die vorherrschende Straßenart überhaupt! Auf wie vielen davon darf jeder und jede mit Auto, Motorrad, Lastwagen, Rad usw. fahren? Ausgeschildert ist das übrigens recht gut. Beim Ausbau mögen die Hiesigen anderen Landesteilen hinterherkinken, beim Aufstellen von Schildern sind sie top :)

Consuming conditional access tag values

Posted by Hungerburg on 5 December 2021 in English (English). Last updated on 21 October 2022.

During the summer, a number of wild-life sanctuaries found their way into the openstreetmap data around the area of my local knowledge. Legal provisions place a simple conditional restriction on accessing the protected areas: From November 16 up to April 30 one must not stray from tracks, well-known paths and pistes. Some days ago, I started to think about ways to add that to the data, and came up with access:conditional=only_trail_use @ (Nov 16-Apr 30). That felt pretty good human readable, Apart from a new restriction, it was very much in line with what the documentation on conditional restrictions proposes. The new value itself follows established naming conventions of documented restrictions.

Still, that seemed too little, to pitch this tagging to a consumer of openstreetmap data in close vicinity, developing an online slippy map, that sets out to highlight protected areas to the interested public, i.e. skiers and other winter sport enthusiasts. I searched for a reference implementation, that parses openstreetmap conditional restrictions, and I did not find a single one.

So I had to start from scratch: Below some lines of python, that take the (very simple) tag value from above, and find out, if the restriction applies at a certain date. In all its simplicity, there are some pitfalls worked around. For more complete coverage, it might still be wise to look for a full blown calendaring module to evaluate time constraints, and of course a full blown parser of the myriad of expressions available in conditionals.

import re
from datetime import datetime
from calendar import monthrange

day = '((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(?: +[0-9]{1,2})?)'
rex = re.compile('(\S+) +@ +\(' + day + ' *\- *' + day + '\)')
now = datetime.now()
dbg = True
dbg = False

def firstof(date):
	if re.findall('[0-9]+', date): return date
	return date + " 1"

def lastof(date):
	if re.findall('[0-9]+', date): return date
	month = datetime.strptime(date, "%b").month
	return date + " " + str(monthrange(now.year, month)[1])

def applies(conditional, checkpoint):
	m = rex.match(conditional)
	what = m.group(1)
	tfrm = datetime.strptime(firstof(m.group(2)) + " " + str(now.year), "%b %d %Y")
	tend = datetime.strptime(lastof(m.group(3)) + " " + str(now.year), "%b %d %Y")
	tchk = datetime.strptime(checkpoint + " " + str(now.year), "%b %d %Y") # Feb 29 !
	if dbg: print(">", tfrm.date(), "…", tend.date(), "?", tchk.date())

	if tchk == tfrm or tchk == tend: return "☑ " + what + " @ " + checkpoint

	if tchk < tfrm: tchk = tchk.replace(year=now.year+1)
	if tend < tfrm: tend = tend.replace(year=now.year+1)
	if dbg: print("<", tfrm.date(), "…", tend.date(), "?", tchk.date())

	if tchk > tfrm and tchk < tend: return "☑ " + what + " @ " + checkpoint
	return "☐ " + what + " @ " + checkpoint

if __name__ == "__main__":
	today = now.strftime("%b %d")
	print(applies("discouraged    @ (Sep  1-Dec  4)", today))
	print(applies("only_trail_use @ (Dec 24-Dec 23)", today))
	winter = "Jan 15"
	print(applies("no  @ (Sep 1 - Jan 6)", winter))
	print(applies("yes @ (Nov 16-Apr 30)", winter))
	sometimes = "Jun 30"
	print(applies("discouraged @ (Mar-Jun)", sometimes))
	sometimes = "Mar 1"
	print(applies("only_trail_use @ (Mar 3-Jun)", sometimes))

PS: The year is only added to the terms, because otherwise checking on February 29 in a leap year might cause an exception in the datetime module. Exceptions are not checked at all, but this is not production code. January 15 gets used as a reference date to see, if the condition applies in winter, because then, winter should have arrived. More use cases: Conditionally show markings on a vector map or display a prompt as a geofencing hint in an app. Update 22-10-22 - complete dates where only a month is given (firstof/lastof).

Eine kleine Einschaltung, weil das in den Foren oft so vorgeschlagen wird, nämlich dass man, wenn man z.B. einen Bach in die openstreetmap einpflegt, und den Verlauf nach dem Luftbild präzise erfasst, den Anbieter des Luftbildes als “source” des Objektes angibt. Und im nächsten Atemzug das als nicht gangbareren Weg ablehnt, weil das die Anforderungen der häufig an Luftbildern klebenden Creative Commons Lizenzen nicht erfülle.

Vorweg: Es geht hier nicht darum, Grauzonen auszuloten, sondern darum, den richtigen rechtlichen Rahmen zu wählen. Mir erscheinen die Überlegungen unten schlüssig. Rechtsgarantie kann ich keine abgeben.

Das Gesetz in Österreich nimmt “Landkartenwerke des BEV” davon aus, freie Werke zu sein. Im RIS (Gesetze+Urteile) findet sich keine Definition von “Landkartenwerk”, der Ausdruck scheint selbstverständlich? Der Absatz 2 wurde 1953 in UrhG §7 aufgenommen, da gab es schon Luftbilder.

Für mich heißt das, wenn ich mir die basemap in den Editor als Hintergrundbild lege und einen Bach durchpause, dann hab ich eine geschützte Information kopiert. Denn die Information, dass dort ein Bach verläuft, die blaue Linie, die hat jemand vom BEV in die Karte eingetragen.

Detto, wenn ich einen OGD Datensatz “Bäche” importiere, dann wird auch etwas kopiert, das urheberrechtlich geschützt ist. Ich glaub, so etwas ist hier Use of CC BY 4.0 licensed data in OpenStreetMap gemeint?

Dagegen sehe ich Luftbild und Geländemodell nicht als “Karte”, sondern als Rohdaten, wie aufwendig verarbeitet auch immer. Urheberrechtlich gehen die sicher als Foto durch. D.h. ich darf sie nur weiterverbreiten wenn ich eine Lizenz besitze. CC-BY ist da bestens geeignet.

Im Luftbild sind allerdings schlichtweg keine Bäche drin, auch keine Häuser, Wälder, Wiesen usw. Da sind geocodierte bunte Pixel. Wenn ich Lutftbild/DGM verwende, um den Verlauf eines Bachs in die Openstreetmap einzutragen, dann kopiere ich nichts. Die Handlung ist vom Urheberrecht nicht berührt und Creative Commons irrelevant.

Aber, nicht nur das Urheberrecht allein regelt, was man mit den Werken dritter anstellt. Auf jeden Fall zu berücksichten ist der wettbewerbsrechtliche Leistungsschutz: Der Fall um den es hier geht, Bäche nach DGM kartieren, ist meiner Auffassung nach eher so gelagert, als ein Beispiel, das das vielleicht besser verdeutlicht, wie “streetview” Bilder fürs mappen verwenden, das mit einem klaren “NoNo” belegt ist, weil der Inhaber der Fotos gleichzeitig ein Kartenwerk herausgibt und die Verwendung der veröffentlichen Rohdaten trotzdem und berechtigterweise Einschränkungen unterlegen will.

Forst ist ein Reservat

Posted by Hungerburg on 20 April 2021 in German (Deutsch). Last updated on 27 April 2021.

Ein interessanter Wikipedia Artikel wurde auf der Seite zu einem umstrittenen Proposal zitiert - https://en.wikipedia.org/wiki/Royal_forest - Leider nur auf Englisch, hier aus der Einleitung:

In England ist ein Reichsforst (royal forest), gelegentlich Königswald genannt, eine Fläche die nicht der landschaftlichen Gerichtsbarkeit unterliegt. Das Wort leitet vom lateinischen “foris” her, das mit “draußen” übersetzt wird. Im England der Anglo-Sachsen (~500-1066) hat es solche Bereiche nicht gegeben, erst die Normannen (ab 1066) haben diesen Brauch eingeführt. Dabei ging es in erster Linie darum, Wild für die herrschaftliche Jagd zu reservieren. Die pflanzliche Grundausstattung der Gegenden spielte eine Rolle nur dieses Zieles wegen. Für die Einheimischen war es keine frohe Botschaft, wenn das Land auf und von dem sie lebten zum Reichsforst erklärt wurde. Die Praxis, der nachgesagt wurde, dass sie für verbrannte Dörfer und Entvölkerung zeichnete, wenn auch im Ausmaß gewiss nicht wie behauptet, verebbte Mitte des 17. Jahrhunderts, die Bezeichnungen überleben bis heute.

Aus meiner Hobbymapper Perspektive: Hier in der Gegend gab es zu Zeiten der Monarchie einen Reichsforst - ein forstwirtschaftlich unergiebiges felsiges Steilgelände, aber gut zur Gamsjagd. Geerbt haben das die Bundesforste - ein vergleichsweise umgänglicher und verständiger Waldbesitzer. Förster kennt man hier keine, die heißen seit der frühen Neuzeit Waldhüter, ganz offiziell inzwischen Waldaufseher. Ums Wild kümmern sich Jäger.

Mit Ausnahme von administrativen Bezeichnungen (Forstamt) ist das Wort Forst hierzulande das Gegenteil von geläufig. Trotzdem sind genau hier, wo laut amtlichen Daten nicht ganz zwei Drittel des Waldes im forstwirtschaftlichen Ertrag stehen, 99% des Waldes in der OSM als Forst kartiert, was eben genau das aussagen soll, dass dem so sei. Das stinkt zum Himmel.


Update: Hierzulande (österreichisches Bundesland) gibt es scheints zwei Ebenen der Forstorganisation:

  • Försterbezirke, die unterteilen die politischen Bezirke.
  • Waldbetreuungsgebiete, die unterteilen die Försterbezirke.

Waldbetreuungsgebiete sind meist den normalen Gemeindegrenzen gleich; heißen dann auch so. Daneben gibt es, gemeindegrenzenübergreifend, die Österreichischen Bundesforste und dann noch die “Forstbetriebe”: ZB ein Stift, ein Sägewerk, und die “Stiftung der Herzog von Sachsen-Coburg und Gotha’schen Familie”. Waldbetreuungsgebiete von ÖBF oder Betrieben können sich über mehr als einen Försterbezirk erstrecken.

Alle diese Grenzen liegen immer auf Grundstücksgrenzen aus dem Kataster. Daten zu “Abteilen” sind nicht online. Vielleicht haben das nur ÖBF und Betriebe intern? In den Gemeinden sind es wohl die Grundstückseigentümer.

In diesem Bundesland gibt es demnach keinen Wald, der nicht “betreut” wird, weil es kein Land gibt, das nicht zu einer Gemeinde gehören würde.

English version

The local open-government-data GIS shows only two levels of forestry organisation:

  • Forester districts (Försterbezirke), which subdivide political districts.
  • Forest management areas (Waldbetreuungsgebiete), which subdivide forester districts.

These cover all of the land. There is no space that is not managed, be there wood, farmland, settlements, commercial or industrial estate, what ever. Of course, they do not have much of a say where there is no wood. If an area is considered woods can be learned from the land register. The official GIS does not show compartments, which would further subdivide forest management districts.

Forest management areas mostly are congruent with municipal/communal districts. In fact, most of the land is forestally managed by them. Besides, parts of the country are forestally managed by the Austrian Federal Forests (Österreichische Bundesforste, ÖBF) and “forestry companies” (Forstbetriebe): e.g. a monastery, a sawmill, and the “Foundation of the Duke of Saxe-Coburg and Gotha’s Family”. Latter two (federal and companies) manage woods across management areas and even across districts.

All of the boundaries always lie on property boundaries from the cadastre. In the communal forests, perhaps these form the compartments, the individual land owners? ÖBF and enterprises perhaps have them internally?

Note: In some regions around here, the privilege to do forestry, in the sense of economic use of a property, is in the hands not of the owner of the land but a third party rights-holder. (The owner is likely the municipality/commune, and the right to do logging is held by a natural person. The institution is called “Teilwald/partial forest.) Sometimes property owners and rights-holders organize themselves in “farming associations” which may also manage all of the municipal/communal woods, for their own benefit alone. That caused some bad press lately.

Auf der Suche nach dem verlorenen Wald

Posted by Hungerburg on 19 April 2021 in German (Deutsch). Last updated on 13 May 2021.

Ein in Abstimmung befindliches proposal beinhaltet, dass die Kennzeichnung von Waldflächen mit “landuse=forest” als veraltet gelten soll. In deutschen Landen wird die allerdings gerne dafür verwendet, um Waldflächen nach ihrer wirtschaftlichen Nutzung zu unterscheiden. So liest man jedenfalls. Im deutschsprachigen Forum hieß es dementsprechend vor Kurzem wieder einmal: 95% des Waldes in D/A/CH sind seit hunderten von Jahren Nutzwald, gehören also mit “landuse=forest” getaggt. Woher stammt diese Zahl?

Aus den Daten der openstreetmap selbst? Im OHSOME Dashboard lassen sich Flächen von Wald (natural=wood) und Forst (landuse=forest) ausgeben. Die sind mit Taschenrechner schnell in Anteile umgelegt. Deutschland liegt mit 97% Nutzwald nicht weit von 95, Österreich mit 99,2% allerdings ordentlich daneben, die Schweiz mit 95,6% schießt den Vogel ab. Alles klar! Genauer als die Deutschen sind eben nur die Schweizer, die Österreicher können den beiden das Wasser nicht reichen, die können nicht einmal Daten richtig erfassen. So könnte man meinen.

In Österreich gibt es nun die Österreichische Waldinventur, eine amtliche Stelle, die genau diese Daten erhebt. Ihr zufolge sind in Österreich aber nur 83% des Waldes Ertragswald, will heißen, für die Holzgewinnung genutzt. Besonders eklatant fällt das in einem westlichen Bundesland auf, die Ertragswaldquote laut ÖWI liegt dort bei 65,4%, laut OSM dagegen bei 98,8. Das liegt ja noch weiter auseinander!

In diesem westlichen Bundesland gibt es zu unserer Freude auch ein öffentlich zugängliches Geoinformationssystem. Luftbilder und anderes lassen sich als Hintergrundebene in JOSM einblenden. Vielleicht lässt sich damit mehr über die Differenz erfahren? Hier ein paar Bildschirmfotos von der “Suche nach dem verlorenen Wald”, mögen es vier Prozentpunkte sein, oder 33.

Die folgenden Bilder zeigen Ausschnitte in denen die OSM-Carto Standardansicht mit Daten des Landes überlagert wurden.

Waldnutzung am Paschberg

Paschberg - Das sieht einmal gut aus: geschätzte 105% der in OSM als Forst erfassten Flächen gelten als Ertragswald. Man sieht nebenbei auch, fürs Amt zählen Kahlschläge zum Ertragswald, während OSM Laien dort Gebüsch sehen, zumindest ein paar Jahre lang. Vielleicht liegt das aber eher an der glazialen Langsamkeit, mit der in der Forstwirtschaft Zeit vergeht?

Waldnutzung im Gschnitztal

Gschnitztal - Es wird bunter: Während der ganze in OSM erfasste Wald Forst ist, im GIS des Landes sieht es durchmischt aus; und das nicht nur weil mehr als zwei Arten der Nutzung getrennt abgebildet werden. Da haben wir den Salat.

Waldnutzung im Vomperloch

Vomperloch - Es wird wieder weniger bunt: Viel Schutzwald außer Ertrag. Wer die Örtlichkeit nicht kennt: Hier holt man Holz auch schon einmal mit dem Hubschrauber.

Nichts, das daran Zweifeln machen könnte, dass die amtlichen Daten so weit daneben liegen. Woran scheitert die genaue Erfassung in der OSM?

  • Der meiste Wald hier ist vor 10 Jahren kartiert worden. Die 95%-Regel hat es wohl schon gegeben, kurz zuvor war viel Wald per bot zu Forst umgetaggt worden, es gab sehr viel zu tun, da musste es schnell gehen. Meine Vermutung: es wurde nach Empfehlung markiert, viel schief gehen kann eh nicht.
  • Auch auf dem besten Luftbild lässt sich die Nutzung eines Waldes schwer erkennen. So bunt wie auf den Bildern die Nutzungsartenn ausfallen sieht es mir danach aus, dass das auch am Boden nicht so ohne weiteres möglich ist.

Will man die Unterscheidung in den Daten korrekt abbilden müssen jede Menge neuer Löcher “natural=wood” in die “landuse=forest” Flächen gestanzt werden. Andernorts müssten Löcher entfernt werden. Wie die dann füllen, wenn nicht Information verloren gehen soll?

Will man die Unterscheidung, forstwirtschaftlich genutzt kontra ungenutzt überhaupt abbilden? Das erwähnte proposal kurioserweise, das sich um die Erfassung von Forstbezirken kümmert, scheint es darauf nicht besonders abgesehen zu haben. Ich habe keine Möglichkeit gesehen, wie Wald als “use=industrial” oder ähnlich markiert werden könnte. Bisher scheint das noch nicht vermisst worden zu sein.

Dafür erwähnt das proposal den Schlüssel leisure - Erholungswald, eine Kategorie, die auch das Amt kennt, in einem andren Datensatz abgelegt, also oben nicht aufscheinend. Ein weiterer Datensatz heißt übrigens “Landnutzung”: Den habe ich nicht ganz verstanden, nur soviel, dass darin keine Unterscheidung von Wald nach Nutzung vorgenommen wird.

Die vorgeschlagenen neuen boundaries vermute ich, werden dabei auch nicht wirklich hilfreich sein. Die Waldkategorien, die auf den Diagrammen oben so schöne abstrakte Bilder zeichnen, folgen nämlich nicht den Grundstücksgrenzen; und das offensichtlich nicht, weil die Waldkategorien eventuell nur schleißig gezeichnet wurden, manchmal teilen sie Grundstücke, nicht nur kleine, genau in der Mitte. Ob Forstbezirke genauso wenig an den Kataster gebunden sind?

Quellen: Grundkarten © Openstreetmap Contributors +++ ÖWI Daten © Bundesforschungszentrum für Wald - https://www.bfw.gv.at/waldinventur-zwischenergebnisse-2016-2018/ +++ © Waldkategorien: Amt der Tiroler Landesregierung, Abteilung Raumordnung und Statistik, https://gis.tirol.gv.at/arcgis/rest/services/INSPIRE/AT_0024_17_Bodennutzung/MapServer/exts/InspireView/service - CC BY 3.0 Österreich - Zur Legende: Wenn hellrosa grün überlagert sieht es recht grau aus, nicht Baumbestanden Flächen sind im WMS nicht hellblau sonder schwarz +++ Bilder von der Überlagerung mit dem Kataster können hier nicht veröffentlcht werden, weil die den Nutzungsbedingungen des BEV unterliegen.

PS: Laut https://www.waldschweiz.ch/schweizer-wald/wissen/schweizer-wald/zahlen-fakten/ erfüllen 40% des Waldes Schutzfunktion; Wie viel davon im Ertrag steht ist nicht angeführt. Meines Erachtens spricht das eher nicht dafür, dass die 95% Quote in der Schweiz gilt, wie genau die in der OSM auch erreicht werden mag.

Sidewalks by popularity

Posted by Hungerburg on 25 January 2021 in English (English). Last updated on 28 January 2021.

[In continuation of „Sidewalks by length“ blog post.] As requested there, below chart for all of the world. Also chart for the US East coast, where, by their length, a whopping quarter of all of the worlds footway=sidewalk are located. 60% of the whole earth set is in the US alone (excluding Hawaii and Alaska.) As clearly can be seen, in the US this method trumps the other one, of mapping sidewalks as a property of the streets, they are part of.

For the the world outside of the US, the ratio is not as decisive, but rather more on par. Mapping sidewalks as footways seems, to use a highbrow term in the sense it is sanctioned by the Oxford English Dictionary, prevalent in US mapping.

For a popularity contest, the total alone is sufficient to declare a winner. To determine popularity in this contest though, where every voter has an unlimited number of votes, the number of voters is of interest too, and also the distribution in the number of votes spent per voter.

This requires a bit of hand-waving, errm, a little overpass-turbo experiment, first zoom out to all of the world, sorry, that probably will timeout the query, so settle in on the area from Richmond to Boston - https://overpass-turbo.eu/s/12M7

OHSOME counts 20,000 km in cumulated length, overpass returns 160,000 objects by 2,460 users, which might not be too far off (average length 125m). Paste the data in a spreadsheet and do a bit of more hand-waving - 50% of the data was last modified by 1.6% of the users. Not quite a few have spent quite a lot of votes, so to say. Sidewalk mapping seems to be popular with a select few, most prolific individuals. In statistics speak: The mean being ten times the median being six times the mode, it’s a heavily skewed distribution, where practically all of the contributions come from the outliers.

How often are objects with a footway tag modified? Panning around the area, many are at version 1. Panning also reveals, that sidewalk mapping is quite concentrated and vast swaths of urban space have no sidewalks at all, not even ordinary footways alongside of streets. On the other hand, e.g. Boston even has “street” relations, that link sidewalks to streets.

The overpass method is not expected to bring up anything useful, when applied to the other mapping scheme, as the base objects carrying the sidewalk tag are expected to have seen several revisions with the addition of the property not necessarily being latest.

[Update: Correct accounting for sidewalk=both]

Plot World Plot East Coast Plot Rest of the World Plot South America

Sidewalks by length

Posted by Hungerburg on 23 January 2021 in English (English). Last updated on 29 January 2021.

Below python script queries the OHSOME interface for the length of sidewalks mapped by different methods.

[Update: Correct accounting for sidewalk=both]

#!/usr/bin/python3

######### Plot the length of sidewalks mapped in certain regions

import json
import requests
import pandas as pd
import matplotlib.pyplot as plt
import datetime

pd.set_option('max_colwidth', 100) # maximum columnwidth for pandas
TIME_MONTHLY = "2008-01-01/2020-12-31/P1M" # temporal filter

######### Boundaries # http://norbertrenner.de/osm/bbox.html
BBOXES = {
    "US":                "-128.4,24,-57.2,49.7",
    "Poland":            "14.55,49.47,24.04,54.85",
    "Germany":           "5.89,47.17,13.86,54.89",
    "Great Britain":     "-11.7,49.8,2.1,61",
    "World":             "-180,-60,180,80", # took 1:10 min:s
    "East Coast":        "-83.7,23.9,-66.4,47.4",
    "Upper East Coast":  "-78.49,36.97,-70.11,42.94",
    "Not North America": "-25,-50,180,80|-110.6,-55.7,-29.2,24.5",
    "South America":     "-110.6,-55.7,-29.2,24.5",
}
BBOX="South America" # selected boundary

######### Filters
filterSidewalk = 'type:way and (\
(sidewalk=right) or \
(sidewalk=left) \
)'
filterSidewalk2 = 'type:way and (\
(sidewalk=both) \
)'
filterFootway = 'type:way and (\
(footway=sidewalk) \
)'

######### Query and plot
res = requests.post("https://api.ohsome.org/v1/elements/length/ratio",
      data = { 'filter': filterSidewalk, 'filter2': filterFootway,
               'bboxes': BBOXES[BBOX], 'time': TIME_MONTHLY } )
#print(res.text)
print(res.elapsed)
body = res.json()
df = pd.DataFrame(body['ratioResult'])
df.drop(columns=['ratio'], inplace=True)
# length is coming in meters, plot km
df.value = df.value/1000; df.value2 = df.value2/1000
df.timestamp = pd.to_datetime(df.timestamp)
df.set_index('timestamp', inplace=True)
res2 = requests.post("https://api.ohsome.org/v1/elements/length",
       data = { 'filter': filterSidewalk2,
                'bboxes': BBOXES[BBOX], 'time': TIME_MONTHLY } )
#print(res2.text)
print(res2.elapsed)
body2 = res2.json()
df2 = pd.DataFrame(body2['result'])
# length is coming in meters, plot km*2
df2.value = df2.value/500
df2.timestamp = pd.to_datetime(df2.timestamp)
df2.set_index('timestamp', inplace=True)
# plot result
df3 = df.add(df2, fill_value=0)
df3.rename(columns={'value': "Sidewalks", 'value2': "Footways"}, inplace=True)
df3.plot(title="Sidewalks (km) in OpenStreetMap in " + BBOX, figsize=(9.6, 4.8))
plt.show()

The resulting plots show, that there are indeed strong regional preferences:

Plot Britain

Plot Poland

Plots of the US and Eastern Europe look much like Poland; Germany and Western Europe look much like Great Britain. Plots with total number of ways have been created but not uploaded. The curves closely mirror the ones for length, when not accounting for sidewalk=both; their y-scale count slightly crosses the 100k mark, so average “raw” way length in both countries is roughly equal. If there is splitting going on, it affects both countries the same; When correctly accounting for sidewalk=both, average way length is considerably higher in Great Britain.

[Continue reading „Sidewalks by popularity“]

Alpine Routen

Posted by Hungerburg on 2 December 2020 in German (Deutsch). Last updated on 7 December 2020.

Weil im Talk zum sac_scale Artikel im OSM-Wiki der Verdacht geäußert wurde, höhere Grade würden einem, nicht weiter benannten Missbrauch Tür und Tor öffnen…

Im Hochgebirge in Österreich kann man auf Wegweisern dem Symbol “! Alpine Route” begegnen. Der Alpenverein weist damit darauf hin, dass man sich, anders als auf sogenannten Talwegen und Bergwegen, keine durchgehende Markierung zum angeführten Ziel erwarten darf, ja nicht einmal einen schön ausgetrampelten Steig, sondern “exponierte, ausrutsch- und absturzgefährdete Stellen sowie ungesicherte Geh- und Kletterpassagen” und demgemäß “gute Kondition, ausgezeichnetes Orientierungsvermögen, sichere Geländebeurteilung” usw. vonnöten sind.

Geht es nur mir so, oder liest sich das wie die Beschreibungen aus der Schweizer Wanderskala in ihren höheren Schwierigkeitsgraden? Ein paar mit diesen getaggte Wege finden sich sicher auch in Openstreetmap. Mal schauen, was es mit denen auf sich hat.

Die overpass turbo Abfrage “sac_scale=difficult_alpine_hiking in Tirol” (da kenn ich mich selbst am besten aus) liefert aktuell 157 Wege - Meistens die letzten (50 bis ein paar hundert) Meter zum Gipfel beziehungsweise Gratwanderungen zwischen zwei oder mehr Gipfeln, seltener den kompletten Gipfelanstieg vom Mittelgebirge aus. Einige Treffer markieren Zugänge zu Klettergärten; Einer ein Stück eines Wegs im Mittelgebirge, an der Stelle eines Hangrutsches; Einer das Wegstück vor dem Gastgarten der Hütte - eventuell verwechseln Amerikaner 6 mit 1, frei nach Schulnotensystem? Nichts wirklich aufregendes.

Für “demanding_alpine_hiking” liefert die Abfrage 341 Wege, bei “alpine_hiking” 899 Wege; Beides ziemlich gleich wie “difficult…” verwendet - zu allermeist im Hochgebirge, in den weißen/hellen Bereichen der mapnik Karte. Der zahlenmäßige Anstieg wirkt nicht unerwartet. Mir unverständlich kommt es bei T5 schon zu Kombinationen mit mtb Tags.

Potential für Kollateralschäden: Wer es zum Anfang schafft, bzw. bis dorthin wo es brenzlig wird, der/die sollte erfahren genug sein, entscheiden zu können, ob den Weiterweg wagen; von daher gering. Die Chance, dass nichtsahnende, ihrem solch exotische Tags nicht auswertenden Navi blind vertrauende Personen, die z.B. nur den Weg zum nächsten Milchautomaten gesucht haben, dann durch die Hölle geschickt werden, halte ich ebenfalls für vernachlässigbar.

Es sieht also sehr danach aus, dass die Tags ganz im Sinn der Erfinder angebracht werden. Nicht wenige dieser in der OSM verzeichneten Wege/Steige/Routen sind sogar ausgeschildert bzw. die Gipfel in den Beschreibungen der Hütten in der Umgebung, so es welche gibt, als Tourenziel erwähnt und gut getrampelt. Auf manchen davon kann allerdings dermaßen viel Zeit allein für Orientierung draufgehen, dass kein schnelles Vorankommen mehr ist - eine weitere Hilfe im Gelände zu unscheinbaren Steigspuren und, wie es sich gehört wenigen und dezenten Markierungen kann da jedenfalls nur nützen. Zu diesem Zweck wäre übrigens der nackte “highway=path” ausreichend, das Attribut “sac_scale” unterstützt mehr die Planung, aber das steht ja eh schon im Wiki-Artikel, wenn auch nicht so deutlich.

Wandern mit OSM

Posted by Hungerburg on 28 May 2020 in German (Deutsch). Last updated on 7 June 2020.

Wenn man auf Wanderungen Zufallsbekanntschaften macht und auf Nachfrage einen Blick auf die Wanderkarte werfen darf, dann sieht man in gar nicht wenigen Fällen ein Produkt das auf den Daten von openstreetmap.org (OSM) basiert. In der recht verbreiteten outdooractive Variante nimmt das freilich sehr Wunder, denn die Darstellung der OSM Daten, gerade was Wege angeht, ist darin derart reduziert, dass mehr als der Verlauf kaum ersichtlich wird.

Dabei enthalten die OSM Daten einige weitere hilfreiche Angaben dazu die sich optisch ansprechend einbauen lassen. Apps unabhängiger EntwicklerInnen, recht preiswert, manche sogar in ihren kostenlosen Varianten, bringen sie ausdrucksvoll und schön zu Tage. Böse Zungen werden sagen, outdooractive (die gemanagte Community) oder Kompass (der Verlag) tun das absichtlich nicht, um ihren Zahlprodukten keine Konkurrenz zu machen. Andere werden sagen, die Daten sind nicht professionell genug auf einen Mindeststandard gehoben, um sich die Mühe anzutun, sie überhaupt in die Gestaltung zu übernehmen.

Wie dem auch sei, wer dagegen mit google-maps wandern geht­, das wohl nicht nur meines Erachtens professionellste Produkt am Markt für Navigationssysteme, dem kann sowieso nicht geholfen werden, schließlich ist es für Leute gemacht, die mit ihren Füßen hauptsächlich Gaspedale treten oder auf ihnen zum Shopping durch eine Altstadt bummeln; Es ist auch wirklich gut darin, hier von A nach B zu finden. Aber auch diese Karte bekommt man, zumindest wenn man nicht zu fern breiter Forststraßen unterwegs ist, hin und wieder zu sehen. Nicht selten kommt dabei heraus: Was man nicht im Kopf hat, das hat man in den Beinen.

Was gibt es zu jenen OSM Daten nun Wissenswertes zu erzählen? Das Argument mangelnder Professionalität hat einen wahren Kern, die Daten entstehen, ähnlich wie Einträge in der allbekannten Wikipedia, zu einem nicht unbedeutenden Teil aus dem Fleiß von Hobbyisten, in diesem Fall Sonntagsgeographen unterschiedlichster Motivationen und Meriten. Penibel nach GPX, Luftbild und DGM eingetragene selten begangene Steige finden sich dort gleichauf Skiabfahrten mitten in der Sahara, die erstaunlich lange stehen bleiben, wohl weil den in ihrem Machtrausch kichernden Kids ob deren Absurdität niemand böse sein kann. Große Mengen Daten stammen aus open government data Beständen und sind häufig ohne viel Prüfung in Bausch und Bogen übernommen worden; angesichts des schieren Volumens nicht weiter verwunderlich.

Wenn ich aber in einem outdooractive Werbetext lese, dass ich gegen Aufpreis in einer App amtlich beglaubigte Daten als Grundlage der Karte zukaufen kann, verstehe ich sofort, warum selbst Leute, die dieses Paket erworben haben es in der Praxis dann nicht verwenden. Schließlich will man ja den aktuellen Weg, dessen Zustand oder die zu erwartende Schwierigkeit erfahren und nicht, wo im Grundbuch ein Wegerecht hinterlegt ist oder wo vor 50 Jahren Jäger ihre Reviere durchstreiften. Kompass AnwenderInnen dagegen nutzen anscheinend gerne das gekaufte.

Eine Schwachstelle der OSM Daten als Grundlage einer Wanderkarte ist nicht zuletzt, dass es sich bei OSM in erster Linie um eine Datenbank von geographisch kodierten Informationen handelt, welcher Art auch immer. Die Karten, will heißen die Ausschnitte daraus auf den Bildschirmen sind davon nur programmatisch abgeleitet. Falschinformationen sind vielleicht das kleinere Problem, für das spezifische Kartenprojekt irrelevantes muss herausgefiltert werden. Das geht nur dann gut, wenn die Daten entsprechend attribuiert wurden. Die teilweise hitzig geführten Debatten dazu lassen sich großteils in Wikis und Mailinglisten nachlesen.

Gewerbliche Weiterverbreiter der Daten werden sich auch Fragen zur Institution OSM stellen. Die Organisation ist offensichtlich nicht so einfach zu klären als die der Wikipedia. Ganz so transparent sind wahrscheinlich beide nicht. Man investiert vielleicht nicht gerne, in etwas, das einem nicht (allein) gehört.

Was man selten zu sehen bekommt, sind Karten auf Papier. Die Übersichtlichkeit bleibt nach wie vor unübertroffen, die Geschwindigkeit mit der man von der großräumigen Orientierung zum Detail wechseln kann detto. Aber die müsste man ja jedes Mal extra heraussuchen und auch einpacken.

Historische Luftaufnahmen aus dem Tiris

Posted by Hungerburg on 23 May 2020 in German (Deutsch). Last updated on 19 July 2020.

Auf Deutsch, weil eh nur für lokale Mapper von Interesse: Das Land Tirol veröffentlicht in seinem WMS nicht nur das aktuelle sondern auch in die Jahre gekommene Luftbilder. Ab und zu ganz praktisch.

Den Absatz unten an geeigneter Stelle (bei den andren maps) in die preferences.xml von JOSM kopieren und eine Reihe alter Orthofotos stehen nach dem nächsten Start als Hintergrundbild zur Verfügung.

    <map>
      <tag key='projections' value='EPSG:3035,EPSG:3044,EPSG:3045,EPSG:3857,EPSG:4258,EPSG:4326,EPSG:25832,EPSG:25833,EPSG:31254,EPSG:31255,EPSG:31256,EPSG:31257,EPSG:31258,EPSG:31259,EPSG:31287,EPSG:32632,EPSG:32633'/>
      <tag key='transparent' value='true'/>
      <tag key='minimumTileExpire' value='3600'/>
      <tag key='name' value='Tiris: Luftbild'/>
      <tag key='type' value='wms_endpoint'/>
      <tag key='url' value='https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer'/>
      <tag key='attribution-text' value='tiris.tirol.gv.at'/>
      <tag key='attribution-url' value='https://tiris.tirol.gv.at/'/>
      <tag key='permission-reference-url' value='https://www.data.gv.at/katalog/dataset/35691b6c-9ed7-4517-b4b3-688b0569729a'/>
      <tag key='country-code' value='AT'/>
      <tag key='cookies' value=''/>
      <tag key='bounds' value='46.6487342,10.0922445,47.7538216,12.9797402'/>
      <tag key='shapes' value='47.5976781,10.4399766,47.5992486,10.4788646,47.5865589,10.5027725,47.5597936,10.4837986,47.5434951,10.513122,47.5458237,10.5717689,47.5621216,10.570044,47.5807415,10.6010923,47.5691048,10.6390403,47.5702686,10.7080366,47.5493166,10.7114864,47.5504808,10.7684083,47.5260267,10.7856574,47.5504808,10.8960515,47.5236971,10.9357244,47.5050569,10.9339995,47.4957344,10.8908768,47.4910724,10.9512486,47.4677567,10.9546984,47.4327637,11.0029958,47.4082547,10.9909215,47.4047525,11.1030405,47.4199271,11.1151148,47.4455971,11.2099847,47.4409308,11.2686316,47.4105894,11.2669067,47.4420974,11.2945052,47.4607599,11.3307283,47.4584275,11.3824755,47.4759184,11.3704012,47.5306855,11.4393975,47.5178728,11.466996,47.5236971,11.5739403,47.5586296,11.5756652,47.5912123,11.598089,47.6063331,11.6343121,47.5947021,11.6688102,47.602844,11.7930036,47.5923756,11.8395761,47.6109847,11.8499255,47.6365615,12.0068922,47.6249373,12.0362156,47.6272623,12.0776134,47.6191242,12.1086617,47.6226121,12.1949071,47.6876775,12.1535093,47.7166984,12.158684,47.7120562,12.1811078,47.7248214,12.2190558,47.7538216,12.2414796,47.7515022,12.272528,47.7317829,12.2846023,47.695805,12.2656283,47.7108955,12.3363495,47.695805,12.3760224,47.7027704,12.4432938,47.692322,12.4536433,47.6749032,12.4536433,47.6319121,12.5105652,47.6458591,12.5312641,47.6342369,12.589911,47.6109847,12.5795615,47.5947021,12.6658069,47.5749235,12.6796062,47.5504808,12.645108,47.5318501,12.6675318,47.5038917,12.6847809,47.4817474,12.7123795,47.4560949,12.6675318,47.4595937,12.6416582,47.443264,12.6502828,47.4070873,12.6209593,47.3860701,12.5743868,47.3965797,12.5502381,47.3720539,12.4915913,47.3510227,12.5088403,47.3206295,12.4881414,47.322968,12.4346693,47.3042567,12.4139704,47.3089351,12.3639481,47.3276449,12.3122008,47.298408,12.2708031,47.2937286,12.177658,47.2843686,12.1483346,47.2995778,12.1172863,47.2750069,12.0983123,47.2504245,12.1259108,47.1977096,12.0965874,47.1484618,12.1103866,47.109735,12.141435,47.0897738,12.1379852,47.0756791,12.1500595,47.0439523,12.0051672,47.0298454,11.9206468,46.9910324,11.8309516,46.9863258,11.7878289,46.9674955,11.7740296,46.9651413,11.7309069,46.9898558,11.7067582,46.994562,11.6429366,47.0051495,11.6118883,46.9780884,11.5325425,47.0086782,11.4928696,46.9674955,11.4445722,46.9616097,11.4048993,46.9863258,11.3445276,46.9569006,11.2030851,46.9616097,11.1754866,46.9439484,11.1772115,46.922747,11.1461632,46.922747,11.1254643,46.9038944,11.1082152,46.8885717,11.1151148,46.853195,11.0823416,46.8236966,11.0961408,46.8024477,11.0512932,46.762288,11.0236947,46.7705586,10.9184753,46.7575613,10.8839772,46.7729214,10.8408545,46.7693772,10.8236054,46.7894581,10.7908322,46.778828,10.756334,46.7906391,10.7252857,46.8272372,10.7477095,46.8449371,10.6942373,46.869707,10.6735384,46.853195,10.6079919,46.8272372,10.5545198,46.8390378,10.5200216,46.8366779,10.4682744,46.8814982,10.4510253,46.9321709,10.475174,46.9557232,10.4130773,46.9886791,10.3941034,46.9804421,10.3665048,46.9474811,10.3389063,46.9180345,10.3285569,46.9133215,10.2975085,46.9251032,10.2595605,46.8626311,10.2388617,46.8390378,10.1664155,46.8472966,10.1353672,46.8720655,10.1319174,46.886214,10.1060438,46.9274592,10.0922445,46.952191,10.1250177,47.0004442,10.1457166,47.0251423,10.1129434,47.0498291,10.1526163,47.0627556,10.1301925,47.0909482,10.1336423,47.126168,10.1595159,47.1425959,10.2009137,47.2000536,10.1922891,47.2129438,10.2095382,47.2398857,10.1871144,47.2562785,10.2009137,47.2633024,10.1681404,47.2808581,10.1681404,47.2913887,10.2026386,47.2890488,10.2440364,47.3206295,10.3337316,47.3907413,10.3889286,47.3942444,10.4148022,47.436264,10.4562,47.4817474,10.4475755,47.5050569,10.419977,47.5551374,10.4424008,47.5714324,10.4130773,47.5976781,10.4399766;47.1601916,12.401896,47.1390761,12.3570484,47.1120829,12.3501488,47.107387,12.3104759,47.0721548,12.2552789,47.0592305,12.2138811,47.0263181,12.2000818,47.0310212,12.1448848,47.007502,12.1155613,46.9592552,12.1362602,46.9357044,12.1673086,46.9109649,12.1431599,46.9003588,12.1897324,46.8661692,12.2173309,46.8838562,12.2552789,46.8826772,12.2742529,46.8343179,12.2984016,46.8201557,12.2759778,46.7776467,12.2794276,46.77174,12.3501488,46.7150029,12.3811972,46.6842454,12.4432938,46.6700437,12.5140151,46.6487342,12.5657623,46.6534704,12.6295839,46.6534704,12.70203,46.6984434,12.7037549,46.7008093,12.7296285,46.7374685,12.7227289,46.7492887,12.8020747,46.744561,12.8538219,46.77174,12.9038442,46.7599247,12.9279929,46.7764654,12.9573164,46.7977246,12.9797402,46.8331378,12.8952197,46.8484763,12.8952197,46.8638104,12.8451974,46.9156781,12.8469223,46.930993,12.7968999,46.9474811,12.7882754,46.9686726,12.7486025,46.9969149,12.7365282,47.0416014,12.7813758,47.0510043,12.7624018,47.0451277,12.7141044,47.0780285,12.7106545,47.126168,12.6226842,47.1414227,12.5692121,47.1332091,12.551963,47.154327,12.5260894,47.1648828,12.4829667,47.1484618,12.4605429,47.1578459,12.4346693,47.1437691,12.4191451,47.1601916,12.401896'/>
      <tag key='icon' value='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAC6UExURbUVIMRFTc5la9mIjbwrNf78/NNyeP///7YXIr0uON6Vmr81PrgfKbccJ+i4u8taYrcYI89pcLojLduMkcpXXvHT1diFi9V6gNBrcuu/wuOnq8A3Qee1uLomMOm6vchRWdZ9g+GhpcI+R8NCS+/N0OWtsL4wOvz19fns7OawtNN1e/vx8evCxPfm59FudcE8ReCcoctdZPTe3+3IysdOVvru7+q8v9eCh9uOk+m7vvbk5cxdZdyRlvfn6AlnILEAAAEdSURBVBgZ3cHHcoMwEADQBSStRDVgejPFDfdekvz/b2UmJ2Pj3JP34P9JiKvZa+HAO35KDJA9Dd6RNclsjeEGehCJw0eclGnqrN0KuETgie2V1qew1JNO1Kr0bOiyZBmRsZ2RY7CrGaIsW/BIV1aIxXGvHdBLnQJxpejQdV0y38hsihfCfba8QkemmrO5aG5tjDhvb42Yz0w1gwd6Ld2/gvMUEen0HKzuUq1Dh6YuKM0VD9FUckoXqgYd1lgRDCn+oMiEMrbgmelWhYo4syrXhB6jaADJKW/2WxhEI3ghQgNAKSfj4XICeijgVXI5Mk4iEH4YQB85jFqJTUUQb30CfayaZxENdO5y6LXhTnhYxAVIHN4hdiM58KsJ/EHffQMXO42u02cAAAAASUVORK5CYII='/>
      <tag key='customHttpHeaders' value='{}'/>
      <tag key='category' value='photo'/>
    </map>

In der Baumstruktur sind es dann die “Image_…” Einträge: zB. 1970 ganz retro in schwarzweiß, 2004 mit auch in Schatten noch gut sichtbaren Details.

PS: So richtig Historische Karten gibt es hier

Below script converts tracks in lg2 format of Marek Baranowski’s withdrawn IOS app to gpx

#!/usr/bin/perl
use POSIX qw(strftime);

my $name = shift or die "Usage: $0 filename\n";

open (FH, "<$name") or die 'No such file';
binmode(FH);

my $buf;
my $mul = 3600000;
my $fmt = "vVVvV";

print '<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.0">
	<time>'.strftime("%FT%X", localtime).'</time>
	<trk>
		<name>'.(split(/\./,$name))[0].'</name>
		<trkseg>';

while (my $got = read (FH, $buf, 16)) {
	my ($H, $B, $L, $X, $T) = unpack $fmt, $buf;
	print '
			<trkpt lat="'.$B/$mul.'" lon="'.$L/$mul.'"><ele>'.$H.'</ele><time>'.strftime("%FT%X", $T, 1, 1, 1, 0, 70).'</time></trkpt>' if $T > 100000;
}

print'
		</trkseg>
	</trk>
</gpx>
'