Skip to contents

Ce package est un outil permettant de partitionner les communes françaises en « contours » ou « aires » de bureaux de vote à partir des adresses du Répertoire électoral unique (REU) publiées en open-source.

Les contours de bureaux de vote produits n’ont pas de caractère officiel. Il s’agit d’approximations et leur intérêt est essentiellement statistique.

La méthode proposée est transparente, accessible à tous et améliorable. N’hésitez pas à l’adapter à votre besoin.

Elle repose principalement sur l’idée de tracer des polygones de Voronoï autour des adresses géolocalisées, c’est-à-dire le polygone contenant tous les points plus proches de notre adresse cible plutôt qu’une autre adresse de la base. Sur le schéma suivant, les points correspondent aux adresses du REU et les traits fins délimitent les polygones de Voronoï autour de chaque point.

Dans un deuxième temps, les polygones de Voronoï sont agrégés en fonction du bureau de vote assosié à chaque adresse (représentés par les couleurs sur le schéma), générant ainsi les « contours des bureaux de vote » (en traits épais). Les détails pratiques sont évoqués dans l’article « Méthodologie adoptée », pour les utilisateurs intéressés.

Schéma des polygones de Voronoï

Schéma des polygones de Voronoï

Les données en entrée

Le package mapvotr s’appuie sur 2 types de sources de données ouvertes :

  1. Le fichier déposé sur data.gouv.fr contenant les adresses des électeurs ;
  2. Le fichier des contours communaux, issu par exemple de la BD TOPO de l’IGN.

Pour simplifier sa prise en main, le package incorpore des extraits de ces deux fichiers.

library(mapvotr)
addresses_sample <- mapvotr::addresses_sample
contours_com_sample <- mapvotr::contours_com_sample

head(as.data.frame(addresses_sample))
  id_brut_bv_reu code_commune_ref longitude latitude    geo_type geo_score nb_adresses
1        29039_1            29039 -3.913795 47.87289 housenumber      0.96           2
2        29039_1            29039 -3.917988 47.86938 housenumber      0.96           4
3        29039_1            29039 -3.917548 47.87026 housenumber      0.96           1
4        29039_1            29039 -3.917988 47.86938 housenumber      0.96           2
5        29039_1            29039 -3.921150 47.86997 housenumber      0.97           2
6        29039_1            29039 -3.918276 47.87105      street      0.96           2
head(contours_com_sample)
Simple feature collection with 3 features and 1 field
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -4.37906 ymin: 47.84902 xmax: -3.848632 ymax: 48.50665
Geodetic CRS:  WGS 84

[38;5;246m# A tibble: 3 × 2
[39m
  code_insee                                                                      geometry
  
[3m
[38;5;246m<chr>
[39m
[23m                                                                 
[3m
[38;5;246m<MULTIPOLYGON [°]>
[39m
[23m

[38;5;250m1
[39m 29116      (((-4.216645 48.49144, -4.216657 48.49154, -4.216928 48.492, -4.217322 48.49…

[38;5;250m2
[39m 29046      (((-4.306421 48.08932, -4.306392 48.08935, -4.306327 48.08936, -4.306276 48.…

[38;5;250m3
[39m 29039      (((-3.932018 47.87721, -3.932002 47.87722, -3.931925 47.8772, -3.931896 47.8…

1. Préparer les adresses

À partir des deux sources précédentes, la fonction prepare_address va créer :

  • Une nouvelle table d’adresses, en ne retenant que celles ayant une qualité de géolocalisation suffisante, et uniquement dans les communes ayant au moins deux bureaux de vote ;
  • Une liste des communes ayant au moins 2 bureaux de votes (et donc susceptibles d’être partitionnées) ;
  • Une liste des COG (codes officiels géographiques) de ces communes.
prep_adr <- mapvotr::prepare_address(
  address = addresses_sample,
  contours_com = contours_com_sample,
  var_cog1 = "code_commune_ref",
  var_cog2 = "code_insee",
  var_bv1 = "id_brut_bv_reu",
  path_log = NULL) 
[1] "========================================================================="
[1] "prepare_address"
[1] "========================================================================="
[1] "Row number in initial data base"
[1] 12335
[1] "Launch rm_arrond"
[1] "Row number after filtering geo_type"
[1] 11928
[1] "Launch fget_multiBV"
[1] "Row number after filtering cities with at leat 2 BdV"
[1] 11875
[1] "Convert to sf using BAN coordinates"
[1] "Initial number of rows in city contours"
[1] 3
[1] "Filtering only cities in the scope"
head(as.data.frame(prep_adr$address))
  id_brut_bv_reu code_commune_ref    geo_type geo_score nb_adresses
1        29039_1            29039 housenumber      0.96           2
2        29039_1            29039 housenumber      0.96           4
3        29039_1            29039 housenumber      0.96           1
4        29039_1            29039 housenumber      0.96           2
5        29039_1            29039 housenumber      0.97           2
6        29039_1            29039 housenumber      0.96           1
                    geometry
1 POINT (-3.913795 47.87289)
2 POINT (-3.917988 47.86938)
3 POINT (-3.917548 47.87026)
4 POINT (-3.917988 47.86938)
5  POINT (-3.92115 47.86997)
6 POINT (-3.919545 47.87163)
head(prep_adr$contours_com)
Simple feature collection with 2 features and 1 field
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -4.37906 ymin: 47.84902 xmax: -3.848632 ymax: 48.11038
Geodetic CRS:  WGS 84

[38;5;246m# A tibble: 2 × 2
[39m
  code_insee                                                                      geometry
  
[3m
[38;5;246m<chr>
[39m
[23m                                                                 
[3m
[38;5;246m<MULTIPOLYGON [°]>
[39m
[23m

[38;5;250m1
[39m 29046      (((-4.306421 48.08932, -4.306392 48.08935, -4.306327 48.08936, -4.306276 48.…

[38;5;250m2
[39m 29039      (((-3.932018 47.87721, -3.932002 47.87722, -3.931925 47.8772, -3.931896 47.8…
print(prep_adr$lcog)
  29039   29046 
"29039" "29046" 

2. Construire les contours d’une commune

A partir de la liste prep_adr précedemment obtenue, la fonction create_contours permet de partitionner une commune donnée en « aires » ou « contours » approximatifs des bureaux de vote.

Par exemple, essayons avec la commune de Douarnenez en Bretagne (code 29046, elle fait partie de l’échantillon des données du package).

Avant cela, le découpage des communes en contours de bureaux de vote nécessite des hypothèses de construction :

  • MIN_POINT_COM : Une commune ne pourra être découpée que si elle possède un minimum de points géolocalisés en son sein (d’après la base des adresses du REU) ;

  • MIN_ADDRESS_BV : Un contours de bureau de vote sera créé s’il existe un nombre minimal d’adresses associées à ce bureau de vote (toujours dans la base du REU) ;

  • MIN_ADDRESS_SHOOT : Lors de la phase de « simplification / correction » de la géographie des contours, les polygones concernés seront ceux comportant un petit nombre d’adresses en leur sein.

#### Hypothèses de modélisation
MIN_POINT_COM <- 50
MIN_ADDRESS_BV <- 15
MIN_ADDRESS_SHOOT <- 5

# Création des contours de Douarnenez
cog <- "29046" 
lcontours <- mapvotr::create_contours(
  prep_adr,
  cog,
  min_points_com = MIN_POINT_COM,
  min_address_bv = MIN_ADDRESS_BV,
  min_address_shoot = MIN_ADDRESS_SHOOT,
  var_cog1 = "code_commune_ref",
  var_cog2 = "code_insee",
  var_bv1 = "id_brut_bv_reu",
  var_geo_score = "geo_score",
  var_nbaddress = "nb_adresses",
  path_log = NULL)
[1] "Launch : epsg_from_cog"
[1] "First checks"
[1] "Launch f_inContour"
[1] "0 points removed"
[1] "Check if the city can be in the scope"
[1] "Launch valid_for_contours"
[1] "No problem"
[1] "Launch voronoi_com"
[1] "14 points with addresses related to different vote offices"
[1] "Launch : decouplage_ptsBv"
[1] "Join voronoi and passage_ptsBv"
[1] "Launch : shoot_isolated"
[1] "Launch st_cast_bis"
[1] "Launch st_cast_bis"
[1] "Launch : count_voro"
head(as.data.frame(lcontours$contours))
  id_brut_bv_reu                       geometry
1        29046_1 POLYGON ((155116.8 6802379,...
2       29046_10 MULTIPOLYGON (((153577.9 68...
3       29046_11 MULTIPOLYGON (((152841.4 68...
4       29046_12 POLYGON ((153635.7 6799223,...
5       29046_13 MULTIPOLYGON (((154914.3 68...
6        29046_2 POLYGON ((155271.1 6802048,...
head(as.data.frame(lcontours$contours_simplified))
  id_brut_bv_reu                       geometry
1        29046_1 POLYGON ((155116.8 6802379,...
2       29046_10 POLYGON ((153959.1 6802674,...
3       29046_11 MULTIPOLYGON (((154018.7 68...
4       29046_12 POLYGON ((153588.6 6799211,...
5       29046_13 POLYGON ((155360.7 6800818,...
6        29046_2 POLYGON ((155271.1 6802048,...

3. Visualisation des contours produits

La fonction map_contours permet de visualiser rapidement les contours produits à partir des adresses géolocalisées du REU.

Note : La couche des points-adresses utilisée pour la création des contours est à afficher selon le besoin en cochant l’affichage dans les options (en haut à droite de la carte).

carte <- mapvotr::map_contours(
  cog,
  sfelecteurs = prep_adr$address,
  contours_bv = lcontours$contours,
  var_code_bv = "id_brut_bv_reu",
  var_score = "geo_score",
  var_cog = "code_commune_ref"
)

carte_simplified <- mapvotr::map_contours(
  cog,
  sfelecteurs = prep_adr$address,
  contours_bv = lcontours$contours_simplified,
  var_code_bv = "id_brut_bv_reu",
  var_score = "geo_score",
  var_cog = "code_commune_ref"
)
  
carte
carte_simplified