Whisky-Destillerien

Mittlerweile habe ich einige Whisky-Destillerien in Schottland geprüft.
Diese sind mit

craft=distillery
distillery=whisky

getagt.

Mit dieser

node   [craft=distillery][distillery=whisky]   ({{bbox}}); out;
way   [craft=distillery] [distillery=whisky]   ({{bbox}}); (._;>;); out;

Overpass-Turbo-Abfrage http://overpass-turbo.eu/ bekommt man alle momentan erfassten Whisky-Destillerien.
Den Kartenausschnitt groß genug wählen, sonst könnte das Ergebnis leer sein.

Da fehlen noch einige …

brand=* zusätzlich bitte, damit man weiß, worauf man sich einlässt, wenn man auf eine Probe vorbei schaut :wink:

Da scheint noch eine riesige Lücke in OSM zu sein:
Lt. http://taginfo.openstreetmap.org/tags/craft=distillery#overview gibt es WW nur
312 Elemente mit craft=distillery.

Eine erste Version der Karte steht nun unter http://ra-loschnig.de/whisky/whiskymap.php zur Verfügung.

Ich habe diese auf einem Beispiel von http://labs.easyblog.it/maps/leaflet-layerjson/examples/overpass.html erstellt.
Der Kampf mit (oder besser) gegen Leaflet ist allerdings ganz schön zermürbend. Irgendwie fehlt mir da etwas das Verständnis, wie die Erstellung von Webseiten heutzutage funktioniert.

Wer Verbesserungsvorschläge hat: Immer her damit. Ich werde dann versuchen, diese noch umzusetzen.

Die Einträge destillery=whisky (die ich gefiltert habe) sind noch wesentlich rarer gestreut.

Wer also noch Whsiky-Destillerien (insbesondere in Deutschland) kennt, kann mithelfen, diese Karte zu erweitern.

Und schon tauchen die ersten Probleme aus:
Ich frage die Daten ab mit

http://overpass-api.de/api/interpreter?data=[out:json];%28node[distillery=whisky];way[distillery=whisky];);out;

Diese Abfrage liefert sauber alle gewünschten Daten zurück.
Allerdings funktioniert nur die Umsetzung von Nodes in Marker.
Bei den Ways scheitert es wahrscheinlich daran, dass diese kein lat/lon-Angabe haben.
So sehen die Daten aus (Auszug)

  <node id="4192397662" lat="48.5881182" lon="9.4474118">
    <tag k="craft" v="distillery"/>
    <tag k="distillery" v="whisky"/>
    <tag k="name" v="Brennerei Gruel"/>
  </node>
  <way id="70536543">
    <nd ref="841789255"/>
    <nd ref="841789256"/>
    <nd ref="841789257"/>
    <nd ref="841789259"/>
    <nd ref="848732369"/>
    <nd ref="841789260"/>
    <nd ref="841789261"/>
    <nd ref="841789262"/>
    <nd ref="841789263"/>
    <nd ref="841789264"/>
    <nd ref="841789265"/>
    <nd ref="841789266"/>
    <nd ref="841789267"/>
    <nd ref="841789269"/>
    <nd ref="848732370"/>
    <nd ref="841789270"/>
    <nd ref="841789271"/>
    <nd ref="841789249"/>
    <nd ref="848732187"/>
    <nd ref="848732279"/>
    <nd ref="841789250"/>
    <nd ref="848732656"/>
    <nd ref="769898755"/>
    <nd ref="841789255"/>
    <tag k="craft" v="distillery"/>
    <tag k="distillery" v="whisky"/>
    <tag k="landuse" v="industrial"/>
    <tag k="name" v="Linkwood Distillery"/>
  </way>

Was kann/muss ich denn da tun, um auch die auf die Karte zu bekommen ?

Hi,
Nodes sind ja auch einzelne Punkte, Hingegen ist dein Bsp. ein Poygon.
Du hast da jetzt 2 Möglichkeiten je nachdem was du machen willst:

  1. Fläche anzeigen:
    Dann musst du einerseits die Punktdaten mit Overpass auch noch abfragen und dann in Leaflet mit diesen Daten ein Polygon erstellen und anzeigen lassen.

  2. Marker anzeigen:
    Auch hier musst du zusätzlich die Punkte von Overpass laden und dir dann aus diesen Daten den Mittelpunkt des Polygons ausrechnen. Diesen Punkt kannst du dann mittels Marker anzeigen.
    Siehe auch : http://stackoverflow.com/questions/22796520/finding-the-center-of-leaflet-polygon

LG Tom

[EDIT]: Gerade in selbigem Artikel gefunden: Leaflet hat offensichtlich auch eine Funktion dafür (polygon.getBounds().getCenter():wink:

Overpass auch:
out center

Spart den Umweg. :wink:

Du solltest die Abfrage modifizieren:

http://overpass-api.de/api/interpreter?data=[out:json];%28node[distillery~whisky];way[distillery~whisky];);out;

damit auch solche gefunden werden:
https://www.openstreetmap.org/node/4193588052

Nachtrag: siehe auch http://www.deutsche-whiskys.de/ab—axel-baszler-1.html/

Deine Karte sieht sehr unvollständig aus im Vergleich zu:
http://overpass-turbo.eu/s/gio

Danke. Habe ich geändert und auch diese Brennerei wird jetzt gefunden.

Die Übersicht der deutschen Whiskys http://www.deutsche-whiskys.de ist mir zwar wohlbekannt. Aber ich habe keinen Hinweis darauf gefunden, dass wir die Daten nutzen dürfen.
Übrigens fehlt dort mindestens die Brennerei in Nürnberg (in der Brauerei Altstadthof http://www.hausbrauerei-altstadthof.de/brennerei.html#ad-image-0 )

Jetzt muss ich nur noch die Wege und Relationen mit in die Karte einbringen.
Die genannte Overpass-Funktion habe ich leider noch nicht an’s Laufen gebracht.

So, den nächsten Schritt habe ich auch geschafft.
Nun stehen in den Daten auch die “center”-Koordinaten.
Allerdings muss ich jetzt die Ausgabe von Overpass noch nacharbeiten, da die lat/lon-Angaben unterhalb von “center” stehen.
Die Ausgabe ist

  "id": 24148792,
  "center": {
    "lat": 55.9396491,
    "lon": -3.2349188
  },
  "nodes": [ 

und das muss ich (unter LInux) umwandeln zu

  "id": 24148792,
 
    "lat": 55.9396491,
    "lon": -3.2349188
 
  "nodes": [ 

(also den “center”: { und den zugehörigen }, löschen)
jetzt könnte grep wieder mein Freund werden.
Aber trotz Suche habe ich noch nicht die passende Lösung gefunden.

Wie wär’s mit CSV-Ausgabe? Dürfte einfacher zu parsen sein auf der Kommandozeile.


[out:csv(::id, ::type, ::lat, ::lon, name)][timeout:25];
(
  node["craft"="distillery"]["distillery"~"whisky"];
  way["craft"="distillery"]["distillery"~"whisky"];
  relation["craft"="distillery"];
);
out center;

http://overpass-turbo.eu/s/giw

Die Möglichkeit der csv-Ausgabe kannte ich bislang noch nicht. Danke für die Info. Diese Ausgabe ist auf jeden Fall wesentlich kompakter, da gibt es einen Faktor 30 in der Datenmenge.

Ich habe jedoch beschlossen, die json-Daten zu nutzen. Die genannten Probleme sind gelöst. Die Daten werden jede Stunde per Cronjob über das Overpass-API gelesen und aufbereitet. Das Resultat kann auf der Whisky-Karte http://ra-loschnig.de/whisky/whiskymap.php angesehen werden.

Viele Whisky-Brennereien sind bereits in OSM erfasst und es muss nur noch das Tag distillery=whisky erfasst werden.
Über Hilfe beim Erfassen würde ich mich freuen. Eine Info über die Brennereien bietet z.B. Wikipedia (meistens sogar mit Geolink).

Sieht jetzt richtig gut aus. Hilfreich wäre noch, wenn im Pop-up die Web-Seite der Distillery angezeigt würde.

Moin,

Bei den ‘gemischten’ Brennereien sollte man aber die anderen Erzeugnisse dabei nicht unter den Tisch fallen lassen,
also nicht mal so einfach nur distillery=whisky erfassen, weil da auch Whisky gebrannt wird.

Grüße, Georg

Etwas mühselig, sich da durch zu arbeiten.
Aber bei distilleries mit Webseite kriegt man meist heraus, was sie brennen:


// search for distilleries w/o type of brand, 
// but w/ website  to check this
[timeout:25];
(
  node["craft"="distillery"]["distillery"!~"."]["website"~"."];
  way["craft"="distillery"]["distillery"!~"."]["website"~"."];
  );
out body;
>;
out meta;

Es sind gerade noch 26 ways und 46 POIs.

Beides habe ich jetzt in’s Pop-Up mit eingebracht.

Allerdings mit einem kleinen Schönheitsfehler: Wenn der Eintrag bei Brand bzw. Website leer ist, bekomme ich den Wert “undefined” angezeigt / ausgegeben.
Meine Versuche, den bei der Zusammenstellung mit

link = data.tags.website;
if (link == 'undefined') {link = ""};

zu packen klappt leider nicht. Auf welchen Wert muss ich denn überprüfen ?

In deinem JSON gibt es Objekte, die keine “tags” haben. Das musst du zuerst abprüfen.
Dann gibt es “tags”, die nicht alle Variablen definiert haben, auch das mußt du prüfen. Probier mal meine Version, ist so aus dem Kopf raus und ungetestet.

 
buildpopup: function (data, marker) {

  // erstmal alles leer vorbelegen
  var link = brand = distillery = name = ownDescription = "";

  // prüfen, ob überhaupt tags vorhanden sind
  if (data.tags){
    if (data.tags.name) {
      ownDescription += "<b>" + data.tags.name + "</b>";
    };  
    if (data.tags.brand) {
      ownDescription += "<br>Brands:" + data.tags.brand; 
    };
    if (data.tags.distillery) {
      ownDescription += "<br>Products: " + data.tags.distillery ; 
    };

    if (data.tags.website) {
      link = data.tags.website;
    } else {
      if (data.tags.url) {
        link = data.tags.url;
      }
    }
    if (link != ""){
      ownDescription += '<br>Website: <a href="' + link + '">' + link + '</a>';
    }
    return ownDescription;
  } else {
    return NULL;
  }
}

Edit:
Grundsätzlich ist dein Check auf Existenz einer Variablen falsch, statt

if (link == ‘undefined’) {link = “”};

muß es heissen

if (typeof link == ‘undefined’) {link = “”};

Du hast da noch ein kleines Problem, das Layercontrol wird nicht angezeigt und Leaflet schmeisst einen JS-Fehler.

So auf Zeile 83 rum hast du ein

var distilleries = L.layerGroup(L.layerJSON);

und in Zeile 52 erzeugst du den JSON-Layer. Kommentiere Zeile 83 aus und definiere deinen Layer gleich so:


var distilleries = L.layerJSON({
  // {lat1},{lon1},{lat2},{lon2}
  url: 'overpass_n.json',
  propertyItems: 'elements',
   ...

Wenn das die Leaflet-Extension https://github.com/stefanocudini/leaflet-layerJSON ist, ist das schon eine FeatureGroup, die kannst du direkt verwenden und musst sie nicht nochmal in eine LayerGroup packen.

@dooley: Danke für die beiden Hinweise. Damit ist jetzt das “undefined” im Pop-Up weg.
Allerdings habe ich trotz des zweiten Hinweis noch nicht das erwartete Layercontrol.

Zusätzlich habe ich noch den Link zu Wikipedia ergänzt (sofern vorhanden).