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.
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.
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)
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:
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.
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
(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.
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).
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.
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;
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
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).