opmaak van PDOK WMS bestuurlijke grenzen

Beste allen,

na enig speuren heb ik een manier gevonden om gemeentegrenzen op een kaart te krijgen: PDOK bestuurlijke grenzen

Ik krijg de grenzen als transparante png binnen. De lijnen zijn zwart en tamelijk dik. Ik wil ze dunner, en een kleurtje. Maar hoe krijg ik de lijnen in een andere kleur en lijndikte?

Ik gebruik deze code in OpenLayers:


var gemeenteGrenzenLayer = new OpenLayers.Layer.WMS(
		"Gemeentegrenzen",
		"http://geodata.nationaalgeoregister.nl/bestuurlijkegrenzen/wms?",
		{layers: "gemeenten_2012", format: "image/png", transparent: true},
		{singleTile: false, buffer: 0, isBaseLayer: false, visibility: true, opacity: 0.5, displayInLayerSwitcher: false}
	);
	map.addLayer (gemeenteGrenzenLayer);

NB: door middel van “opacity” kan ik de lijnkleur wat lichter maken. Maar dat is niet wat ik zoek.

Ik heb me suf gezocht naar opties die ik mee kan geven aan de WMS server, maar kan het niet vinden. Wie heeft er een goed idee?!

Henk

style: {fillColor: “darkred”, strokeColor: “red”, strokeWidth: 2, strokeOpacity: 0.5, externalGraphic : “img/008.png”,graphicWidth: 12, graphicHeight: 12, pointRadius: 12, cursor:“pointer”,}

staat hier wat tussen?

http://docs.openlayers.org/library/feature_styling.html

Ha Allrouds, Dank voor de suggestie. Maar helaas: het werkt niet. De WMS server reageert niet op deze opties. Het is ook geen vector layer, maar een tile layer.
Misschien zijn er slimmere manieren om de gemeentegrenzen op een kaart te projecteren? Dus niet via de PDOK WMS service?

Via OSM misschien?
http://mijndev.openstreetmap.nl/~ligfietser/BAG/?map=grenzen&zoom=13&lat=52.16238&lon=5.3989&layers=B00TFFF

Jij weet toch altijd mooie kaartjes te maken!
Wat jij doet, heb ik ook geprobeerd: via de overpass api de gemeentegrenzen binnen halen. Maar dat leverde een probleem op: ik kreeg 25 MB data binnen voor alleen Gelderland.

overpass-api.de/api/interpreter?data=(relation[name~"Aalten|Apeldoorn|Arnhem|Barneveld|Berkelland|Beuningen|Bronckhorst|Brummen|Buren|Culemborg|Doesburg|Doetinchem|Druten|Duiven|Ede|Elburg|Epe|Ermelo|Geldermalsen|Groesbeek|Harderwijk|Hattem|Heerde|Heumen|Lingewaal|Lingewaard|Lochem|Maasdriel|Millingen|Montferland|Neder-Betuwe|Neerijnen|Nijkerk|Nijmegen|Nunspeet|Oldebroek|Oost|Oude|Overbetuwe|Putten|Renkum|Rheden|Rijnwaarden|Rozendaal|Scherpenzeel|Tiel|Ubbergen|Voorst|Wageningen|West|Westervoort|Wijchen|Winterswijk|Zaltbommel|Zevenaar|Zutphen"][admin_level=8];>;);out+skel;

Dat heb ik vast niet handig gedaan …
Kan je mij vertellen hoe jij de grenzen zo efficient mogelijk binnenhaalt?

Yep, dat is dan vast gebakken.

Traildino, die kaartjes heb ik niet alleen gemaakt, de credits zijn vooral voor Noordfiets :wink:
Ik snap niet waarom je die filtert op die gemeentenamen, probeer het eens zonder:

http://overpass-api.de/api/interpreter?data=(relation[admin_level=8](bbox);way(r);node(w););out+skel;

Jouw query is iets effectiever, maar nog steeds niet erg gebruiksvriendelijk: Ik wacht 10 seconden op 6 MB aan data.

Het voordeel van de overpass api is dat ik maar 1 keer hoef te laden; de WMS server blijft bij ieder zoomniveau tiles sturen. De WMS server is ook niet bijster snel, trouwens. De hoeveelheid vectordata uit OSM is heel veel meer dan de WMS tiles.

Kortom, het is gewoon passen en meten, voordelen en nadelen. Je hebt me wel een stapje verder gebracht, waarvoor dank.

Als iemand nog een slimme derde oplossing weet voor de gemeentegrenzen, naast OSM en nationaalgeoregister/PDOK, dan hou ik me warm aanbevolen.

NB: wat me trouwens opvalt, is hoeveel sneller de overpass query wordt door het toevoegen van de bbox. Ik gebruik nu dezelfde selectie op gemeentenamen PLUS de bbox:

	var url = "http://overpass-api.de/api/interpreter?data=(relation[name~'Aalten|Apeldoorn|Arnhem|Barneveld|Berkelland|Beuningen|Bronckhorst|Brummen|Buren|Culemborg|Doesburg|Doetinchem|Druten|Duiven|Ede|Elburg|Epe|Ermelo|Geldermalsen|Groesbeek|Harderwijk|Hattem|Heerde|Heumen|Lingewaal|Lingewaard|Lochem|Maasdriel|Millingen|Montferland|Neder-Betuwe|Neerijnen|Nijkerk|Nijmegen|Nunspeet|Oldebroek|Oost|Oude|Overbetuwe|Putten|Renkum|Rheden|Rijnwaarden|Rozendaal|Scherpenzeel|Tiel|Ubbergen|Voorst|Wageningen|West|Westervoort|Wijchen|Winterswijk|Zaltbommel|Zevenaar|Zutphen'][admin_level=8](51.7,5.09,52.47,6.68);way(r);node(w););out+skel;";

en dat gaat 10x zo snel

Je kunt zelf een WMS server opzetten en de output zo stylen als jij wilt. De administratieve grenzen zijn onderdeel van de TOP10NL (en bestaat als subproduct TOPgrenzen), welke je met NLExtract in een PostGIS database kunt laden. Met MapServer kan je de data via dan WFS en/of WMS services aanbieden. Om een beetje performance te hebben wil je de WMS service cachen met iets als MapCache of TileCache.

De administratieve grenzen WFS is waarschijnlijk een laag drempeliger optie, dit is vector data die je in OpenLayers kunt stylen met een StyleMap.

Sebastic: je laatste suggestie heb ik uitgeprobeerd. Helaas: de WFS server geeft allerlei foutmeldingen terug. Geen flauw idee wat de server van mij verlangt. De documentatie van de WFS service is nihil. Grr. Geen voorbeelden. Ik heb daarom maar wat bijeen geraapt:

var gemeenteGrenzenLayer = new OpenLayers.Layer.Vector(
		"Gemeentegrenzen", 
		{
			strategies: [new OpenLayers.Strategy.BBOX()],
			styleMap : gemeenteGrenzenStyleMap, 
			protocol: new OpenLayers.Protocol.WFS({
				version: "1.1.0",
				url:  "http://geodata.nationaalgeoregister.nl/bestuurlijkegrenzen/wfs",
				request: "GetFeature",
				featureType: "bestuurlijkegrenzen:gemeenten_2012",
				srsName: "EPSG:28992",
	                        featureNS: "http://bestuurlijkegrenzen.geonovum.nl",
				geometryName: 'geometrie'

			})
		}
	);
	map.addLayer (gemeenteGrenzenLayer);

De server geeft in ieder geval antwoord, dat is al heel wat; in goed Nederlands:

<?xml version="1.0" encoding="UTF-8"?>
<ows:ExceptionReport version="2.0.0"
  xsi:schemaLocation="http://www.opengis.net/ows/1.1 http://geodata.nationaalgeoregister.nl/schemas/ows/1.1.0/owsAll.xsd"
  xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ows:Exception exceptionCode="MissingParameterValue" locator="request">
    <ows:ExceptionText>Could not determine geoserver request from http request org.geoserver.platform.AdvancedDispatchFilter$AdvancedDispatchHttpRequest@1c24c126</ows:ExceptionText>
  </ows:Exception>
</ows:ExceptionReport>

Kan jij mij vertellen hoe ik de query precies moet samenstellen om een zinvol antwoord te krijgen van de WFS server?

Ik heb net een reply gestuurd op je mail naar talk-nl@:

Nog even een nabericht voor hen die op hetzelfde probleem stuiten. Ik heb veel hulp gekregen van het forum en van de mailing list, en daardoor heb ik het probleem kunnen oplossen.

Van de drie methoden om gemeentegrenzen binnen te halen is WFS het beste: het kleinste bestand en voldoende flexibiliteit. De OSM Overpass API (gegevens uit OSM) werkt prima, maar genereert veel meer data. De WMS methode is simpel, maar het grote nadeel is dat je de vormgeving van de grenzen op geen enkele manier kan beïnvloeden (dikte en kleur lijn), plus het is behoorlijk traag.

De volgende tips voor hen die starten met WFS

  1. Je moet beslist je server als proxy configureren, anders weigert de browser de XML data te laden. Aangezien ik geen enkel benul heb van proxies, was dit voor mij een bottle neck. Maar deze twee links hebben mij er doorheen geholpen:

http://www.techrepublic.com/blog/diy-it-guy/diy-enable-cgi-on-your-apache-server/
http://trac.osgeo.org/openlayers/browser/trunk/openlayers/examples/proxy.cgi?format=txt

  1. In de javascript source moet je het volgende opnemen:
    OpenLayers.ProxyHost= “/cgi-bin/proxy.cgi?url=”;

  2. Verder ontkom je er niet aan om uitvoerig en grondig de output van de WFS server te bestuderen, door middel van de standaard commando’s achter de URL te plakken:
    …/wfs?service=WFS&request=GetCapabilities&version=1.1.0
    …/wfs?service=WFS&request=DescribeFeatureType&version=1.1.0
    …/wfs?request=GetFeature&typeName=hierietsinvullen

En dit is de code die voor mij werkt:

	
	var gemeenteGrenzenLayer = new OpenLayers.Layer.Vector(
		"Gemeentegrenzen", 
		{
			strategies: [new OpenLayers.Strategy.BBOX()],
			styleMap : gemeenteGrenzenStyleMap, 
			displayInLayerSwitcher: false,
			protocol: new OpenLayers.Protocol.WFS({
				version: "1.1.0",
				srsName: 'EPSG:900913',
				url:  "http://geodata.nationaalgeoregister.nl/bestuurlijkegrenzen/wfs",
				featureType: "gemeenten",
	            featureNS: "http://bestuurlijkegrenzen.geonovum.nl",
				outputFormat: 'GML2'
			}),
			filter: new OpenLayers.Filter.Logical ({
				type: OpenLayers.Filter.Logical.OR,
				filters: gemeenteFilter ()
			})
		}
	);
	map.addLayer (gemeenteGrenzenLayer);

	function gemeenteFilter () {
		var gemeenten = ['Aalten','Apeldoorn','Arnhem'];

		var ii, result = [];
		for (ii = 0; ii < gemeenten.length; ii += 1) {
			var filter = new OpenLayers.Filter.Comparison ({
						type: OpenLayers.Filter.Comparison.EQUAL_TO,
						property: "gemeentenaam",
						value: gemeenten[ii]
					});
			result.push(filter);
		}
		return (result);
	}

Dank Gertjan, Sebastic, Bas, Just, Chris en alle anderen. :slight_smile: