OSM Planet

From BITPlan Wiki
Jump to navigation Jump to search

Links

OSM Planet SPARQL Queries with pylodstorage query tool

Configuration for pylodstorage sparqlquery tool

see https://pypi.org/project/pyLodStorage/

installation

pip install pylodstorage

The configuration files need to be in $HOME/.pylodstorage or you have to explicitly give the path with the -ep and -qp options

endpoints.yaml

osm-sophox:
  endpoint: https://sophox.org/sparql
  website: https://sophox.org
  database: blazegraph
  method: POST
  lang: sparql
  prefixes: |
    PREFIX osmrel: <https://www.openstreetmap.org/relation/>
    PREFIX osmt: <https://wiki.openstreetmap.org/wiki/Key:>
    PREFIX osmm: <https://www.openstreetmap.org/meta/>
    PREFIX geo: <http://www.opengis.net/ont/geosparql#>

osm-qlever:
  endpoint: https://qlever.cs.uni-freiburg.de/api/osm-planet
  website: https://qlever.cs.uni-freiburg.de/osm-planet
  database: qlever
  method: POST
  lang: sparql
  prefixes: |
    PREFIX osmrel: <https://www.openstreetmap.org/relation/>
    PREFIX osmt: <https://wiki.openstreetmap.org/wiki/Key:>
    PREFIX osmm: <https://www.openstreetmap.org/meta/>
    PREFIX geo: <http://www.opengis.net/ont/geosparql#>
    PREFIX osm2rdfmember: <https://osm2rdf.cs.uni-freiburg.de/rdf/member#>
    PREFIX osmway: <https://www.openstreetmap.org/way/>

osmplanet.yaml (or queries.yaml as default)

# OSMPlanet Query Examples
# Wolfgang Fahl
# 2025-01-20
#
# SPARQL queries for exploring OpenStreetMap data via:
# - https://sophox.org/sparql (Sophox endpoint)
# - https://qlever.cs.uni-freiburg.de/osm (Qlever endpoint)
#
# See also:
# - https://www.openstreetmap.org/
# - https://wiki.bitplan.com/index.php?title=OSM_Planet
#
# Motivation: Explore OSM relations and their predicates/objects to analyze
# connectivity and relationships between OSM entities
'RelationStats':
 param_list:
   - name: relid
     type: str
     default_value: "6843452"
 sparql: |
   # Get statistics about predicates used in an OSM relation
   PREFIX osmrel: <https://www.openstreetmap.org/relation/>
   SELECT ?p (COUNT(?o) as ?count)
   WHERE {
     osmrel:{{relid}} ?p ?o .
   }
   GROUP BY ?p
   HAVING (?count > 1)
   ORDER BY DESC(?count)
'RelationNodes':
# Get all nodes for a given OSM relation relid e.g. Renfe R16019
  param_list:
    - name: relid
      type: str
      default_value: "6843452"
  sparql: |
    PREFIX osmrel: <https://www.openstreetmap.org/relation/>
    SELECT ?p ?o (STR(?label) as ?plabel)
    WHERE {
      osmrel:{{relid}} ?p ?o .
      FILTER(STRSTARTS(STR(?o), "https://www.openstreetmap.org/node/"))
    }
'RelationNodesGeo':
  # get geometry data for relation elements with a given role including lat/lon filtering
  param_list:
    - name: relid
      type: str
      default_value: "10492086"
    - name: role
      type: str
      default_value: "stop"
    - name: min_lat
      type: float
      default_value: 36.00
    - name: max_lat
      type: float
      default_value: 44.00
    - name: min_lon
      type: float
      default_value: -9.00
    - name: max_lon
      type: float
      default_value: 4.00
  sparql: |
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX geo: <http://www.opengis.net/ont/geosparql#>
    PREFIX osm2rdfmember: <https://osm2rdf.cs.uni-freiburg.de/rdf/member#>
    PREFIX osmrel: <https://www.openstreetmap.org/relation/>
    PREFIX osmkey: <https://www.openstreetmap.org/wiki/Key:>
    PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
    SELECT
      ?rel_name
      ?rel
      ?rel_pos
      ?member
      ?node
      ?node_name
      ?node_ref
      ?role
      ?lat
      ?lon
    WHERE {
      VALUES (?rel ?role ?minlat ?maxlat ?minlon ?maxlon) {
        (osmrel:{{relid}} "{{role}}" {{min_lat}} {{max_lat}} {{min_lon}} {{max_lon}})
      }
      ?rel osmkey:ref ?rel_name .
      ?rel osmrel:member ?member .
      ?member osm2rdfmember:pos ?rel_pos .
      ?member osm2rdfmember:role ?role .
      ?member osm2rdfmember:id ?node .
      OPTIONAL { ?node osmkey:name ?node_name}.
      OPTIONAL { ?node osmkey:ref ?node_ref}.
      ?node geo:hasGeometry/geo:asWKT ?loc .
      BIND(geof:latitude(?loc) AS ?lat)
      BIND(geof:longitude(?loc) AS ?lon)
      FILTER (?lat > ?minlat && ?lat < ?maxlat && ?lon > ?minlon && ?lon < ?maxlon)
    }
    ORDER BY ?rel_pos
'RelationRoleHistogram':
  # Get a histogram of roles for a given OSM relation
  param_list:
    - name: relid
      type: str
      default_value: "10492086"
  sparql: |
    PREFIX osmrel: <https://www.openstreetmap.org/relation/>
    PREFIX osm2rdfmember: <https://osm2rdf.cs.uni-freiburg.de/rdf/member#>
    SELECT ?role (COUNT(?member) as ?count)
    WHERE {
      osmrel:{{relid}} osmrel:member ?member .
      ?member osm2rdfmember:role ?role .
    }
    GROUP BY ?role
    ORDER BY DESC(?count)

test

sparqlquery -en qlever-osm  -qp osmplanet.yaml --list
RelationStats:RelationStats
RelationNodes:RelationNodes
RelationNodesGeo:RelationNodesGeo
RelationRoleHistogram:RelationRoleHistogram

Sophox Example Queries

RouteTypeHistogram

sparqlquery  -qp osmplanet.yaml -en osm-sophox -p -qn RouteTypeHistogram --limit 10 --format mediawiki

query

SELECT
  ?route_type (COUNT(?route_type) AS ?count)
WHERE {
   ?route
   osmt:type "route";
   osmt:route ?route_type;
   osmm:type "r";
   osmt:ref ?ref;
}
GROUP BY ?route_type
ORDER BY DESC(?count)

try it!

result

route_type count
bus 286484
road 242360
hiking 106522
bicycle 71364
foot 49011
train 13673
mtb 8649
power 5660
railway 5239
tram 4739
sparqlquery -qp osmplanet.yaml -qn RelationStats -en osm-sophox --param relid=6843452 -f mediawiki

RelationStats

query

# Get statistics about predicates used in an OSM relation
PREFIX osmrel: <https://www.openstreetmap.org/relation/>
SELECT ?p (COUNT(?o) as ?count)
WHERE {
  osmrel:6843452 ?p ?o .
}
GROUP BY ?p
HAVING (?count > 1)
ORDER BY DESC(?count)

try it!

result

p count
https://www.openstreetmap.org/meta/has 186
sparqlquery -qp osmplanet.yaml -qn RelationNodes -en osm-sophox --param relid=6843452  -f mediawiki

RelationNodes

query

# Get all nodes for an OSM relation
PREFIX osmrel: <https://www.openstreetmap.org/relation/>
SELECT *
WHERE {
  osmrel:6843452 ?p ?o .
  FILTER(STRSTARTS(STR(?o), "https://www.openstreetmap.org/node/"))
}

try it!

result

p o
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/29567894
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/29569297
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/1697798338
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/1981635686
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/5239688223
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/5959602923
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/6083777817
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/6767679673
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/6767679678
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/6767679964
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/6767680441
https://www.openstreetmap.org/meta/has https://www.openstreetmap.org/node/6767844278

QLever example queries

sparqlquery -qp osmplanet.yaml -en osm-qlever -p -qn RelationRoleHistogram -f mediawiki --param relid=10492086

RelationRoleHistogram

query

PREFIX osmrel: <https://www.openstreetmap.org/relation/>
PREFIX osm2rdfmember: <https://osm2rdf.cs.uni-freiburg.de/rdf/member#>
SELECT ?role (COUNT(?member) as ?count)
WHERE {
  osmrel:10492086 osmrel:member ?member .
  ?member osm2rdfmember:role ?role .
}
GROUP BY ?role
ORDER BY DESC(?count)

try it!

result

role count
member 624
platform 31
stop 26