Create data: GPS

Advertising spots in Nürnberg based on OSM

NoteInformation
  • Diese Datei zeigt, wie OpenStreetMap-Daten (OSM) für Werbeträger in Nürnberg abgerufen, vereinheitlicht und als CSV gespeichert werden.
  • Die Datenquelle ist die Overpass-API (OSM), die über das Paket osmdata angesprochen wird.
  • Die Überarbeitung umfasst:
    • Vereinheitlichung verschiedener Geometrietypen (Punkt, Linie, Polygon) auf einen gemeinsamen Punkt (Koordinaten)
    • Entfernen doppelter OSM-Objekte und eine einfache Bereinigung fehlender Namen.

Setup

library(osmdata)
Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(sf)
Linking to GEOS 3.14.1, GDAL 3.12.1, PROJ 9.7.1; sf_use_s2() is TRUE
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(readr)
library(here)
here() starts at /Users/ca/repositories/academic/dbd_2025
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.1     ✔ stringr   1.5.1
✔ ggplot2   4.0.0     ✔ tibble    3.3.0
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.1.0     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

OSM API Call

NoteHintergrund: OpenStreetMap
  • OpenStreetMap (OSM) ist eine frei zugängliche, kollaborativ gepflegte Weltkarte, ähnlich zu Wikipedia für Geodaten.
  • Die Plattform stellt verschiedene Geometrietypen bereit (Punkte, Linien, Flächen) und speichert Attribute (Tags) wie amenity, shop oder advertising.
  • Die Daten sind offen lizenziert (ODbL) und können für Analysen, Karten oder Forschung genutzt werden.
  • Eingepflegt werden die Daten durch eine weltweite Community, z.B. über Vor-Ort-Erhebungen, GPS-Tracks, Luft- und Satellitenbilder sowie öffentlich verfügbare Datensätze mit kompatibler Lizenz.
  • Datenabdeckung und Detailgrad unterscheiden sich je nach Region.
  • Mit Hilfe der Overpass-API können gezielte Suchanfragen an die OSM-Daten gestellt werden (z.B. „alle Objekte mit advertising=* in Nürnberg“).
NoteHintergrund: osmdata
  • osmdata übernimmt diese Overpass-API Abfragen in R: Es formuliert die Overpass-Query, sendet sie an die API und gibt die Antworten als sf-Objekte zurück.
  • Statt eine Karte „als Bild“ zu laden, holt osmdata die Daten als Tabellen. Jede Zeile steht für ein Objekt (z.B. ein Werbeträger) und hat Koordinaten plus zusätzliche Merkmale (Tags).
  • Geodaten haben unterschiedliche Formen: Punkt (ein Standort), Linie (z.B. Straße) oder Fläche (z.B. Gebäude). osmdata liefert diese Formen als sf-Objekte, damit sie in R wie normale Datensätze bearbeitet, gefiltert und visualisiert werden können.
  • Ein sf-Objekt („simple features“) ist ein spezieller Datensatz in R, der Tabellen-Spalten mit einer Geometrie-Spalte kombiniert. So bleiben räumliche Lage (Punkt/Linie/Fläche) und Attribute zusammen und können mit vielen Geodaten-Funktionen verarbeitet werden.
# 1) Räumliche Ausdehnung bestimmen: Bounding Box für Nürnberg
#    (einsteigerfreundlich, da nur Ortsname nötig ist)
bb <- getbb("Nürnberg, Germany")

# 2) Overpass-Abfrage: alle OSM-Objekte mit Tag advertising=*
#    (OSM-Schlüssel "advertising" umfasst z.B. billboard, column, etc.)
q <- opq(bbox = bb) %>%
  add_osm_feature(key = "advertising")

# 3) Abfrage ausführen und als sf-Objekte (Punkte/Linien/Polygone) laden
dat <- osmdata_sf(q)

# 4) Punkte: direkt nutzbar, Koordinaten extrahieren
pts <- dat$osm_points %>%
  st_transform(4326) %>%
  mutate(
    lon = st_coordinates(.)[,1],
    lat = st_coordinates(.)[,2],
    geom_source = "point"
  ) %>%
  st_drop_geometry()

# 5) Polygone: Flächen werden auf ihre Zentroiden reduziert
#    (damit alle Geometrien später einheitlich als Punkt vorliegen)
polys_cent <- dat$osm_polygons %>%
  st_transform(4326) %>%
  st_centroid() %>%
  mutate(
    lon = st_coordinates(.)[,1],
    lat = st_coordinates(.)[,2],
    geom_source = "polygon_centroid"
  ) %>%
  st_drop_geometry()
Warning: st_centroid assumes attributes are constant over geometries
# 6) Linien: selten, aber möglich -> ebenfalls auf Zentroiden reduzieren
lines_cent <- dat$osm_lines %>%
  st_transform(4326) %>%
  st_centroid() %>%
  mutate(
    lon = st_coordinates(.)[,1],
    lat = st_coordinates(.)[,2],
    geom_source = "line_centroid"
  ) %>%
  st_drop_geometry()
Warning: st_centroid assumes attributes are constant over geometries
# 7) Zusammenführen, Duplikate entfernen und Variablen vereinheitlichen
advertising_nb <- bind_rows(pts, polys_cent, lines_cent) %>%
  distinct(osm_id, .keep_all = TRUE) %>%
  transmute(
    osm_id,
    # Fehlende Namen werden für konsistente Auswertung ersetzt
    name = if_else(is.na(name) | name == "", "(ohne Name)", name),
    # advertising enthält die OSM-Klassifikation (z.B. billboard, column)
    advertising = advertising,
    lat, lon,
    geom_source
  )
advertising_nb %>% glimpse()
Rows: 405
Columns: 6
$ osm_id      <chr> "1266669682", "1541149276", "1729605524", "1729605526", "1…
$ name        <chr> "(ohne Name)", "(ohne Name)", "(ohne Name)", "(ohne Name)"…
$ advertising <chr> "column", "column", NA, NA, NA, NA, "column", "column", "y…
$ lat         <dbl> 49.46192, 49.40856, 49.45004, 49.45004, 49.45007, 49.45007…
$ lon         <dbl> 11.09206, 11.10481, 11.07586, 11.07590, 11.07586, 11.07590…
$ geom_source <chr> "point", "point", "point", "point", "point", "point", "poi…
# 8) Ergebnis als CSV speichern (lokale Datei im Projektverzeichnis)
write_csv(advertising_nb,
  here("data/gps-advertings_in_nbg.csv")
)