champagne anarchist | armchair activist

Maps

Embedding tweets in Leaflet popups

I just created a map showing where so-called Biro’s (small cars) are parked on the pavement and annoying people. Twitter has quite a few photos of the phenomenon. In some cases, finding their location took a bit of detective work.

First you’ll need the embed code for the tweet. You can get it manually from the Twitter website, but if you want to automate your workflow, use a url like the one below. It’ll download a bit of json containing the embed code:

https://publish.twitter.com/oembed?url=https://twitter.com/nieuwsamsterdam/status/958761072214896640

When trying to embed the tweets in Leaflet popups, I ran into a few problems:

  • When popups open, the markers didn’t properly move down. As a result, most of the popup would be outside the screen. The problem and how to solve it are described here.
  • Twitter embed code contains a script tag to load a widget. Apparently you can’t execute javascript by adding it directly to the html for the popup content, but you can add it using a selector (cf here).

Here’s the code that’ll solve both problems:

map.on('popupopen', function(e) {
    $.getScript("https://platform.twitter.com/widgets.js");
    var px = map.project(e.popup._latlng); 
    px.y -= e.popup._container.clientHeight;
    map.panTo(map.unproject(px),{animate: true});
});

You may also want to do something about the width of the popups, because otherwise they will obscure most of the map on mobile screens and it will be difficult to close a popup (which you can normally do by clicking outside of the popup). You can change the width of embedded tweets, but this will not change the width of the popup itself. A simple solution is to give popups a maxWidth of 215 (.bindPopup(html, {maxWidth: 215})).

Of course, you could also vary maxWidth depending on screen width, but I think 215px works well on all screens. Further, embedded tweets appear to have a minimum width of about 200px, so if you want popups narrower than 215px you’ll have to figure out a way to fix that.

If you embed tweets, Twitter can track people who visit your webpage. Add <meta name="twitter:dnt" content="on"> to your page and Twitter promises they won’t track your visitors. I wasn’t sure whether this should be put in the web page itself or in the html content of the popups (I opted for both).

If the popups have a somewhat spartan look and do not contain photos: Good for you! You’re probably using something like Firefox with tracking protection enabled. This blocks sites which have been identified as ‘engaging in cross-site tracking of users’ - including, apparently, platform.twitter.com.

Dafne Schippersbrug: de Fietsersbond Routeplanner kent hem al, Google Maps nog niet

Vanmiddag ging ik voor het eerst naar mijn nieuwe werkplek bij Leidsche Rijn. De routeplanner van de Fietsersbond gaf meteen een route over de vanochtend geopende Dafne Schippersbrug; Google Maps kende deze optie nog niet. Complimenten voor de vrijwilligers van de Fietsersbond die de routeplanner actueel houden.

UPDATE 9 mei 2017 - De brug is nu ruim een maand in gebruik, maar op Google Maps is hij nog niet te vinden. Misschien wachten ze op de officiële opening aanstaande zaterdag.

Zijn er genoeg stemlocaties

Open State heeft de locaties van stembureaus verzameld en ze als open data beschikbaar gesteld. Daaruit blijkt dat er woensdag op een kleine negenduizend plekken gestemd kan worden.

Is dat genoeg? Over ongeveer die vraag is vorig jaar een rechtzaak gevoerd. De Brabantse gemeente Son en Breugel had besloten om bij het Oekraïnereferendum drie stembureaus in te richten, in plaats van de gebruikelijke tien. Forum voor Democratie is toen samen met twee inwoners naar de rechter gestapt.

Uit onderzoek zou zijn gebleken «dat er causaal verband bestaat tussen, kort gezegd, de stemfaciliteiten die aan een kiezer worden geboden (aantal, afstand, locatie) en de mate waarin die kiezer gebruik zal maken van zijn stemrecht». Helaas ontbreekt een bronvermelding.

Uit het verslag van de rechtzaak blijkt dat er niet zoveel geregeld is. In de wet staat alleen dat een gemeente tenminste één stembureau moet inrichten. In de praktijk hanteren gemeenten een informele norm van 1.200 kiesgerechtigden per stembureau. De rechter neemt die informele norm niet zonder meer over, maar kwam wel met een nieuwe regel: je mag niet zomaar het aantal stembureaus drastisch verlagen. Met als argument dat gemeenten zich ‘servicegericht’ op moeten stellen.

Zoals gezegd deden twee inwoners uit Son en Breugel mee aan de rechtzaak. Ze kampen met gezondheidsklachten en wilden daarom graag dat hun ‘vaste’ stembureau om de hoek weer open zou gaan. Daar ging de rechter niet in mee: er is «geen recht voor de individuele burger op het instellen van een stembureau op een afstand op 50 meter van zijn woning, ook niet als die burger slecht ter been is».

Stemlocaties per gemeente

Een analyse van de stemlocaties in Nederland laat zien dat het aantal stemlocaties sterk samenhangt met het aantal kiesgerechtigden in een gemeente. Gezien de informele norm die gemeenten hanteren was dat ook wel te verwachten.

In een doorsnee gemeente is er een stemlocatie per ruim 1.400 kiesgerechtigden. Dat is meer dan de informele norm van 1.200, maar dat heeft wellicht te maken met het verschil tussen stemlocaties en stembureaus (zie Methode).

Er zijn relatief weinig stemlocaties in gemeenten als Haaren, Capelle a/d IJssel (allebei ongeveer 2.800 kiesgerechtigden per locatie) en Heerenveen (3.550). In Son en Breugel kan woensdag op 9 locaties worden gestemd; dat betekent gemiddeld 1.410 kiesgerechtigden per locatie. Een doorsnee gemeente, wat dat betreft. Maar het favoriete stembureau van de twee inwoners die naar de rechter waren gestapt, zit er niet meer bij.

Stemlocaties per wijk

Uit de referendumzaak blijkt dat er wel een informele norm bestaat over het aantal stembureaus in relatie tot het aantal kiesgerechtigden, maar niet over de afstand tot een stembureau. De meeste Amsterdammers zullen geen moeite hebben om een stembureau op loopafstand te vinden, maar hoe zit dat op het platteland? Daar valt wel iets over te zeggen met een analyse op wijkniveau.

Het aantal kiesgerechtigden per wijk is denk ik niet formeel bekend, maar het aantal inwoners natuurlijk wel. Ook dat hangt duidelijk samen met het aantal stemlocaties: hoe meer inwoners in een wijk, hoe meer stemlocaties. Maar de vraag is of er relatief meer stemlocaties zijn in dunbevolkte gebieden. De grafiek hierboven laat het antwoord zien: ja, hoe lager de bevolkingsdichtheid, hoe hoger het aantal stemlocaties per 10.000 inwoners.

Hoe dat in de praktijk ongeveer werkt, is te zien op de kaart hieronder.

kaart

Dunbevolkte gebieden van ons land hebben vaak relatief veel stemlocaties. Dit geldt bijvoorbeeld voor delen van Zeeland, Limburg, Oost-Nederland en vooral Noord-Nederland. Deels geldt dat ook voor de Waddeneilanden, maar daar zijn altijd extra stemmers vanwege het toerisme. De donkergroene wijken zijn vaak (maar zeker niet altijd) wijken met hoogstens een paar honderd inwoners, die toch een stembureau hebben gekregen.

Al met al lijkt het erop dat gemeenten bij de inrichting van stembureaus niet alleen kijken naar het aantal kiesgerechtigden, maar ook naar de afstand die ze moeten afleggen. Klinkt redelijk. Als je echt wil weten hoe het zit, dan zou je eigenlijk voor alle woonadressen in Nederland moeten uitrekenen hoe ver de dichtstbijzijnde stemlocatie is. Die klus laat ik graag aan iemand anders over.

UPDATE - DUIC heeft ondertussen voor de stad Utrecht de afstand van woonadressen tot stemlocaties laten berekenen. De maximale afstand is 3,5 kilometer; de mediaan 332 meter.

Methode

De gegevens over stemlocaties zijn verzameld en beschikbaar gesteld door Open State. Soms zijn er op een locatie meerdere stembureaus, althans in Amsterdam is dat vrij gebruikelijk. Open State lijkt in principe meerdere stembureaus op dezelfde locatie als één locatie te hebben opgevat. Toch komt het een enkele keer voor dat dezelfde locatie (identieke coördinaten) meer dan één keer in het bestand zit; ik denk dat die erdoor zijn geslipt. In het Open State-bestand zitten 9018 locaties; nadat ik de duplicaten had verwijderd waren dat er 8744.

Gegevens over kiesgerechtigden per gemeente zijn te vinden bij het CBS (in dit bestand zijn gemeenten Gennep, Schijndel en Sint Oedenrode nog opgenomen als aparte gemeenten).

Bij het samenvoegen van dit soort bestanden ontstaan altijd problemen doordat gemeentenamen niet consistent worden gespeld of omdat er problemen zijn met de weergave van namen met speciale tekens, zoals S√∫dwest-Frysl√¢n. Open State heeft dit ondervangen door netjes de gemeentecode in het bestand op te nemen. In de CBS-cijfers over kiesgerechtigden is dat helaas niet het geval.

Ik dacht dit op te lossen door elders bij CBS een bestand te downloaden met de gemeentecodes. Maar toen ik de twee CBS-bestanden aan elkaar wilde koppelen bleek dat het CBS zelf geen consistente schrijfwijze hanteert. Kortom, het zou fantastisch zijn als het CBS voortaan standaard in alle datasets met regionale gegevens de bijbehorende regiocodes zou opnemen…

Voor de analyse op wijkniveau heb ik de wijk- en buurtkaart van het CBS (editite 2015) gebruikt. Deze heb ik samen met de Open State-gegevens geopend in Qgis en bepaald hoeveel stemlocaties er zijn per wijk door middel van een points in polygon-analyse.

Hier is de code voor het verwerken van de gegevens.

Update - Het blijkt wel degelijk mogelijk te zijn om gemeentecodes te krijgen bij de CBS-data, als je ze downloadt als SPSS-bestand. Zie ook hier over het inlezen van de gegevens met Python.

New Python package for downloading and analysing street networks

stationsplein

The image above shows square mile diagrams of cyclable routes in the area around the Stationsplein in Amsterdam, the Hague, Rotterdam and Utrecht. I made the maps with OSMnx, a Python package created by Geoff Boeing, a PhD candidate in urban planning at UC Berkeley (via).

Square mile diagrams are a nice gimmick (with practical uses), but they’re just the tip of the iceberg of what OSMnx can do. You can use it to download administrative boundaries (e.g. the outline of Amsterdam) as well as street networks from Open Street Map. And you can analyse these networks, for example: assess their density, find out which streets are connections between separate clusters in the network, or show which parts of the city have long or short blocks (I haven’t tried doing network measure calculations yet).

Boeing boasts that his package not only offers functionality that wasn’t (easily) available yet, but also that many tasks can be performed with a single line of code. From what I’ve seen so far, it’s true: the package is amazingly easy to use. All in all, I think this is a great tool.

Pages