Fragen zu overpass CSV output mode

Hallo,
der overpass CSV output mode ist eine feine Sache,
was ich bisher nicht verstehe:

  1. Special field name
    https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#List_of_field_names
    Muss der/müssen die (z.B. ::id ) immer ganz vorne in der Zeile stehen ?

  2. Kann man dem output einen eigenen Text zuordnen, z.B vor Special field name ::id immer ein “https://www.openstreetmap.org/node/” ?

fragende Grüße
Jo

Also ich hatte mich kürtlich auch mit diesem Thema beschäftigt.

Meine Abfrage:

[out:csv(::type,::id,"WDPA_ID:ref",protection_title,short_protection_title,name,operator,leisure,start_date,wikidata,::user)][timeout:45];
{{geocodeArea:Brandenburg}}->.searchArea;
(
 
  way["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
  relation["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
);
  out meta;

Liefert eine Liste aller in Brandenburg erfassten Schutzgebiete mit protect_class=4 als csv.

Man sieht z.B., das ::id nicht immer ganz vorn stehen muß. Ein anderer, von mir verwendeter Wert (::user) steht z.B. am Ende.

Was für mich interessant wäre…
Ich habe in der ersten Zeile die Felder in der Reihenfolge angegeben, die ich möchte. Gibt es ein Kürzel, mit dem ist dagen kann "zeige mir alle erfassten Schlüssel-Wert-Kombinationen an, die bei Flächen und Relationen mit protect_class=4 gefunden werden.

Sven

  1. Stimmt! hatte bei meinen Tests wohl ein Komma oder sonstwas vergessen.

Was deine Frage anbelangt, verstehe ich dein Problem nicht so recht, über das “Daten”-Fenster einer normalen overpass-Abfrage hat Du doch alle Key-Values und dementsprechend kannst Du deine out:csv-Zeile nach Lust und Laune erweitern…

Ich würde halt gern einen Link aus der ::id generieren …

Na ich würde gerne wissen, was neben den genannten Feldern noch so erfasst sein könnte, also alle Schlüssel-Wert-Kombinationen.

Sven

  1. “::id” muss nicht vorne stehen
  2. Ja, ich poste gleich mal was

[out:csv(link,::id;false;"")];
node
  [amenity=drinking_water]
  ({{bbox}});

convert bla ::id = id(),
            link = "https://www.openstreetmap.org/node/";

out;

Dafür gibt’s folgendes Issue: https://github.com/drolbr/Overpass-API/issues/296

Kannst Du grob erklären, was da passiert, speziell

convert bla ::id = id(),

verstehe ich nicht, was es tut und wozu man das benötigt, die id steht doch schon oben (::id)?

Klar. Das convert jubelt jedem Knoten noch ein zusätzliches Tag “link” zu, damit man den per CSV auch ausgeben kann.

Am besten sieht man das ohne CSV-Ausgabe:


  <bla id="348734973">
    <tag k="link" v="https://www.openstreetmap.org/node/"/>
  </bla>
  <bla id="348773400">
    <tag k="link" v="https://www.openstreetmap.org/node/"/>
  </bla>
  <bla id="457404945">
    <tag k="link" v="https://www.openstreetmap.org/node/"/>
  </bla>

Im CSV-Header wird dann “link” und die ::id ohne Trennzeichen ausgegeben, damit entsteht dann der Link.

@mmd, danke, aber, ich kriege damit zwar Links hin, aber auch nur Links, s.
http://overpass-turbo.eu/s/Htu
Alles andere scheint mir unter den Tisch zu fallen, mein Ziel ist aber eigentlich ein Link innerhalb anderer Spalten, also hier vor/bei ::id
http://overpass-turbo.eu/s/Htr

Ok, das war nicht so ganz ersichtlich aus der Frage.


// Beispiel Baumliste

[out:csv(ref,::id,_link,"species:de",circumference;true;"\t")];

{{geocodeArea:"Bergpark Wilhelmshöhe"}}->.searchArea;

node["natural"="tree"]["circumference"]["ref"](area.searchArea); 

foreach {
  
  convert bla 
          ::id = id(),
          ::  = ::,
          _link = "https://www.openstreetmap.org/node/" + id(); 

  out;
}

Aha… Danke.

[Edit] ein “::type” liefert den Geometrietyp, Wie kann das in die Abfrage eingebaut werden, so daß als Link

_link = “https://www.openstreetmap.org/” + Geometrietyp + ID bei rauskommt?

meine Q&D-Idee klappt nicht:

[out:csv(::type,::id,_link,"WDPA_ID:ref",protection_title,short_protection_title,name,operator,leisure,::user)][timeout:45];
{{geocodeArea:Brandenburg}}->.searchArea;
(
 
  way["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
  relation["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
);
foreach {
  
  convert bla 
          ::id = id(),
  		  ::type = type(),
          ::  = ::,
          _link = "https://www.openstreetmap.org/" + type() + id(); 

  out;
}

Sven

Danke. Habs halbwegs verstanden.

Den ::type kann man nicht für erzeugte Objekte setzen, deshalb verwende ich einfach “type”: https://overpass-turbo.eu/s/HtC

@mmd: Super!

So wie ich das sehe schafft es dein script auch zusätzlich Zeichen hinter die ::id zu setzen, also z.B. sowas funktioniert:

_link = "https://www.openstreetmap.org/node/" + id() + "test"; 

Das ist für mich interessant, weil ich meine id-Links gern (z.B. in eine Wiki-Vorlage) einpacken würde, wie die von OSM: {{Node|1234567890|tools=no}}

_link = "{{Node|" + id() + "|tools=no}}"; 

funktioniert allerdings nicht - wegen Sonderzeichen?

probiere mal:

_link = "{"+"{" + type() + "|" + id() + "|tools=no" + "}" +"}"; 

da kommt bei mir


{{way|154096377|tools=no}}
{{relation|5873810|tools=no}}

jenachdem welcher Typ gefunden wird.

https://overpass-turbo.eu/s/Hu5

Sven

Es könnte sein, dass overpass turbo da querschießt und versucht alles zwischen {{ und }} zu ersetzen.

@streckenkundler: Stimmt, wenn man den String aufteilt dann gehts, bereits die Trennung der einführenden Doppelklammer scheint bei mir zu reichen:

_link = "{" + "{Node|" + id() + "|tools=no}}";

(::type brauche ich gerade nicht, ist in dem Zusammenhang aber natürlich gut zu wissen …)

Damit bin ich weitergekommen,
Danke in die Runde!

Jo

Ja, den Eindruck hatte bei meinem Test…

Letztendlich kann die Verwendung von ::type dann auch als Fehlerprüfung gesehen werden, falls mal ein Objekt dabei ist, daß nicht explizit (in deinem Beispiel) als node erfasst wäre…

Das, was ich in dem Zusammenhang gelernt habe: immer overpass den Objekttyp (node, way relation) ermitteln lassen…

…und schaden würde die Verwendung für dein Beispiel sicher auch nicht… :slight_smile:

Sven,

…der sich auch für das Gelernte bedankt…

Probiere für eine Statistik mal bitte


[out:csv(cnt_nd,cnt_wy,cnt_rel,key,value)];
{{geocodeArea:Brandenburg}}->.searchArea;
(
 
  way["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
  relation["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
);
for->.i (keys())
{
  for.i->.j(t[i.val])
  {
    make stat cnt_nd=count(nodes),cnt_wy=j.count(ways),cnt_rel=j.count(relations),key=i.val,value=j.val;
    out;
  }
}

und wenn das zu unübersichtlich ist die Zusammenfassung per Key durch


[out:csv(cnt_nd,cnt_wy,cnt_rel,key,value)];
{{geocodeArea:Brandenburg}}->.searchArea;
(
 
  way["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
  relation["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
);
for(keys())
{
  make stat cnt_nd=count(nodes),cnt_wy=count(ways),cnt_rel=count(relations),key=_.val,value=set("{"+t[_.val]+"}");
  out;
}

Der jeweils untere For-Block passt hinter so ziemlich jede Abfrage anstelle des out. Das ist auch der Grund, Nodes mitzuzählen, obwohl deren Anzahl in diesem Fall immer 0 ist.

Danke,

das hilft schon mal gut weiter…

Sven

Hallo zusammen,

ich hole das Thema noch mal hoch, weil sich bei mir eine neue Unklarheit ergibt…

out:csv(type,::id,_link,"ref:WDPA",protection_title,protect_class,short_protection_title,name,operator,leisure,::user)][timeout:45];
{{geocodeArea:Brandenburg}}->.searchArea;
(
  node["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
  way["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
  relation["boundary"="protected_area"]["protect_class"="4"]["name"](area.searchArea);
);
foreach {
  
  convert bla
    "ref:WDPA" = WDPA(),
	_link = "https://www.protectedplanet.net/" + WDPA();
  out meta;
}

Ich möchte im Feld “_link” zusammengesetzt haben: https://www.protectedplanet.net/ und die Nummer, die im Feld ref:WDPA steht.

Das Statement "ref:WDPA" = WDPA(), funktiniert aber nicht, sicher wegen dem Dooppelpunkt? Ich hab auch schon andere Zeichen probiert.

Hat da jemand Ideen?

Sven