Zoeken binnen een grens

Dag Anton,

Ik gebruik Django (python) in combinatie met Leaflet om bijvoorbeeld een adres op te zoeken in een plaats.

export default {
	class: L.Class.extend({
		options: {
			//serviceUrl: '//geodata.nationaalgeoregister.nl/locatieserver/v3',
			suggestQueryParams: {'fq': 'type:adres', 'limit': 15, 'format': 'json'},
		},
		initialize: function(options) {
			L.Util.setOptions(this, options);
		},
		suggest: function(query, cb, context) {
			query = query + ' AND woonplaatscode:"' + this.options.woonplaatscode + '"';
			getJSON(
				this.options.serviceUrl + 'suggest',
				L.extend({q: query}, this.options.suggestQueryParams),
				L.bind(function(response) {
					var response = response.response;
					if (response.numFound > 0) {
						var suggestions = [],
							docs = response.docs,
							i = 0;
						for (var i = docs.length - 1; i >= 0; i--) {
							suggestions[i] = {
								id: docs[i].id,
								name: docs[i].weergavenaam
							};
						}
					} else {
						suggestions  = null;
					}
					cb.call(context, suggestions);
				}, this)
			);
		},

Dit is dan de query waarbij de woonplaatcode in een eerder stadium is toegekend.
query = query + ’ AND woonplaatscode:"’ + this.options.woonplaatscode + ‘"’;

In plaats daarvan zoek ik nu naar een mogelijkheid om i.p.v. woonplaatscode een gebied mee te geven waarbinnen het adres moet liggen. In de praktijk wordt het adres een hectometerpaaltje.

In feite dus een polygoon aan een URL meegeven zodat de webservice daar binnen zoekt.

In de documentatie van de locatieserver kan ik zo’n mogelijkheid niet vinden. Je kunt alleen een gemeente, woonplaats, weg, adres, postcode meegeven.

Wat je zou kunnen doen is een centroid bepalen van de opgegeven polygoon en dan met de suggest gaan zoeken op de daarbij behorende woonplaats of gemeente (is ruimer). En dat resultaat kun je weer gebruiken om het hectometerpaaltje te vinden.

Tot nu toe ben ik het volgende tegengekomen maar de syntax is niet helemaal goed:

fq=centroide_ll: {“within”: {“type”: “Polygon”, “coordinates”: [ [ [ 5.995, 51.186], [ 5.999, 51.186], [ 5.999, 51.189], [ 5.995, 51.189], [ 5.995, 51.186] ] ] } } }

Een centroide_ll is altijd een POINT, geen Polygon.

Voor zover ik zie is een centroide_ll een veld dat je terugkrijgt, niet om zelf mee te geven. Je kunt wel een lat en lon meegeven in de url die vervolgens wordt gebruikt voor de sortering op afstand van de gevonden rijen.

De locatieserver is ook alleen een tekst search engine en geen geometrie search engine. Dus daar moet je niet de oplossing voor je huidige vraagstuk zoeken.

Denk dat je beter naar de WFS van de NWB kan kijken:
https://www.pdok.nl/geo-services/-/article/nationaal-wegen-bestand-nwb-#661f5b4ae13e0e859f3d6226bda95325

Dank je voor de info.
Jammer genoeg vind ik helemaal niks over het filteren.
Ik krijg wel een hoop paaltje boven water met https://geodata.nationaalgeoregister.nl/locatieserver/v3/free?fq=type:hectometerpaal, maar filteren ho maar…

zie: Zoeken op bounding box - LocatieServer - Geoforum

@marco_duiker,
Dit begint inderdaad iets op te leveren:

https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?fq=type:hectometerpaal&q=centroide_ll:[53,6%20TO%2053.1,6.1]

Dag Robin,

Als het alleen een ‘text search engine’ is hoe kan het dan dat je wel een bounding box kunt meegeven?

Zoals:
https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?fq=type:hectometerpaal&q=centroide_ll:[53,6%20TO%2053.1,6.1]

was misschien iets te kort door de bocht. De locatieserver is in principe bedoeld voor het zoeken van objecten met een tekst-query, en niet een geo-query. Dat je ook kan zoeken met een boundingbox is een ongedocumenteerd “feature” van de locatieserver.

En in de vorige versie is er ook zo’n feature voor een polygon.
Waarom is die eruit gehaald als ik vragen mag?

@robbedoes wat bedoel je met

Bedoel je dan de /v2 van de locatieserver?

Zelf schreef je het volgende hierover:

de huidige BAG V1 API ondersteunt zoeken met een polygon en kan nog gebruikt worden tot oktober dit jaar.

Wie ik? In welk topic?

Maar de BAG V1 API != locatieserver, dit zijn 2 verschillende producten van 2 verschillende diensten.

Hiero:

Ik ben @wouter.visscher, niet @RobinTopper :smiley:

Sorry, niet goed opgelet.

Bij deze wat achtergrond om te duiden waarom de dingen zijn zoals ze zijn. De locatieserver maakt gebruik van Lucene, een full text search engine. De boundingbox search werkt omdat Lucene van elke geometrie de centroïde coördinaten indexeert. Daar kan dan een RANGE query op gedaan worden.

Bij zo een RANGE query checkt de locatieserver/Lucene checkt of er objecten zijn waarvan X valt tussen 53 en 53.1 en Y tussen 6 en 6.1. Dit is effectief wel een ruimtelijke query, maar met “full text search”-achtige middelen. Verder zijn de mogelijkheden tot ruimtelijk zoeken beperkt in de locatieserver, het is immers gericht op full text search. Overigens heeft de locatieserver ook een reverse geocoder, maar die ondersteunt volgens documentatie alleen zoeken rond punten:

Deze service is bedoeld om vanaf een punt de dichtsbijzijnde objecten te vinden.

Een WFS is expliciet wel bedoeld voor dit soort vraagstukken. Zie hier een voorbeeld van een WFS POST request met een query om binnen een polygon te zoeken. Dat lijkt me een kansrijke mogelijkheid in combinatie met het advies van @RobinTopper:

3 likes

Dit topic is 180 dagen na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan.