Fragen zu overpass CSV output mode

  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

Zum einen hast du in der ersten Zeile ein “[” vor dem out:csv(... vergessen (oder nur falsch hier ins Forum kopiert).

Und das Konvertieren müsste vermutlich so aussehen, da WDPA() kein gültiger/bekannter Operator ist:

  convert bla
    "ref:WDPA" = t["ref:WDPA"],
	_link = "https://www.protectedplanet.net/" + t["ref:WDPA"];
  out meta;

Ahhhhh… Du bist mein Held des Tages…

Ausgangspunkt war

[out:csv(type,::id,_link,"ref:WDPA",protection_title,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 
          ::id = id(),
  		  type = type(),
          ::  = ::,
   _link = "https://www.openstreetmap.org/" + type() + "/" + id();
  out;
}

Das funktioniert auch, Eben auch noch mal getestet. Der Unterschied ist jetzt das t["ref:WDPA"] Ersetze ich das convert-Statement, wird ein ordentlicher Link generiert, der die Doppelpunkt-Keys verarbeitet!

Super… Wie gewünscht! Das wollte ich haben!

Danke,

Sven

Edit: vorläufige Endversion:

[out:csv(type,::id,"ref:WDPA",protection_title,protect_class,short_protection_title,name,operator,leisure,::user,_link,_lnkPrPl)][timeout:45];
{{geocodeArea:Dahme-Spreewald}}->.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
    ::id = id(),
  	type = type(),
    ::  = ::,
    "ref:WDPA" = t["ref:WDPA"],
	_link = "https://www.openstreetmap.org/" + type() + "/" + id(),
    _lnkPrPl = "https://www.protectedplanet.net/" + t["ref:WDPA"];
  out meta;
}

beinhaltet alle gewünschten Felder und einmal Link zum OSM-Objekt und einmal zu ProtectedPlanet… :sunglasses: