SPARQL Query om bedrijventerreinen data op te halen werkt niet meer

Hi allen,

De query die hieronder volgt is tot nu toe gebruikt om data over bedrijventerreinen op te halen. Er wordt een polygoon als input gegeven om vervolgens zaken zoals postcode en huisnummer van verschillende verblijfsobjecten op te halen.

PREFIX dcat: <http://www.w3.org/ns/dcat#>
PREFIX bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX begrip: <http://bag.basisregistraties.overheid.nl/id/begrip/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ogc: <http://www.opengis.net/ont/geosparql#>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?label ?status ?wkt ?typeLabel ?straat ?huisnummer ?postcode ?woonplaats ?begin ?eind ?oppervlakte ?id
WHERE {
graph ?vboVoorkomen {
    # ?vbo is een verblijfsobject met geometrie ?geo
    ?vbo a bag:Verblijfsobject ; 
         ogc:hasGeometry ?geo .
	# zoek geometrie van de gebruiker intersects met de geometrie van het verblijfsobject:
    #?geo ogc:sfIntersects "POLYGON((4.861791 52.335380, 4.868483 52.335407, 4.868955 52.332312, 4.861083 52.331984, 4.861791 52.335380))" ;
    ?geo ogc:sfIntersects "xxxmultipolygonxxx" ;
         ogc:asWKT ?wkt .
 
     # nog wat eigenschappen van het verblijfsobject:
    ?vbo bag:status ?status ;
         rdfs:label ?label ;
         bag:identificatiecode ?id ;
     bag:oppervlakte ?oppervlakte ;
         a ?type ;
         bag:hoofdadres ?adres .
    
    graph <http://bag.basisregistraties.overheid.nl/model> {
        ?type rdfs:subClassOf bag:Verblijfsobject .
        ?type dct:subject / skos:notation ?typeLabel .
    }
    
    # ophalen van de data behorende bij het hoofdadres van het verblijfsobject:
    graph ?adresVoorkomen { 
        ?adres bag:postcode ?postcode .
        ?adres bag:huisnummer ?huisnummer .
        ?adres bag:bijbehorendeOpenbareRuimte ?or .
        # ophalen van de data behorende bij de openbarebare ruimte van het adres:
        graph ?orVoorkomen {
            ?or bag:naamOpenbareRuimte ?straat .
            ?or bag:bijbehorendeWoonplaats ?wp .
            # ophalen van de data behorende bij de woonplaats van de openbare ruimte:
            graph ?wpVoorkomen {
                ?wp bag:naamWoonplaats ?woonplaats .
            }
        }
    }
    # geldigheid van het voorkomen van het verblijfsobject ophalen:
    ?vbo rdfs:isDefinedBy ?voorkomen .
    ?voorkomen bag:beginGeldigheid ?begin .
    optional {
        ?voorkomen bag:eindGeldigheid ?eind .
    }
}
}
#limit 100

Echter, deze query werkt niet meer. De response die wordt teruggekeerd is een grote string waar ik niets mee kan doen. Zou iemand er een blik op kunnen werpen om te kijken waar het precies mis gaat in de query? Is er overigens ook een mogelijkheid om meerdere polygonen in de query te stoppen zodat ik meerdere bedrijventerreinen per request kan ontvangen? Dank jullie wel.

Met vriendelijke groeten,
Dilara

Heeft te maken met de wijzigingen in de SPARQL endpoints die meermaals zijn aangekondigd op dit forum.

Ook de SPARQL endpoints worden gemigreerd (zoals al aangekondigd in dit topic: https://geoforum.nl/t/wijzigingen-sparql-endpoints3), hier zijn de wijzigingen iets groter omdat we van 1 SPARQL endpoint voor alle drie de dataset naar drie individuele endpoints gaan.

Hi Robin,

Bedankt voor de uitleg. Als ik het goed begrijp moeten we andere adressen in de prefixes gebruiken? Wat zouden we precies in de query moeten aanpassen om het werkende te krijgen? Ik heb de query niet zelf geschreven, vandaar dat ik het vraag.

Ha Dilara,

Dit stuk van de query

# zoek geometrie van de gebruiker intersects met de geometrie van het verblijfsobject:
#?geo ogc:sfIntersects "POLYGON((4.861791 52.335380, 4.868483 52.335407, 4.868955 52.332312, 4.861083 52.331984, 4.861791 52.335380))" ;
?geo ogc:sfIntersects "xxxmultipolygonxxx" ;
     ogc:asWKT ?wkt .

maakt gebruik van GeoSPARQL. Dat wordt voorlopig niet ondersteund.

Als je dat stuk eruit zou halen, kan de query op https://bag.basisregistraties.overheid.nl/sparql afgevuurd worden. Komt de kanttekening bij dat GRAPH constructies heel slecht performen op het nieuwe SPARQL endpoint.

Als je toch wil blijven zoeken op de geometrie zou ik aanraden om op de REST API over te stappen.

1 like

Dank je wel Robin, dat wordt in mijn geval kijken naar de REST API.

Om dan ook nog even terug te komen op één van de vragen uit je eerste bericht:

Is er overigens ook een mogelijkheid om meerdere polygonen in de query te stoppen zodat ik meerdere bedrijventerreinen per request kan ontvangen?

Je zou een MultiPolygon kunnen construeren uit meerdere losse polygonen en dit gebruiken als zoekgeometrie. Dit werkt ook bij de REST API.

1 like

Dank je wel, dat is waardevol!

1 like

Ik heb deze week nog een poging gewaagd met de Restful API van BAG. Ik heb een werkende API key, maar het is me nog onduidelijk hoe ik de bovenstaande SPARQL query kan omschrijven met de requests library van Python. Weet iemand hier raad mee?

Momenteel heb ik dit:

import requests as r

import json

response = r.get(‘https://bag.basisregistraties.overheid.nl/api/v1/panden’, params = {‘geometrie’: {“type”: “Polygon”, “coordinates”: [[[6.862499853, 53.319261624], [6.862492908, 53.319257332], [6.862418948, 53.319300234], [6.862312604, 53.3192345], [6.862425001, 53.319169307], [6.862531085, 53.319107768], [6.862644359, 53.319177794], [6.862631321, 53.319185359], [6.862499853, 53.319261624]]]},‘geldigOp’: ‘2020-08-05’, ‘page’: 1, ‘pageSize’: 20}, headers = {‘X-Api-Key’: ‘XXX’, ‘Accept’: ‘application/hal+json’, ‘Accept-Crs’: ‘epsg:4258’})

Dit geeft mij status code 400, waarbij ik dus iets verkeerds doe in mijn query. Wat ik wil doen is 1 of meerdere multipolygonen meegeven aan de API, waarbij ik daarna alle data over alle bedrijfsobjecten en panden wil ophalen zoals ik eerst ook deed met de SPARQL Query. Dank jullie wel.

Mvg,
Dilara

Je hebt nu de geometrie in de query-parameters opgenomen, en je doet een GET. Dat is beide niet juist voor wat je wil.

De geometrie moet in een data = (documentatie) en je zal een POST request moeten doen met r.post ipv r.get.

Als je de respons van je foutieve request kan bekijken, zou je zien dat daar waarschijnlijk ook nog wel een hint in staat over wat je fout doet.

Hoi Robin,

Het heeft even stil gelegen, maar ik (een collega van dilara) ben nu bezig met het ophalen van de panden die binnen een specifiek polygon liggen. Nu ben ik wat aan het testen, maar krijg mijn code niet werkend om de percelen op te halen die binnen een polygon liggen.
Mijn code:

import json
import requests as r

url = ‘https://bag.basisregistraties.overheid.nl/api/v1/panden
headers = {
‘X-Api-Key’: ‘xxxx’,
‘Accept’: ‘application/hal+json’,
‘Accept-Crs’: ‘epsg:4258’,
“Content-Type”: “application/json”
}

geometrie = {‘geometry’: {‘type’: ‘Polygon’, ‘coordinates’: [[[5.531685, 52.079418], [5.531788, 52.079444], [5.532167, 52.079461], [5.532266, 52.079456], [5.532307, 52.079451], [5.533608, 52.079312], [5.53383, 52.079275], [5.533939, 52.079258], [5.534027, 52.079256], [5.534328, 52.079252], [5.534379, 52.079251], [5.534416, 52.079251], [5.534423, 52.079243], [5.534743, 52.079041], [5.535015, 52.078737], [5.535052, 52.078696], [5.534403, 52.078495], [5.534349, 52.078478], [5.534295, 52.078462], [5.534219, 52.078438], [5.533678, 52.078279], [5.533533, 52.078236], [5.533091, 52.078105], [5.533078, 52.078101], [5.532665, 52.077973], [5.532337, 52.077871], [5.532286, 52.077856], [5.532237, 52.077871], [5.532204, 52.077906], [5.531842, 52.078776], [5.53182, 52.078845], [5.531828, 52.078885], [5.531846, 52.078911], [5.531881, 52.078938], [5.531873, 52.078958], [5.531861, 52.078983], [5.531869, 52.078982], [5.531685, 52.079418]]]}}
json_data = json.dumps(geometrie)
print(json_data)
response = r.post(url,
data = json_data,
headers=headers)
print(response.status_code)
print(response.content)

Wat ik terug krijg is een status code 400, met [Unable to parse Geometry, required geometrie request body property is missing.]
Zou iemand mogelijk mij kunnen helpen wat ik zou moeten veranderen in het post request om alle panden die binnen dit opgegeven polygon liggen als output te krijgen?

Groet,

Chris

Je mist de “operator” in je requestbody die aangeeft wat de relatie tussen de geometrie in de requestbody en de geometrie van de panden die je zoekt is. Opties zijn intersects, within, en contains.

In de SPARQL query uit het eerste bericht wordt het GeoSPARQL equivalent van intersects gebruikt.

Opbouw van de requestbody ziet er ongeveer zo uit:

geometrie:
  intersects:
    type: xxxx
    coordinates: [....]

Hoi Robin,

Top dank voor het antwoord, het is nu gelukt om de informatie op te halen!

Groet,

Chris