Overpass-Abfrage: NetworkError: 414 Request-URI Too Large

HI !

ich bastel gerade an einer Karte die Punktdaten per Overpass ziehen soll. Nun habe ich das gerade etwas erweitert und bekomme die Meldung:

Basis bildet der Abfragecode von Netzwolf aus der popupmarker.js und sieht im Aufbau wie folgt aus:

		//------------------------------------------------------------
		keyValues: [
		  {key: 'vending', value:'cigarettes'},
		  {key: 'vending', value:'excrement_bags'},
		  {key: 'vending', value:'condoms'},
		  {key: 'vending', value:'sweets'},
		  {key: 'vending', value:'bicycle_tube'},
		  {key: 'vending', value:'telephone_vouchers'},
		  {key: 'advertising', value:'billboard'},
		  {key: 'advertising', value:'column'},
		  {key: 'emergency', value:'aed'},
		  {key: 'emergency', value:'fire_hydrant'},
		  {key: 'shop', value:'bakery'},
		  {key: 'shop', value:'butcher'},
		  {key: 'medical', value:'aed'},
		  {key: 'traffic_signals:vibration', value:'yes'},
		  {key: 'traffic_signals:vibration', value:'no'},
		  {key: 'amenity', value:'fuel'},
		  {key: 'amenity', value:'fast_food'},
		  {key: 'amenity', value:'restaurant'},
		  {key: 'amenity', value:'pharmacy'},
		  {key: 'amenity', value:'emergency_access_point'},
		  {key: 'amenity', value:'emergency_phone'},
		  {key: 'amenity', value:'veterinary'},
		  {key: 'amenity', value:'waste_basket'},
		  {key: 'amenity', value:'clock'},
		  {key: 'amenity', value:'telephone'},
		  {key: 'amenity', value:'post_office'},
		  {key: 'amenity', value:'recycling'},
		  {key: 'historic', value:'milestone'},
		  {key: 'historic', value:'boundary_stone'},
		  {key: 'tourism', value:'hotel'},
		  {key: 'waste_basket:excrement_bags', value:'yes'},
		  {key: 'wikipedia'},
		  {key: 'image'}
		],

Daraus wird die Abfrage:

Ist da vielleicht schon was verkehrt? gibt es einen Trick vielleicht die Daten in größerem Umfang abzufragen sprich den Aufbau der URL zu verkürzen ???

Gruß Jan :slight_smile:

Wird POST unterstützt? Über GET wird das jedenfalls nichts.

hi !

danke für den Hinweis. Werde mal eine eMail an Netzwolf schreiben.

Gruß Jan :slight_smile:

Hallo Jan

Du fragst jedes Tagg einzeln ab. Das heißt immer eine BBOX, immer die Nodes usw. Das ist ist ausgesprochen ineffektiv.
Besser und kürzer wäre es je Schlüssel eine Abfrage zu machen und die Werte, die dich interessieren als einen regulären Ausdruck anzugeben. Das wäre a) deutlich kompakter und b) deutlich schneller.

PS: Das Ganze als Link zu Overpass-Turbo hätte den Vorteil, dass man direkt sieht, wie du deine Abfrage gestaltet hast.

Edbert (EvanE)

Halo Edbert,

wie ich schon geschrieben habe greife ich auf die Komponente von Netzwolf zurück - jemanden der mir bei OL sehr viel geholfen hat und dem ich einiges zu verdanke haben. Ansonsten wären meine Karten nicht da wo diese heute sind.

Leider hat er mir bei der Anfrage zu dem hier gestellten Problem eine klare Absage der Unterstützung erteilt. Schade zumal ich vermute das auch andere Nutzer dieser JS-Datei irgendwann an Grenzen stoßen werden.

Deinen Hinweis mit der vereinfachung der Abfrage werde ich mir mal ansehen und wenn ich dann weiß wie die effektivere URL aufgebaut sein muss werde ich das einbauen. Damit sollten einiges an Zeichen gespart werden und kann diese für andere Objekte nutzen.

Auf overpass-Turbo hatte Netzwolf noch verwiesen - nicht das diese Antwort untergegangen ist.

Gruß Jan :slight_smile:

Kannst du mal einen Link zur vollständigen Javascript-Datei posten?

Hallo Tel0000,

hier die wesentlichen Links - die Seite wird mit

http://www.tappenbeck.net/osm/maps/deu/mobile2013.php?id=9514

geöffnet und ist (nicht am PC wundern wegen der Navigationsreaktion) für Smarty ausgelegt.

Meine o.g. key-value-Definitionen sind auch in dieser Datei hinterlegt.

Die Datei von Netzwolf ist unter http://www.tappenbeck.net/osm/maps/js/popupmarkers2013.js zu finden und trägt den 2013 zusatz nur aus internen Gründen bei mir.

Ich muss nochmal mich etwas mit der Overpass auseinander setzen und wenn ich weiß wie ich mehrere verschiedene POI in einer Box abfragen kann, wie von Edbert vorgeschlagen (wenn ich ihn richtig verstanden habe) dann muss die Funktion getQueryParams noch auf die optimierte URL angepaßt werden. Ich hoffe, das ich das hinbekomme.

War es das was Du wissen wolltest ?

Gruß Jan :slight_smile:

Ergänzend zu SammysHP und EvanE:

Compact Overpass QL verwenden: http://overpass-api.de/convert_form.html

Versuch mal die OverpassXML-Funktion so umzubauen:


		//------------------------------------------------------------
		//	Baue aus der keyValues eine overpass-Anfrage.
		//------------------------------------------------------------

		overpassXML: function (keyvalues) {

			if (!(keyvalues instanceof Array)) keyvalues = [keyvalues];

			var bbox = this.map.getExtent().
				transform(this.map.getProjectionObject(),this.map.displayProjection);

			var bboxQuery = OpenLayers.String.format (
				'(${bottom},${left},${top},${right})',
				bbox);

			var components = [];
			for (var i in keyvalues) {
				var keyvalue = keyvalues[i];
				var key = keyvalue.key;
				if (!key) continue;
				var value = keyvalue.value;
				var kvlist = [];
				kvlist.push ("[");
				if (key) kvlist.push ('"' + this.html(key) + '"');
				if (value) kvlist.push ('="' + this.html(value) + '"');
				kvlist.push ("]");
				components.push ('node' + bboxQuery + kvlist.join(' ') + ';');
			}

			var xml = '[out:json];(' + components.join('') + ');out;';

			return xml;
		},

Das ist jetzt die selbe Abfrage, nur in Overpass QL.
Hab jetzt nicht getestet obs funktioniert, aber das sollte schonmal deutlich kürzer werden.

Ich hab noch nicht gecheckt an welcher stelle des Codes dann tatsächlich die Abfrage ausgeführt wird. Sonst könnte man das noch zu POST ändern.

Hi !

im Zug hatte ich keine Zeit gefunden weiter in Overpass zu lesen und umso mehr war ich über das Posting von TEL000 erfreut. Ich habe dieses in der PHP-Datei von oben eingebunden

hier nochmal: http://www.tappenbeck.net/osm/maps/deu/mobile2013.php?id=9514

und was soll ich sagen - es hat auf anhieb funktioniert!!!

Testweise habe ich beide Anfragen mal ausgewählt ~8300 gegenüber ~3300 Zeichen. Das würde Platz für so manche Parameter mehr bedeuten.

Wie gesagt - ich bin noch nicht weiter eingestiegen aber. In der OL-Abfrage wird immer die Box und dann das Tag übergeben. Wäre nicht noch eine Vereinfachung möglich ? Erst die Box und dann nur noch die Tags?

Nur mal so eine Idee - aber für mich reicht diese Lösung vorerst alle mal aus.

Vielen Dank für Eure Unterstützung an dieser Stelle.

… falls einer von Euch sich die Karte mal angesehen hat - wie findet Ihr diese? Werde diese in nächster Zeit nochmal mehr vorstellen - derzeit werden Flächen allerdings noch nicht ausgewertet.

Gruß Jan :slight_smile:

Das geht wohl nicht, da alle Bedingungen mit UND verknüpft werden. Verschiedene Values zu einem gemeinsamen Key lassen sich aber sehr wohl zusammenfassen, siehe Beschreibung von EvanE weiter oben.

Weiterhin kann man die bbox als Parameter in der URL übergeben und diese bbox in der Overpass QL mehrfach verwenden ohne jedesmal den konkreten Wert hinzuzufügen.

Beispiel: (ich benutze diesen Ansatz selbst in meiner Karte mit PUT-Requests):

bbox: 6.9334988594057,49.21724463386,7.0237069129945,49.23798395454
data: [timeout:2];node"maxweight"~“.”;out;(way[“maxweight”~“.”]highway~“.”;node(w););out;

=> hier sieht man schön, dass (bbox) mehrfach vorkommt, aber nur einmal als Wert übertragen wird

OpenLayers.Layer.Vector in Verbindung mit einer BBOXStrategy würde das Hinzufügen des bbox-Parameter bspw. schon automatisch erledigen. Wie das mit dem PopupMarker funktioniert, kann ich leider nicht genau beschreiben.

Wie man das schafft, dass die bbox nur einmal angegeben wird habe ich auch noch nicht verstanden.
In meiner Karte wird für jeden Tag drei Mal die bbox angegeben, weil ich nodes, ways und relations abrufe.

Hier mal eine Beispiel-URL: Overpass API macht einfach ein Suchen-Ersetzen von “(bbox)” mit dem Wert, der im Parameter bbox angegeben wurde.


http://www.overpass-api.de/api/interpreter?data=[out:json][timeout:2];node[maxheight~%22.%22][waterway!~%22.%22][%22waterway:sign%22!~%22.%22][%22seamark:type%22!~%22.%22][%22obstacle%22!~%22bridge%22]%28bbox%29;out;node[%22maxheight:physical%22~%22.%22][waterway!~%22.%22][%22waterway:sign%22!~%22.%22][%22seamark:type%22!~%22.%22][%22obstacle%22!~%22bridge%22]%28bbox%29;out;%28way[maxheight~%22.%22][highway~%22.%22]%28bbox%29;node%28w%29;%29;out;%28way[%22maxheight:physical%22~%22.%22][highway~%22.%22]%28bbox%29;node%28w%29;%29;out;&bbox=6.9148115921021,49.216068088947,7.0451884078979,49.257931139089

Genau das hatte ich auch probiert nachdem ich deinen Post gelesen hatte. Allerdings ohne Erfolg. Ich habe immer ein leeres Ergebnis zurückbekommen.

Jetzt wo ich mich überzeugen konnte, dass dein Query funktioniert, hab ich mir das mal genauer angesehen. Und jetzt weiß ich auch warum mein Versuch nicht funktioniert hat.
In deinem Query sind Lat und Lon vertauscht. Jetzt funktionierts auch bei mir. Danke für den Tipp.

Offensichtlich ist es nicht einfach ein Suchen-Ersetzen …

Oh, da hast Du natürlich recht. Das hat man davon, wenn man BBOXStrategy die ganze Arbeit machen lässt :slight_smile:

Moin !

ich wollte nun einmal die noch weiter reduzierte Query in die generierende Funktion aufnehmen - komme aber nicht ganz weiter.

Meine nun generiert Query sieht wie folgt aus:

Ist das richtig - so kann ich diese ja wohl nicht direkt in die Overpass-URL aufnehmen.

Sollte diese dennoch richtig sein, dann würde mich wundern das bei der URL eine unzulässiger Request angemerkt wird:

Der Funktionsteil, der den Request durchführt ist nicht “angefaßt” worden !

Kann einer mal einen Blick auf die query riskieren?

Gruß Jan :slight_smile:

Die bbox sollte nicht als Teil des Query behandelt werden, sondern als Teil der URL.

Der richtige Request müsste dann so aussehen:
http://overpass-api.de/api/interpreter?jsonp=window.callbacks.JSONP1&data=%5Bout%3Ajson%5D%3Bnode%5B%22vending%22%3D%22cigarettes%22%5D%5B%22advertising%22%3D%22billboard%22%5D%5B%22advertising%22%3D%22column%22%5D%5B%22shop%22%5D%5B%22image%22%5D(bbox)%3Bout%3B&bbox=10.656103544922093,53.86846894559171,10.66983645507753,53.8704110318656