Alle Gebäude von einer Liste nodes

Hallo zusammen,

ich habe ca. 1500 Nodes, allesamt Kritische Infrastrukturen (Feuerwehr, Kraftwerk, Krankenhaus, Polizei). Diese Objekte habe ich via osmfilter aus der Gesamt-NRW .osm-Datei von Geofabrik extrahiert.

Da nicht einheitlich ist, ob das Gebäude oder ein auf dem Gebäude liegender Node die Attributierung amenity:fire_station bekommt, habe ich nun also insgesamt ca. 5000 Polygone die mir als Kritische Infrastrukturen extrahiert wurden, aber auch 1500 Nodes, aber nicht das Gebäude auf denen der Node liegt.

Das gesamte NRW.osm in ArcGIS einladen hat nicht funktioniert, das würde Wochen dauern (bereits probiert).

Daher meine Frage: Wie komme ich an die ca. 1500 Gebäude, deren Node vorhanden ist, die Polygone aber in einer Datei sind, die ich nicht öffnen kann?

Liebe Grüße
Felix

Vielleicht sind die Gebäude gar nicht eingetragen. Ansonsten könntest du es mit der Overpass API probieren (is_in). Dokumentation dazu findest du unter anderem im Wiki.

Nein, das funzt nicht, die meisten Buildings haben ja keinen Namen. Da bleibt nur Umkreissuche für bestehende amenity=fire_station: http://overpass-turbo.eu/s/wJS

snip - vertan

Und da stellt man dann bei näherem hinsehen fest, dass es noch genügend amenity=fire_station Nodes OHNE ein entsprechendes Gebäude drumherum gibt, d.h. die müssten alle noch manuell ergänzt werden.

Felix,

Dies seie nicht richtig. Mit der** ArcGIS Editor for OpenStreetMap**, und besonders der “tool” OSM File Loader (Load Only) kannst du sogar “multi-core” OSM data (format *.osm XML) einladen in einer File Geodatabase, wenn Sie der “Parallel Processing environment setting” nutzt. Das wirdt sicherlich keine Wochen dauren für NRW, nur Stunden, vielleicht ein halbes Tag:

https://www.arcgis.com/home/item.html?id=0c4b24608fc94542ba5d1130c0606802 (ArcGIS 10.6 Version, es gibt auch separate Version für ArcGIS < 10.6)

Ein Extract für NRW können Sie von Geofabrik runterladen:

http://www.geofabrik.de/

Hallo,

das hat auf Anhieb funktioniert! Vielen Dank. ArcGIS hat zwar eine Fehlermeldung mit ausgeschmissen, aber sieht danach aus als wären alle Daten vorhanden.
Falls es wen interessiert: Ich benötige die Daten für meine Bachelorarbeit, ich vergleiche OSM-Daten mit ALKIS-Daten im Bereich Kritischer Infrastrukturen.

Na dann halte uns doch bitte mal auf den Laufenden, was deine Recherchen so ergeben haben … also was bei OSM noch fehlt bzw. wie groß die Abweichung zwischen ALKIS und OSM ist :wink:

Geht mit PostGIS wunderbar:


select n.osm_id,wno_striptags(n.tags)
  from planet_osm_point n, 
       planet_osm_polygon p
 where st_contains((select way from planet_osm_polygon where osm_id=-62746),n.way)
   and st_contains(p.way,n.way)
   and n.tags->'amenity'='fire_station'
   and p.tags ? 'building'
   and not p.tags->'building'='no';

 1550965552 | "name"=>"Freiwillige Feuerwehr Stephanshausen", "amenity"=>"fire_station", "website"=>"http://feuerwehr-stephanshausen.de"
  452550527 | "ref"=>"Ndh 1", "name"=>"Freiwillige Feuerwehr Engenhahn", "access"=>"private", "amenity"=>"fire_station", "operator"=>"Gemeinde Niedernhausen", "addr:city"=>"Niedernhausen", "addr:street"=>"Talstraße", "addr:postcode"=>"65527", "addr:housename"=>"Feuerwehrgerätehaus", "addr:housenumber"=>"23"
 1477949819 | "name"=>"Freiwillige Feuerwehr Presberg", "amenity"=>"fire_station"
 1402413510 | "name"=>"Freiw. Feuerwehr Mittelheim", "amenity"=>"fire_station"
  885700526 | "amenity"=>"fire_station"
 4297069284 | "amenity"=>"fire_station"
 3048724513 | "name"=>"Freiwillige Feuerwehr Dickschied", "amenity"=>"fire_station"
  704498759 | "name"=>"Freiwillige Feuerwehr Schlangenbad", "amenity"=>"fire_station", "contact:phone"=>"+49 6129 488788", "contact:website"=>"http://www.feuerwehr-schlangenbad.de/"
 2271400457 | "name"=>"Freiwillige Feuerwehr Born", "amenity"=>"fire_station"
 3812535181 | "name"=>"Freiwillige Feuerwehr Oberauroff", "amenity"=>"fire_station", "addr:street"=>"Am Dorfbrunnen", "addr:housenumber"=>"18"
 1659052899 | "name"=>"Freiwillige Feuerwehr Niederauroff", "amenity"=>"fire_station", "addr:street"=>"Brunnenstraße", "addr:housenumber"=>"10"
 1578306173 | "name"=>"Feuerwehr Königshofen", "amenity"=>"fire_station"
  453336627 | "name"=>"Freiwillige Feuerwehr Niedernhausen", "amenity"=>"fire_station"
 4162584758 | "name"=>"Feuerwehrgerätehaus Wüstems", "amenity"=>"fire_station"
 1712665079 | "name"=>"Freiwillige Feuerwehr Reichenbach", "amenity"=>"fire_station"
 5407249245 | "name"=>"Freiwillige Feuerwehr Heidenrod-Zorn", "amenity"=>"fire_station", "website"=>"http://www.feuerwehr-zorn.de", "addr:city"=>"Heidenrod", "addr:street"=>"Algenrother Straße", "addr:suburb"=>"Zorn", "addr:country"=>"DE", "addr:postcode"=>"65321", "addr:housenumber"=>"22"
 1645593101 | "amenity"=>"fire_station"
  345694737 | "name"=>"Freiwillige Feuerwehr Wörsdorf", "amenity"=>"fire_station"
  794783858 | "ref"=>"Ndh 5", "name"=>"Feuerwehrgerätehaus", "amenity"=>"fire_station", "operator"=>"Freiwillige Feuerwehr Oberjosbach", "addr:city"=>"Niedernhausen", "addr:street"=>"Wiesenstraße", "addr:suburb"=>"Oberjosbach", "addr:postcode"=>"65527", "addr:housename"=>"Wache 5", "addr:housenumber"=>"3a"
 1508428914 | "name"=>"Freiwilligen Feuerwehr Assmannshausen", "amenity"=>"fire_station", "addr:city"=>"Rüdesheim am Rhein", "addr:street"=>"Rheinallee", "addr:suburb"=>"Assmannshausen", "addr:country"=>"DE", "addr:postcode"=>"65385", "addr:housenumber"=>"3"
(20 Zeilen)

62746 ist die Relation für den Rheingau-Taunus-Kreis.

Hier mal der erste Treffer:

NRW läßt sich relativ einfach und auch in erträglicher Zeit in eine temporäre DB laden.

Gruss
walter

Hallo,

ich muss dieses Thema nochmal aufgreifen. Die Overpass-Turbo Abfrage war leider nicht ganz gut, da sie keine Objekte zurückgab, bei denen der Node so innerhalb des Gebäudes liegt, dass Objetke größer als die 10 Meter waren nicht ausgewählt wurden.

Wie kann ich also diesen Code

  node["amenity"="police"](area.searchArea);
  way(around:10)[building];

ändern, dass nicht around:10 abgefragt wird, sondern die Gebäude zurückgegeben werden, die innerhalb ihrer Grenzen ein Node amenity:fire_station haben?

Kurz: leider gar nicht.

Overpass in seiner aktuellen Fassung kann leider kein spatial contains/is_in*, wie es postgis könnte, deshalb eben der kleine Workaround mit dem around (den du natürlich auf 20, 50 oder was auch immer erweitern könntest).

Da wirst du wohl um ein PostGIS nicht drumherum kommen.

  • es gibt zwar ein is_in, aber das ist nicht das was du willst :wink:

Danke für die Antwort. Bin leider kein PostgreSQL-Experte. Ich habe es mal installiert, eine Datenbank erstellt und mit Osm2pgsql (erfolgreich) gefüttert (NRW). Wenn ich die Abfrage ausführen will, kommt folgender Fehler

ERROR:  FEHLER:  Spalte n.tags existiert nicht
LINE 1: select n.osm_id,wno_striptags(n.tags)

Ist das jetzt ein Fehler aufgrund von falsches Bezeichnung? Oder macht das wenig Sinn das jetzt ohne Kenntnisse selbst durchzuführen?

Ja (da es sich bei wno_striptags um ein wambacher eigene selbst erstellte Funktion handelt, die du genauso wenig wie ich haben wirst), und ohne dir zu nahe treten zu wollen, ja, außer du liest dich ein, z.B. ST_Contains … ach und ja, du hast hoffentlich beim (osm2pgsql) import “–hstore” mit angegeben? Ansonsten wird das, soviel ich mich jetzt erinnere, mit der Spalte tags eher nichts.

Nachtrag: ansonsten aber, wenn du wno_striptags weglässt, und mit hstore importiert hast, müsste die Abfrage eigentlich doch grundsätzlich auch bei jedem anderen laufen.

aber vielleicht funktioniert bei dir folgendes auf anhieb:


select n.osm_id as node, p.osm_id as building
from planet_osm_point n, 
   planet_osm_polygon p
where st_contains(p.way,n.way)
   and n.amenity='fire_station'
   and p.building is not null;

das liefert dir alle amenity=fire_station nodes, welche sich in einem building befinden

PS: da du ja nur nrw importiert hast, habe ich die abfrage vereinfacht und z.B. die Abfrage auf die Relation von NRW weggelassen.
Ich habe diese Abfrage für Thüringen getestet, habe plausible 210 Ergebnisse innerhalb von ein paar Sekunden bekommen.

Ich bin begeistert! Es hat sogar geklappt. Wenn du mal nach Mannheim kommst, kannst du dich auf ein Bier einladen lassen :wink:

Ich danke vielmals für die Mühe!

wno_striptags() hast du nicht. ist was von mir. da du das nicht brauchst nimm nur n.tags.

ob DAS aber richtig ist, kann ich nicht sagen, da ich nicht weiss, wie du importiert hast.

Gruss
walter

Es gab zwischenzeitlich mal einen Prototyp, der aber nicht gut genug war: https://github.com/drolbr/Overpass-API/issues/77

In der nächsten Version wird da wohl nichts in diese Richtung enthalten sein, vielleicht in der übernächsten.