4.1 Leçon

4.1.1 Télécharger les données

Les données


Dans les sections 4.1.3 à 4.1.6 du présent module vous apprendrez à lire et visualiser des données déjà existantes. Afin de faciliter le téléchargement de ces multiples données, l’ensemble des couches d’informations spatiales peuvent être téléchargées en cliquant sur un seul lien: données pour le module 4. Sauvegardez le dossier compressé (zip) dans votre répertoire de travail Module4_donnees pour ce module, et dézippez-le. Le dossier comprend lui même deux dossiers compressés et un fichier csv:

  • Montreal_Velo.zip
  • Donnees_Ouvertes_MEES.gbd.zip
  • nz_capitales.csv

Dézipper chacun des deux dossiers. Le premier dossier, Montreal_Velo sera utilisé aux sections 4.1.3-4.1.5. Il contient les données vectorielles relatives au réseau de pistes cyclables de la ville de Montréal et aux accidents routiers impliquant des bicyclettes. Il contient trois sous-dossiers:

  • accidents
  • pistes
  • terre.

Le deuxième dossier, Donnees_Ouvertes_MEES.gbd est la geodatabase du Ministère de l’Éducation et de l’Enseignement Supérieur du Québec (MEES); nous l’utiliserons à la section 4.1.6.

Le fichier nz_capitales.csv contient les coordonnées géographiques des capitales des régions administratives de la Nouvelle-Zélande; nous l’utiliserons à la section exercices à la fin de ce module.

4.1.2 Créer des données vectorielles

Pour créer, lire et manipuler des données vectorielles, nous allons utiliser la bibliothèque sf. Notez que la bibliothèque rgdal se charge automatiquement lorsque sf se charge.

library(sf)


Créer des géométries simples

Nous avons appris à la leçon 2 que les données vectorielles peuvent avoir différentes géométries (point, ligne, polygone, etc.). La bibliothèque sf possède des fonctions pour créer ces géométries simples, c’est-à-dire pour créer des objects de la classe sfg (pour simple feature geometry).

La fonction st_point() permet de transformer un vecteur numérique représentant les coordonnées d’un point en un objet de type point. Par exemple,

p <- c(3,5)
point <- st_point(p)
point
POINT (3 5)


Remarquez que la classe de l’objet formé est sfg:

class(point)
[1] "XY"    "POINT" "sfg"  


La fonction st_multipoint() permet de créer une géométrie multipoint. Nous devons fournir à cette fonction une matrice où chaque rangée définie les coordonnées d’un des points:

M <- rbind( c(3,5), c(5,5), c(4,1), c(2,3))
multi_point <- st_multipoint(M)
multi_point
MULTIPOINT ((3 5), (5 5), (4 1), (2 3))


La fonction st_linestring() permet de créer une ligne. Nous devons également lui fournir une matrice contenant les coordonnées des extrémités de la ligne.

ligne <- st_linestring(M)
ligne
LINESTRING (3 5, 5 5, 4 1, 2 3)


Un polygone se crée de façon similaire, cette fois en utilisant la fonction st_polygon(). Les coordonnées des extrémités du polygone doivent toutefois être définies dans une liste, et non une matrice. Il s’agit alors d’utiliser la fonction list() pour convertir une matrice en liste.

L <- list(rbind( c(3,5), c(5,5), c(4,1), c(2,3), c(3,5)))
polygone <-st_polygon(L)
polygone
POLYGON ((3 5, 5 5, 4 1, 2 3, 3 5))


Noter que pour créer un polygone la première extrémité doit être identique à la dernière.


Dans un même ordre d’idées, pour créer des multilignes ou des multipolygones nous devons aussi recourir à des listes où chaque élément de la liste correspond à une ligne ou à un polygone respectivement.

M1 <- rbind( c(3,5), c(5,5), c(4,1), c(2,3))
M2 <- rbind( c(1,2), c(2,2), c(2,1))
L  <- list(M1, M2)
multi_ligne <- st_multilinestring(L)
multi_ligne
MULTILINESTRING ((3 5, 5 5, 4 1, 2 3), (1 2, 2 2, 2 1))


L1 <- list(rbind( c(3,5), c(5,5), c(4,1), c(2,3), c(3,5)))
L2 <- list(rbind( c(1,2), c(2,2), c(2,1), c(1,2)))
L  <- list(L1, L2)
multi_polygone <- st_multipolygon(L)
multi_polygone
MULTIPOLYGON (((3 5, 5 5, 4 1, 2 3, 3 5)), ((1 2, 2 2, 2 1, 1 2)))


Attribuer un SCR

Nous venons d’apprendre les fonctions de base de la bibliothèque sf pour créer des géométries simples. Or, les données vectorielles ne sont pas uniquement des géométries, ce sont des géométries géoréférencées. Ceci signifie qu’on doit attribuer aux géométries un datum et une projection. Pour ce faire, nous devons créer des objets de la classe sfc, c’est-à-dire simple feature columns.

Un objet sfc est une liste d’objets sfg qui permet, en plus, de contenir l’information relative au système de coordonnées de référence (SRC) utilisé.

La fonction st_sfc() permet de transformer un objet de classe sfg en un objet de classe sfc. Par exemple, transformons le point créé plus haut:

point_sfc <- st_sfc(point)


Alors que l’objet point contenait seulement la géométrie de l’objet:

point
POINT (3 5)


L’objet point_sfc contient la géométrie de l’objet et il possède la structure pour définir le SCR (CRS en anglais), bien que pour l’instant ce dernier ne soit pas défini (valeur de NA):

point_sfc
Geometry set for 1 feature 
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 3 ymin: 5 xmax: 3 ymax: 5
CRS:           NA
POINT (3 5)


La fonction st_sfc() peut être utilisée sur les autres géométries. Elle permet également de combiner des géométries. Par exemple:

L1 <- list(rbind( c(3,5), c(5,5), c(4,1), c(2,3), c(3,5)))
polygone1 <- st_polygon(L1)
L2 <- list(rbind( c(1,2), c(2,2), c(2,1), c(1,2)))
polygone2 <- st_polygon(L2)
polygone_sfc <- st_sfc(polygone1, polygone2)
polygone_sfc
Geometry set for 2 features 
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 1 ymin: 1 xmax: 5 ymax: 5
CRS:           NA
POLYGON ((3 5, 5 5, 4 1, 2 3, 3 5))
POLYGON ((1 2, 2 2, 2 1, 1 2))


Pour connaître le SCR d’un object vectoriel, il s’agit d’utiliser la fonction st_crs() de la bibliothèque st:

st_crs(polygone_sfc)
Coordinate Reference System: NA


Dans le cas présent, le SCR est indéfini.

Il existe plusieurs façons de définir le SCR. La façon la plus simple est d’utiliser le code EPSG associé au SCR que l’on désire utilisé. Par exemple, utilisons le EPSG 32198 correspondant au système de coordonnées conique conforme de Lambert dans le datum NAD83 pour définir le CRS de polygone_sfc:

polygone_sfc <- st_sfc(polygone1, polygone2, crs = 32198)
st_crs(polygone_sfc)
Coordinate Reference System:
  User input: EPSG:32198 
  wkt:
PROJCRS["NAD83 / Quebec Lambert",
    BASEGEOGCRS["NAD83",
        DATUM["North American Datum 1983",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4269]],
    CONVERSION["Quebec Lambert Projection",
        METHOD["Lambert Conic Conformal (2SP)",
            ID["EPSG",9802]],
        PARAMETER["Latitude of false origin",44,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8821]],
        PARAMETER["Longitude of false origin",-68.5,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8822]],
        PARAMETER["Latitude of 1st standard parallel",60,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8823]],
        PARAMETER["Latitude of 2nd standard parallel",46,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8824]],
        PARAMETER["Easting at false origin",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8826]],
        PARAMETER["Northing at false origin",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8827]]],
    CS[Cartesian,2],
        AXIS["easting (X)",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["northing (Y)",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Topographic mapping (medium and small scale)."],
        AREA["Canada - Quebec."],
        BBOX[44.99,-79.85,62.62,-57.1]],
    ID["EPSG",32198]]


Nous pouvons également utilisé la notation proj4string:

st_crs(polygone_sfc)$proj4string
[1] "+proj=lcc +lat_0=44 +lon_0=-68.5 +lat_1=60 +lat_2=46 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs"


st_sfc(point, crs = "+proj=lcc +lat_0=44 +lon_0=-68.5 
                               +lat_1=60 +lat_2=46 
                               +x_0=0 +y_0=0 +datum=NAD83 
                               +units=m +no_defs")
Geometry set for 1 feature 
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 3 ymin: 5 xmax: 3 ymax: 5
Projected CRS: +proj=lcc +lat_0=44 +lon_0=-68.5 
                               +lat_1=60 +lat_2=46 
                               +x_0=0 +y_0=0 +datum=NAD83 
                               +units=m +no_defs
POINT (3 5)


Ou encore référé au SCR d’un autre objet:

st_sfc(point, crs = st_crs(polygone_sfc))
Geometry set for 1 feature 
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 3 ymin: 5 xmax: 3 ymax: 5
Projected CRS: NAD83 / Quebec Lambert
POINT (3 5)


Définir des attributs

Les attributs sont les variables non-géographiques permettant de décrire les données vectorielles. Les attributs peuvent, par exemple, correspondre au nom de chaque objet ou à d’autres caractéristiques qualitatives ou numériques.

Les attributs sont répertoriés dans un objet de classe data.frame, qui est en quelque sorte une matrice dont les colonnes peuvent accueillir des données de différents types (numérique, caractère, logique, facteur, etc.).

Afin de démontrer comment joindre des attributs à des géométries géoréférencées, créons d’abord un objet sfc constitué de quatre points.

# Créer quatre vecteurs numériques
p1 <- c(3,5)
p2 <- c(5,5)
p3 <- c(4,1)
p4 <- c(2,3)
# Créer des géométries de type point
point1 <- st_point(p1)
point2 <- st_point(p2)
point3 <- st_point(p3)
point4 <- st_point(p4)
# Créer un simple feature column 
# et attribuer un SRC
points_sfc <- st_sfc(point1,point2,point3,point4, crs = 32198)
points_sfc
Geometry set for 4 features 
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 2 ymin: 1 xmax: 5 ymax: 5
Projected CRS: NAD83 / Quebec Lambert
POINT (3 5)
POINT (5 5)
POINT (4 1)
POINT (2 3)


Supposons que les points désignent des écoles primaires pouvant être publiques ou privées. Utilisons la fonction data.frame(), une fonction de base de R pour créer une table des attributs.

points_attribut <- data.frame(
  nom = c("École A", "École B", "École C", "École D"),
  nombre_eleves = c(403, 357, 280, 296),
  ecole_publique = as.logical(c(1, 1, 0, 1))
)
points_attribut
      nom nombre_eleves ecole_publique
1 École A           403           TRUE
2 École B           357           TRUE
3 École C           280          FALSE
4 École D           296           TRUE


Remarquer que chaque colonne est associée à un attribut de classe différente, comme le permet la classe data.frame.

Pour associer cette table d’attributs à l’objet points_sfc, il s’agit d’utiliser la fonction st_sf() de la bilbiothèque sf:

points_sf <- st_sf(points_sfc, points_attribut)
points_sf
Simple feature collection with 4 features and 3 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 2 ymin: 1 xmax: 5 ymax: 5
Projected CRS: NAD83 / Quebec Lambert
      nom nombre_eleves ecole_publique  points_sfc
1 École A           403           TRUE POINT (3 5)
2 École B           357           TRUE POINT (5 5)
3 École C           280          FALSE POINT (4 1)
4 École D           296           TRUE POINT (2 3)


L’objet points_sf résultant de cette opération contient deux classes:

class(points_sf)
[1] "sf"         "data.frame"

La composante de classe sf (pour simple feature) contient les attributs spatiaux des données tandis que la composante de classe data.frame contient les attributs non-spatiaux.

Cette dualité est une caractéristique importante des objets de classe sf: ceux-ci sont essentiellement des data.frames avec une extension spatiale et nous pouvons ainsi les manipuler comme des data.frames. Nous reviendrons sur ce concept au Module 7 portant sur la manipulation de données vectorielles.


La fonction st_as_sf()

La fonction st_as_sf() de la bibliothèque sf permet de créer un objet de classe sf à partir d’un objet d’une autre classe. En particulier, elle permet de convertir en un objet sf de type points un data.frame qui contient des colonnes donnant les coordonnées de chaque élément.

Donnons un exemple. Considérons le tableau suivant:

point_df <- data.frame(
  points = c("alpha" ,"beta" ,"gamma", "delta"),
  x = c(10, 20, 30, 40),
  y = c(25,  5, 15, 35)
)


Utilisons la fonction st_as_sf() avec l’argument coords.

points_sf <- st_as_sf(point_df, coords = c("x","y"))
points_sf
Simple feature collection with 4 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 10 ymin: 5 xmax: 40 ymax: 35
CRS:           NA
  points      geometry
1  alpha POINT (10 25)
2   beta  POINT (20 5)
3  gamma POINT (30 15)
4  delta POINT (40 35)


Nous pouvons également définir un SCR en utilisant l’argument crs.

points_sf <- st_as_sf(point_df, coords = c("x","y"), crs = 32182)
points_sf
Simple feature collection with 4 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 10 ymin: 5 xmax: 40 ymax: 35
Projected CRS: NAD83 / MTM zone 2
  points      geometry
1  alpha POINT (10 25)
2   beta  POINT (20 5)
3  gamma POINT (30 15)
4  delta POINT (40 35)


4.1.3 Lire un shapefile et interpréter sa géométrie

Lire les données

Nous allons lire les trois shapefiles suivants :

  • Des données vectorielles de type polygone représentant la frontière de notre zone d’étude, ici, l’île de Montréal.
  • Des données vectorielles de type ligne représentant les pistes cyclables sur l’île de Montréal, et
  • Des données vectorielles de type point représentant la position d’accidents impliquant des bicyclettes.

Dans un premier temps, nous allons ouvrir les données vectorielles de type polygone qui contiennent les limites terrestres de l’île de Montréal. Pour lire ces données nous utiliserons la fonction st_read() de la bibliothèque sf. Pour utiliser st_read() nous devons spécifier le chemin menant au fichier shapefile à lire.

limites_terrestres <- st_read("Module4/Module4_donnees/Montreal_Velo/terre/terre_shp.shp")
Reading layer `terre_shp' from data source 
  `D:\Dropbox\Teluq\Enseignement\Cours\SCI1031\Developpement\Structure_test\sci1031\Module4\Module4_donnees\Montreal_Velo\terre\terre_shp.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 72 features and 1 field
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 267500 ymin: 5029000 xmax: 306700 ymax: 5063000
Projected CRS: NAD83 / MTM zone 8


La fonction st_read() vous permet d’ores et déjà d’obtenir certaines informations sur la structure des données vectorielles que vous venez de lire: le type de géométrie (Geometry type), la dimension des données (Dimension), l’étendue spatiale des données (Bounding box), et le système de coordonnées projetées (Projected CRS). Nous explorerons ces propriétés en détail plus bas.

Nous allons maintenant lire les données vectorielles de type ligne, en utilisant encore la fonction st_read().

pistes_cyclables <- st_read("Module4/Module4_donnees/Montreal_Velo/pistes/pistes_cyclables_type.shp")
Reading layer `pistes_cyclables_type' from data source 
  `D:\Dropbox\Teluq\Enseignement\Cours\SCI1031\Developpement\Structure_test\sci1031\Module4\Module4_donnees\Montreal_Velo\pistes\pistes_cyclables_type.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 6395 features and 1 field
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: 268000 ymin: 5029000 xmax: 306300 ymax: 5063000
Projected CRS: Transverse_Mercator


Finalement, nous allons lire les données vectorielles de type point, en utilisant toujours la fonction st_read().

accidents_velo <- st_read("Module4/Module4_donnees/Montreal_Velo/accidents/accidents2018_Mtl_velo.shp")
Reading layer `accidents2018_Mtl_velo' from data source `D:\Dropbox\Teluq\Enseignement\Cours\SCI1031\Developpement\Structure_test\sci1031\Module4\Module4_donnees\Montreal_Velo\accidents\accidents2018_Mtl_velo.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 796 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 269500 ymin: 5030000 xmax: 305400 ymax: 5059000
Projected CRS: Transverse_Mercator


Remarquez que le type de géométrie (Geometry type) diffère pour les trois classes de données lues comme nous nous y attendions.

Explorer les métadonnées d’un shapefile

Les informations contenues dans un shapefile sont appelées des métadonnées. Nous sommes particulièrement intéressées aux métadonnées géospatiales.

Les métadonnées fondamentales d’un shapefile sont :

  1. Le type de géométrie : le type de classes des données vectorielles téléchargées.
  2. La projection : le système de coordonnées de référence utilisé pour représenter les données.
  3. L’étendue spatiale : la superficie géographique couvrant les données vectorielles.
Le type de géométrie

Nous pouvons explorer chacune de ces métadonnées en utilisant des fonctions de la librairie sf. Le type de géométrie est obtenu par la fonction st_geometry_type(). Par exemple, pour les limites terrestres de la ville de Montréal, cette fonction nous donne:

st_geometry_type(limites_terrestres)
 [1] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [7] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[13] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[19] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[25] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[31] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[37] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[43] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[49] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[55] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[61] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[67] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
18 Levels: GEOMETRY POINT LINESTRING ... TRIANGLE


Nous avons ainsi la confirmation que ces données vectorielles correspondent à des polygones (plus exactement, 72 polygones). Les 18 niveaux donnés en dessous constituent une liste des classes possibles de géométrie.

En comparaison, pour les données de type ligne et de type point nous obtenons plutôt :

st_geometry_type(pistes_cyclables)
   [1] MULTILINESTRING MULTILINESTRING MULTILINESTRING
   [4] MULTILINESTRING MULTILINESTRING MULTILINESTRING
   [7] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [10] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [13] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [16] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [19] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [22] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [25] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [28] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [31] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [34] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [37] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [40] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [43] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [46] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [49] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [52] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [55] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [58] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [61] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [64] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [67] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [70] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [73] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [76] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [79] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [82] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [85] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [88] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [91] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [94] MULTILINESTRING MULTILINESTRING MULTILINESTRING
  [97] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [100] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [103] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [106] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [109] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [112] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [115] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [118] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [121] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [124] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [127] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [130] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [133] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [136] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [139] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [142] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [145] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [148] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [151] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [154] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [157] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [160] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [163] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [166] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [169] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [172] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [175] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [178] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [181] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [184] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [187] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [190] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [193] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [196] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [199] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [202] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [205] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [208] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [211] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [214] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [217] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [220] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [223] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [226] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [229] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [232] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [235] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [238] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [241] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [244] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [247] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [250] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [253] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [256] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [259] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [262] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [265] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [268] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [271] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [274] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [277] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [280] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [283] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [286] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [289] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [292] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [295] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [298] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [301] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [304] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [307] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [310] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [313] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [316] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [319] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [322] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [325] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [328] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [331] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [334] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [337] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [340] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [343] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [346] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [349] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [352] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [355] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [358] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [361] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [364] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [367] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [370] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [373] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [376] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [379] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [382] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [385] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [388] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [391] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [394] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [397] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [400] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [403] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [406] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [409] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [412] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [415] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [418] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [421] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [424] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [427] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [430] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [433] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [436] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [439] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [442] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [445] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [448] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [451] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [454] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [457] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [460] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [463] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [466] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [469] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [472] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [475] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [478] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [481] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [484] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [487] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [490] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [493] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [496] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [499] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [502] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [505] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [508] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [511] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [514] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [517] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [520] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [523] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [526] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [529] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [532] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [535] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [538] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [541] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [544] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [547] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [550] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [553] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [556] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [559] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [562] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [565] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [568] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [571] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [574] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [577] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [580] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [583] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [586] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [589] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [592] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [595] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [598] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [601] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [604] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [607] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [610] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [613] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [616] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [619] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [622] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [625] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [628] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [631] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [634] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [637] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [640] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [643] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [646] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [649] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [652] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [655] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [658] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [661] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [664] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [667] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [670] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [673] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [676] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [679] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [682] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [685] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [688] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [691] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [694] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [697] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [700] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [703] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [706] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [709] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [712] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [715] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [718] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [721] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [724] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [727] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [730] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [733] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [736] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [739] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [742] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [745] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [748] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [751] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [754] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [757] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [760] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [763] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [766] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [769] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [772] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [775] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [778] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [781] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [784] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [787] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [790] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [793] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [796] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [799] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [802] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [805] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [808] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [811] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [814] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [817] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [820] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [823] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [826] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [829] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [832] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [835] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [838] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [841] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [844] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [847] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [850] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [853] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [856] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [859] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [862] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [865] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [868] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [871] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [874] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [877] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [880] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [883] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [886] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [889] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [892] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [895] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [898] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [901] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [904] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [907] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [910] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [913] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [916] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [919] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [922] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [925] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [928] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [931] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [934] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [937] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [940] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [943] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [946] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [949] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [952] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [955] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [958] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [961] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [964] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [967] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [970] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [973] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [976] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [979] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [982] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [985] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [988] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [991] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [994] MULTILINESTRING MULTILINESTRING MULTILINESTRING
 [997] MULTILINESTRING MULTILINESTRING MULTILINESTRING
[1000] MULTILINESTRING
 [ reached getOption("max.print") -- omitted 5395 entries ]
18 Levels: GEOMETRY POINT LINESTRING ... TRIANGLE


st_geometry_type(accidents_velo)
  [1] POINT POINT POINT POINT POINT POINT POINT POINT
  [9] POINT POINT POINT POINT POINT POINT POINT POINT
 [17] POINT POINT POINT POINT POINT POINT POINT POINT
 [25] POINT POINT POINT POINT POINT POINT POINT POINT
 [33] POINT POINT POINT POINT POINT POINT POINT POINT
 [41] POINT POINT POINT POINT POINT POINT POINT POINT
 [49] POINT POINT POINT POINT POINT POINT POINT POINT
 [57] POINT POINT POINT POINT POINT POINT POINT POINT
 [65] POINT POINT POINT POINT POINT POINT POINT POINT
 [73] POINT POINT POINT POINT POINT POINT POINT POINT
 [81] POINT POINT POINT POINT POINT POINT POINT POINT
 [89] POINT POINT POINT POINT POINT POINT POINT POINT
 [97] POINT POINT POINT POINT POINT POINT POINT POINT
[105] POINT POINT POINT POINT POINT POINT POINT POINT
[113] POINT POINT POINT POINT POINT POINT POINT POINT
[121] POINT POINT POINT POINT POINT POINT POINT POINT
[129] POINT POINT POINT POINT POINT POINT POINT POINT
[137] POINT POINT POINT POINT POINT POINT POINT POINT
[145] POINT POINT POINT POINT POINT POINT POINT POINT
[153] POINT POINT POINT POINT POINT POINT POINT POINT
[161] POINT POINT POINT POINT POINT POINT POINT POINT
[169] POINT POINT POINT POINT POINT POINT POINT POINT
[177] POINT POINT POINT POINT POINT POINT POINT POINT
[185] POINT POINT POINT POINT POINT POINT POINT POINT
[193] POINT POINT POINT POINT POINT POINT POINT POINT
[201] POINT POINT POINT POINT POINT POINT POINT POINT
[209] POINT POINT POINT POINT POINT POINT POINT POINT
[217] POINT POINT POINT POINT POINT POINT POINT POINT
[225] POINT POINT POINT POINT POINT POINT POINT POINT
[233] POINT POINT POINT POINT POINT POINT POINT POINT
[241] POINT POINT POINT POINT POINT POINT POINT POINT
[249] POINT POINT POINT POINT POINT POINT POINT POINT
[257] POINT POINT POINT POINT POINT POINT POINT POINT
[265] POINT POINT POINT POINT POINT POINT POINT POINT
[273] POINT POINT POINT POINT POINT POINT POINT POINT
[281] POINT POINT POINT POINT POINT POINT POINT POINT
[289] POINT POINT POINT POINT POINT POINT POINT POINT
[297] POINT POINT POINT POINT POINT POINT POINT POINT
[305] POINT POINT POINT POINT POINT POINT POINT POINT
[313] POINT POINT POINT POINT POINT POINT POINT POINT
[321] POINT POINT POINT POINT POINT POINT POINT POINT
[329] POINT POINT POINT POINT POINT POINT POINT POINT
[337] POINT POINT POINT POINT POINT POINT POINT POINT
[345] POINT POINT POINT POINT POINT POINT POINT POINT
[353] POINT POINT POINT POINT POINT POINT POINT POINT
[361] POINT POINT POINT POINT POINT POINT POINT POINT
[369] POINT POINT POINT POINT POINT POINT POINT POINT
[377] POINT POINT POINT POINT POINT POINT POINT POINT
[385] POINT POINT POINT POINT POINT POINT POINT POINT
[393] POINT POINT POINT POINT POINT POINT POINT POINT
[401] POINT POINT POINT POINT POINT POINT POINT POINT
[409] POINT POINT POINT POINT POINT POINT POINT POINT
[417] POINT POINT POINT POINT POINT POINT POINT POINT
[425] POINT POINT POINT POINT POINT POINT POINT POINT
[433] POINT POINT POINT POINT POINT POINT POINT POINT
[441] POINT POINT POINT POINT POINT POINT POINT POINT
[449] POINT POINT POINT POINT POINT POINT POINT POINT
[457] POINT POINT POINT POINT POINT POINT POINT POINT
[465] POINT POINT POINT POINT POINT POINT POINT POINT
[473] POINT POINT POINT POINT POINT POINT POINT POINT
[481] POINT POINT POINT POINT POINT POINT POINT POINT
[489] POINT POINT POINT POINT POINT POINT POINT POINT
[497] POINT POINT POINT POINT POINT POINT POINT POINT
[505] POINT POINT POINT POINT POINT POINT POINT POINT
[513] POINT POINT POINT POINT POINT POINT POINT POINT
[521] POINT POINT POINT POINT POINT POINT POINT POINT
[529] POINT POINT POINT POINT POINT POINT POINT POINT
[537] POINT POINT POINT POINT POINT POINT POINT POINT
[545] POINT POINT POINT POINT POINT POINT POINT POINT
[553] POINT POINT POINT POINT POINT POINT POINT POINT
[561] POINT POINT POINT POINT POINT POINT POINT POINT
[569] POINT POINT POINT POINT POINT POINT POINT POINT
[577] POINT POINT POINT POINT POINT POINT POINT POINT
[585] POINT POINT POINT POINT POINT POINT POINT POINT
[593] POINT POINT POINT POINT POINT POINT POINT POINT
[601] POINT POINT POINT POINT POINT POINT POINT POINT
[609] POINT POINT POINT POINT POINT POINT POINT POINT
[617] POINT POINT POINT POINT POINT POINT POINT POINT
[625] POINT POINT POINT POINT POINT POINT POINT POINT
[633] POINT POINT POINT POINT POINT POINT POINT POINT
[641] POINT POINT POINT POINT POINT POINT POINT POINT
[649] POINT POINT POINT POINT POINT POINT POINT POINT
[657] POINT POINT POINT POINT POINT POINT POINT POINT
[665] POINT POINT POINT POINT POINT POINT POINT POINT
[673] POINT POINT POINT POINT POINT POINT POINT POINT
[681] POINT POINT POINT POINT POINT POINT POINT POINT
[689] POINT POINT POINT POINT POINT POINT POINT POINT
[697] POINT POINT POINT POINT POINT POINT POINT POINT
[705] POINT POINT POINT POINT POINT POINT POINT POINT
[713] POINT POINT POINT POINT POINT POINT POINT POINT
[721] POINT POINT POINT POINT POINT POINT POINT POINT
[729] POINT POINT POINT POINT POINT POINT POINT POINT
[737] POINT POINT POINT POINT POINT POINT POINT POINT
[745] POINT POINT POINT POINT POINT POINT POINT POINT
[753] POINT POINT POINT POINT POINT POINT POINT POINT
[761] POINT POINT POINT POINT POINT POINT POINT POINT
[769] POINT POINT POINT POINT POINT POINT POINT POINT
[777] POINT POINT POINT POINT POINT POINT POINT POINT
[785] POINT POINT POINT POINT POINT POINT POINT POINT
[793] POINT POINT POINT POINT
18 Levels: GEOMETRY POINT LINESTRING ... TRIANGLE


Vous remarquez alors que les pistes cyclables sont composées de nombreuses multilignes. Une multiligne étant elle-même un ensemble de lignes. Quant aux accidents de vélo, ce sont des points qui désignent la position précise des accidents. On en compte 796 en 2018.

La projection

Vérifions maintenant la projection des shapefiles en utilisant la fonction st_crs() de la bibliothèque sf. Pour le shapefile limites_terrestres nous obtenons:

st_crs(limites_terrestres)
Coordinate Reference System:
  User input: NAD83 / MTM zone 8 
  wkt:
PROJCRS["NAD83 / MTM zone 8",
    BASEGEOGCRS["NAD83",
        DATUM["North American Datum 1983",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4269]],
    CONVERSION["MTM zone 8",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",0,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-73.5,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9999,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",304800,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["easting (E(X))",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["northing (N(Y))",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Engineering survey, topographic mapping."],
        AREA["Canada - Quebec between 75°W and 72°W.; Canada - Ontario - east of 75°W."],
        BBOX[44.98,-75,62.53,-72]],
    ID["EPSG",32188]]


La fonction st_crs() donne beaucoup d’informations. Pour connaitre la projection utilisée, le datum, le code ESPG, ou l’unité de mesure de la projection nous pouvons préciser la sortie désirée de la fonction, de la manière suivante:

st_crs(limites_terrestres)$Name
[1] "NAD83 / MTM zone 8"
st_crs(limites_terrestres)$proj4string
[1] "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs"
st_crs(limites_terrestres)$epsg
[1] 32188
st_crs(limites_terrestres)$units
[1] "m"


Ainsi, la projection du shapefile pistes_cyclables est:

st_crs(pistes_cyclables)$proj4string
[1] "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs"


Et la projection du shapefile accidents_velo est:

st_crs(accidents_velo)$proj4string
[1] "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs"


Les données de tous les shapefiles sont dans la projection de Mercator transverse (+proj=tmerc) et utilisent le Système de référence géodésique nord-américain de 1983 (+datum=NAD83).

L’étendue spatiale

L’étendue spatiale d’un objet spatial dans R, appelée le Bounding box, représente les limites géographiques des données, ou la localisation des données les plus au sud, nord, est et ouest. Pour connaître l’étendue spatiale des shapefiles nous utilisons la fonction st_bbox() de la librairie sf :

st_bbox(limites_terrestres)
   xmin    ymin    xmax    ymax 
 267517 5029232  306669 5062642 


st_bbox(pistes_cyclables)
   xmin    ymin    xmax    ymax 
 267984 5029291  306349 5062582 


st_bbox(accidents_velo)
   xmin    ymin    xmax    ymax 
 269489 5029752  305368 5059058 


Les attributs

Finalement, nous pouvons visualiser toutes les métadonnées et les attributs d’un shapefile simplement en écrivant son nom dans la console R:

limites_terrestres
Simple feature collection with 72 features and 1 field
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 267500 ymin: 5029000 xmax: 306700 ymax: 5063000
Projected CRS: NAD83 / MTM zone 8
First 10 features:
   DefaultAtt                       geometry
1        <NA> POLYGON ((299608 5038364, 2...
2        <NA> POLYGON ((301350 5036978, 3...
3        <NA> POLYGON ((300403 5038997, 3...
4        <NA> POLYGON ((300744 5039496, 3...
5        <NA> POLYGON ((302032 5043372, 3...
6        <NA> POLYGON ((302299 5043145, 3...
7        <NA> POLYGON ((302508 5040978, 3...
8        <NA> POLYGON ((304719 5062024, 3...
9        <NA> POLYGON ((304927 5062499, 3...
10       <NA> POLYGON ((305396 5062622, 3...


pistes_cyclables
Simple feature collection with 6395 features and 1 field
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: 268000 ymin: 5029000 xmax: 306300 ymax: 5063000
Projected CRS: Transverse_Mercator
First 10 features:
                       TYPE_VOIE
1         Piste cyclable sur rue
2  Piste cyclable en site propre
3              Chaussée désignée
4                 Bande cyclable
5  Piste cyclable en site propre
6  Piste cyclable en site propre
7  Piste cyclable en site propre
8              Chaussée désignée
9  Piste cyclable en site propre
10 Piste cyclable en site propre
                         geometry
1  MULTILINESTRING ((297752 50...
2  MULTILINESTRING ((305050 50...
3  MULTILINESTRING ((299076 50...
4  MULTILINESTRING ((287779 50...
5  MULTILINESTRING ((300752 50...
6  MULTILINESTRING ((300953 50...
7  MULTILINESTRING ((299010 50...
8  MULTILINESTRING ((276415 50...
9  MULTILINESTRING ((293077 50...
10 MULTILINESTRING ((304787 50...


accidents_velo
Simple feature collection with 796 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 269500 ymin: 5030000 xmax: 305400 ymax: 5059000
Projected CRS: Transverse_Mercator
First 10 features:
   FID               geometry
1    0 POINT (279673 5041015)
2    1 POINT (277292 5039169)
3    2 POINT (275581 5036314)
4    3 POINT (274728 5035946)
5    4 POINT (283935 5040875)
6    5 POINT (280442 5039871)
7    6 POINT (279626 5040700)
8    7 POINT (277734 5038853)
9    8 POINT (276487 5038090)
10   9 POINT (278357 5040125)


4.1.4 Visualisation de shapefiles sous R

Visualisation avec la librairie Mapview

Vous allez maintenant apprendre à visualiser des données shapefile en utilisant la fonction mapview() de la librairie mapview. Cette bibliothèque est une des plus simples à utiliser pour visualiser rapidement des données spatiales. Commençons par charger cette bibliothèque dans la console R:

library(mapview)

Dans un premier temps, visualisons les limites terrestres de la ville de Montréal.

mapview(limites_terrestres, col.regions = "white")


Remarquez que nous avons choisi la couleur blanche pour représenter l’intérieur des polygones délimitant la ville de Montréal. La couleur par défaut (c-à-d si on ne précise pas de couleur) est bleue.

Passez votre curseur sur la carte ainsi créée et remarquez que vous pouvez cliquer sur chacun des polygones contenus dans cette couche de données.

Remarquez aussi la légende dans le coin supérieur gauche de la carte créée et approchez-y votre curseur. Vous pouvez alors sélectionner l’un des arrière-plans disponibles. L’option “OpenStreetMap” affichera la carte produite par ce gratuiciel de cartographie pour la région entourant le polygone illustré. L’option “ESRI.WorldImagery”, quant à elle, affichera une image satellitaire de la région.

Dans un deuxième temps, visualisons les pistes cyclables. Utilisons toujours la fonction mapview() et demandons que la couleur du trait des lignes soit vert foncé. Pour définir la couleur des lignes, nous utilisons l’argument color et non l’argument col.regions.

mapview(pistes_cyclables, color = "darkgreen")


Il existe 657 couleurs prédéfinies dans R. Taper la commande colors() dans votre console R pour voir afficher le nom des couleurs. Celles-sont sont listées par ordre alphabétique sauf pour la première couleur, qui est le blanc (white). Ainsi, vous pouvez utiliser une couleur en assignant son nom ou son numéro. Pour produire la figure précédente, color = "darkgreen" aurait pu être remplacé par color = colors()[81]. Essayez pour voir.

Pour en apprendre davantage sur les couleurs dans R, vous êtes invité à consulter le site Earl Glynn et à conserver dans vos notes son tableau synthèse des couleurs dans R. Nous discuterons plus en détail des couleurs dans le Module 6 portant sur la cartographie.

Dans la carte des pistes cyclables, remarquez la légende apparue dans le coin supérieur droit. Celle-ci identifie les différentes catégories de pistes cyclables. Cette information correspond aux différentes valeurs que peut prendre l’attribut “TYPE_VOIE” du shapefile pistes_cyclables. Nous y reviendrons plus bas.

Finalement, visualisons les accidents de la route impliquant des bicyclettes.

mapview(accidents_velo, color = "red", col.regions = "red", cex = 1, legend = NULL)


La position des accidents est représentée par des points dont le contour et l’intérieur, dénotés par les arguments color et col.regions respectivement, sont de couleur rouge.

L’argument cex, quant à lui, indique la taille des cercles, la taille par défaut utilisée dans mapview est 2. Ici, nous avons demandé une taille plus petite afin de mieux différencier chacun des points.


Visualiser des données vectorielles par attribut

Lorsque nous avons affiché les métadonnées du shapefile pistes_cyclables, vous avez peut-être observé que ce dernier comprenait l’attribut TYPE_VOIE qui caractérise le type de pistes cyclables de chaque multiligne. Affichons les métadonnées à nouveau:

pistes_cyclables
Simple feature collection with 6395 features and 1 field
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: 268000 ymin: 5029000 xmax: 306300 ymax: 5063000
Projected CRS: Transverse_Mercator
First 10 features:
                       TYPE_VOIE
1         Piste cyclable sur rue
2  Piste cyclable en site propre
3              Chaussée désignée
4                 Bande cyclable
5  Piste cyclable en site propre
6  Piste cyclable en site propre
7  Piste cyclable en site propre
8              Chaussée désignée
9  Piste cyclable en site propre
10 Piste cyclable en site propre
                         geometry
1  MULTILINESTRING ((297752 50...
2  MULTILINESTRING ((305050 50...
3  MULTILINESTRING ((299076 50...
4  MULTILINESTRING ((287779 50...
5  MULTILINESTRING ((300752 50...
6  MULTILINESTRING ((300953 50...
7  MULTILINESTRING ((299010 50...
8  MULTILINESTRING ((276415 50...
9  MULTILINESTRING ((293077 50...
10 MULTILINESTRING ((304787 50...


Utilisons la fonction factor() pour convertir la classe de l’attribut TYPE_VOIE de caractère (chr) à facteur (Factor). Puis, utilisons la fonction levels() pour connaître ces types de voie cyclable. La fonction levels donne les différentes valeurs que peut prendre un attribut.

pistes_cyclables$TYPE_VOIE <- factor(pistes_cyclables$TYPE_VOIE)
levels(pistes_cyclables$TYPE_VOIE)
[1] "Bande cyclable"                      
[2] "Chaussée désignée"                   
[3] "Piste cyclable au niveau du trottoir"
[4] "Piste cyclable en site propre"       
[5] "Piste cyclable sur rue"              
[6] "Sentier polyvalent"                  


Si vous ne connaissez pas la distinction entre ces types d’aménagement cyclable, consulter ce document sommaire de la Ville de Montréal31

Dans la figure précédente illustrant les pistes cyclables, celles-ci étaient illustrées en vert peu importe leur type. Nous voulons maintenant représenter les six types de voie cyclable par six couleurs différentes. Un des avantages de la fonction mapview() est qu’elle est capable d’emblée de distinguer les différentes valeurs que peut prendre un attribut. Ainsi, nous pouvons simplement demander:

mapview(pistes_cyclables)


Le shapefile pistes_cyclables contient un seul attribut, “TYPE_VOIE”. Si un shapefile contient plus d’un attribut, il faut spécifier celui qu’on veut représenter en argument à la fonction mapview(). Dans le cas présent, nous aurions plutôt demandé: `mapview(pistes_cyclables, z = “TYPE_VOIE”).

Par défaut, la fonction mapview() pour les données vectorielles utilise la palette de couleur viridis. Une palette de couleur est un ensemble de plusieurs couleurs prédéfinies et stockées dans un vecteur. Il existe plusieurs palettes de couleur prédéfinies et nous y reviendrons également au Module 6 portant sur la cartographie. La palette viridis forme un gradient allant du mauve au jaune en passant par le bleu et le vert (Fig 4.1):

Palette viridis contenant 20 couleurs différentes

FIGURE 4.1: Palette viridis contenant 20 couleurs différentes


Un utilisateur de R peut utiliser des palettes prédéfinies, ou encore définir les siennes. Par exemple, si nous trouvons que les couleurs de la palette viridis ne permettent pas de bien différencier les différents types de piste cyclable, nous pouvons nous-même créer une palette contenant six couleurs (car il y a six valeurs possibles pour cet attribut).

couleurs_voie <- c("black","goldenrod", "cornflowerblue", "darkcyan", "hotpink", "mediumpurple")


Nous pouvons ajouter cet argument à la fonction mapview():

mapview(pistes_cyclables, color=couleurs_voie, layer.name = "Types de pistes cyclables", lwd = 1 )



Remarquez que nous avons changé le titre de la légende en utilisant l’argument layer.name, et que nous avons réduit l’épaisseur des lignes en utilisant l’argument lwd.


Visualiser plusieurs shapefiles

Nous allons maintenant représenter les données vectorielles limites terrestres, pistes_cyclables et accidents_velo au sein d’une même figure. Il s’agit de définir individuellement chacune des cartes comme un objet mapview et de les additionner en utilisant l’opérateur +.

map_limites_terrestres <- mapview(limites_terrestres, col.regions = "darkgray", legend = NULL)
map_pistes_cyclables <- mapview(pistes_cyclables, color=couleurs_voie, 
                               layer.name = "Types de pistes cyclables", lwd = 1)
map_accidents <- mapview(accidents_velo, color = "red", 
                         col.regions = "red", cex = 1, legend = NULL)

map_limites_terrestres + map_pistes_cyclables + map_accidents


4.1.5 Reprojection de données vectorielles sous R

Dans cette section, vous apprendrez à manipuler le système de coordonnées de référence de données vectorielles. Nous avons vu en début de leçon que les données utilisées sont dans la projection de Mercator transverse (tmerc) et utilisent le Système de référence géodésique nord-américan de 1983 (NAD83). Par exemple, pour connaître la projection des données limites_terrestres, nous avions fait:

st_crs(limites_terrestres)$proj4string
[1] "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +datum=NAD83 +units=m +no_defs"


Nous allons maintenant transformer le SCR vers la projection de Robinson (robin) et le Système géodésique mondial de 1984 (WGS84). Pour ce faire, nous utilisons la fonction st_transform() de la bibliothèque st.

##limites_terrestres_rob <- st_transform(limites_terrestres,
 ##   CRS("+proj=robin +datum=WGS84"))
limites_terrestres_rob <- st_transform(limites_terrestres, CRS("+proj=robin +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" ))


Comparons les données transformées avec les données initiales. Pour ce faire, nous voulons représenter les deux cartes l’une à côté de l’autre. La bibliothèque leafsync associée à la bibliothèque leaflet permet de créer facilement des figures avec des panneaux multiples. Nous discuterons plus en détail de ces bibliothèques dans le Module 6 portant sur la cartographie. Installez la bibliothèque leafsync si ce n’est pas déjà fait, et chargez-là dans votre session de travail.

library(leafsync)


Représentons maintenant les deux projections différentes en utilisant la fonction latticeView() de la bibliothèque leafsync. Puisque cette fonction existe à la fois dans la bibliothèque leafsync et dans la bibliothèque mapview mais qu’elle est obsolète dans cette dernière, nous devons préciser que nous voulons la fonction latticeView()de la bibliothèqueleafsyncen utilisant la notation suivante:leafsync::latticeView`.

map_mercator <- mapview(limites_terrestres, legend = FALSE, col.regions = "red")
map_robinson <- mapview(limites_terrestres_rob, legend = FALSE)
Map <- leafsync::latticeView(map_mercator,map_robinson, ncol = 2)
Map


Nous remarquons que les deux cartes sont identiques (outre la couleur)! Comment cela est-ce possible sachant que nous venons de transformer la projection ? Ceci s’explique par le fait que la fonction mapview() représente par défaut toutes données spatiales dans la projection Pseudo-Mercator (ou Mercator Web), qui est la projection utilisée par l’application OpenStreetMap. Ainsi, la fonction mapview calcule elle-même le changement de projection avant de représenter des données spatiales. Pour conserver la projection originale, il faut utiliser l’argument native.crs=TRUE.

Représentons à nouveau les cartes des limites terrestres de la région de Montréal, cette fois en précisant que nous voulons conserver le CRS d’origine.

map_web <- mapview(limites_terrestres, col.regions = "red", legend = NULL, layer.name = "Mercator Web")
map_mercator <- mapview(limites_terrestres, col.regions = "yellow", legend = NULL, layer.name = "Mercator", native.crs=TRUE)
map_robinson <- mapview(limites_terrestres_rob, legend = NULL, layer.name = "Robinson", native.crs=TRUE)

Map <- leafsync::latticeView(map_web,map_mercator,map_robinson, ncol = 3)
Map


Remarquez que nous avons utilisé l’argument ncol dans la fonction latticeview pour spécifier le nombre de colonnes - c-à-d le nombre de panneaux verticaux qu’aura cette image.

Finalement, pour sauvegarder des données vectorielles, nous utilisons la fonction st_write() de la bibliothèque st, de la même façon que nous avons utilisé la fonction st_read() en début de leçon. Par exemple, sauvegardons les données limites_terrestres_rob que nous venons de créer.


4.1.6 Lire une géodatabase et explorer ses couches

Dans cette section, nous allons explorer les données vectorielles d’une géodatabase du Ministère de l’Éducation et de l’Enseignement supérieur du Québec (MEES).

Ces données se trouvent dans le dossier Donnees_Ouvertes_MEES.gbd que vous avez normalement téléchargé au début de la leçon.


Lire les données

Dans la section portant sur le format des données vectorielles du Module 2, nous avons expliqué qu’une géodatabase est une façon de rassembler et d’organiser des données propres à un sujet dans une unique base de données.

La géodatabase Donnees_Ouvertes_MEES.gdb contient plusieurs couches de données vectorielles (layers) sur les établissements d’enseignement au Québec.

Pour lire et explorer une géodatabase, on continue à utiliser la bibliothèque sf. Chaque couche peut être lue individuellement en utilisant la fonction st_read(): st_read("nom_de_la_geodatabase.gdb", layer = "nom_de_la_couche"). Il est donc nécessaire de connaître d’abord les noms donnés aux couches composant la géodatabase - information qui nous est, pour l’instant, inconnue.

Pour connaître les couches d’une géodatabase, nous utilisons la fonction st_layers().

couches_mees <- st_layers("Module4/Module4_donnees/Donnees_Ouvertes_MEES.gdb")
couches_mees
Driver: OpenFileGDB 
Available layers:
                layer_name geometry_type features
1                   CS_STA Multi Polygon        3
2                   CS_FRA Multi Polygon       60
3                   CS_ANG Multi Polygon        9
4               CS_STA_GEN Multi Polygon        3
5               CS_ANG_GEN Multi Polygon        9
6               CS_FRA_GEN Multi Polygon       60
7               CS_FRA_SDA Multi Polygon       60
8               CS_ANG_SDA Multi Polygon        9
9               CS_STA_SDA Multi Polygon        3
10  PPS_Public_SSocial_Org         Point     2748
11  PPS_Prive_Installation         Point      350
12 PPS_Prive_Etablissement         Point      261
13      PPS_Gouvernemental         Point       37
14   PPS_Public_SSocial_CS         Point       72
15        ES_Universitaire         Point       22
16        PPS_Public_Ecole         Point     5202
17     PPS_Public_Immeuble         Point     4641
18            ES_Collegial         Point      311
   fields                 crs_name
1       9 WGS 84 / Pseudo-Mercator
2       9 WGS 84 / Pseudo-Mercator
3       9 WGS 84 / Pseudo-Mercator
4       9 WGS 84 / Pseudo-Mercator
5       9 WGS 84 / Pseudo-Mercator
6       9 WGS 84 / Pseudo-Mercator
7       9 WGS 84 / Pseudo-Mercator
8       9 WGS 84 / Pseudo-Mercator
9       9 WGS 84 / Pseudo-Mercator
10     24 WGS 84 / Pseudo-Mercator
11     24 WGS 84 / Pseudo-Mercator
12     15 WGS 84 / Pseudo-Mercator
13     22 WGS 84 / Pseudo-Mercator
14     16 WGS 84 / Pseudo-Mercator
15     17 WGS 84 / Pseudo-Mercator
16     29 WGS 84 / Pseudo-Mercator
17     22 WGS 84 / Pseudo-Mercator
18     17 WGS 84 / Pseudo-Mercator


Nous observons que la géodatabase contient 18 couches différentes. Nous pouvons connaître le nom donné à chaque couche (layer_name), leur géométrie (geometry_type), le nombre d’objets vectoriels qu’elles contiennent (features), et le nombre d’attributs qu’elles décrivent (fields).

Les couches dont le nom commence par CS_ contiennent des données vectorielles relatives aux centres de services scolaires32. Puisque chacun de ces centres couvre un territoire qui leur est propre, ces données sont des multipolygones.

Les couches dont le nom commence par PPS_ et ES_ contiennent des données vectorielles relatives aux établissements d’enseignement primaire, secondaire et supérieur. Puisque chacun de ces établissements est identifié par une paire de coordonnées, ces données sont des points.

Lisons les données vectorielles de la couche PPS_Public_Ecole en utilisant la fonction st_read().

ecoles_pub <- st_read("Module4/Module4_donnees/Donnees_Ouvertes_MEES.gdb", layer = "PPS_Public_Ecole")
Reading layer `PPS_Public_Ecole' from data source 
  `D:\Dropbox\Teluq\Enseignement\Cours\SCI1031\Developpement\Structure_test\sci1031\Module4\Module4_donnees\Donnees_Ouvertes_MEES.gdb' 
  using driver `OpenFileGDB'
Simple feature collection with 5202 features and 29 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -8849000 ymin: 5623000 xmax: -6360000 ymax: 8958000
Projected CRS: WGS 84 / Pseudo-Mercator


Cette couche donne la localisation des 5202 écoles primaires et secondaires publiques de la province ainsi que 28 autres attributs associés à ces établissements.

Notez que le système de coordonnées de référence: le datum WGS84 et la projection Pseudo-Mercator (ou Mercator Web) sont utilisés.

Notez aussi que cette couche de la géodatabase possède la même structure que celle d’un shapefile.

Nous pouvons visualiser la position des écoles publiques du Québec en utilisant la fonction mapview() de la bibliothèque mapview.

mapview(ecoles_pub)


Nous remarquons qu’il est difficile de visualiser la position des écoles dans la région Sud du Québec car il y a énormément de points.

Explorer les attributs d’une couche

Pour explorer les attributs associés à la couche ecoles_pub, commençons d’abord par utiliser la fonction names() qui retourne le nom associé à chaque attribut de la couche.

names(ecoles_pub)
 [1] "DT_MAJ_GDUNO"           
 [2] "COMBINE_NUO_NUI"        
 [3] "CD_ORGNS"               
 [4] "NOM_COURT_ORGNS"        
 [5] "NOM_OFFCL_ORGNS"        
 [6] "ADRS_GEO_L1_GDUNO_ORGNS"
 [7] "ADRS_GEO_L2_GDUNO_ORGNS"
 [8] "CD_POSTL_GDUNO_ORGNS"   
 [9] "CD_MUNCP_GDUNO_ORGNS"   
[10] "NOM_MUNCP_GDUNO_ORGNS"  
[11] "CD_IMM"                 
[12] "NOM_IMM"                
[13] "ADRS_GEO_L1_GDUNO_IMM"  
[14] "ADRS_GEO_L2_GDUNO_IMM"  
[15] "CD_MUNCP_GDUNO_IMM"     
[16] "NOM_MUNCP_GDUNO_IMM"    
[17] "CD_POSTL_GDUNO_IMM"     
[18] "PRESC"                  
[19] "PRIM"                   
[20] "SEC"                    
[21] "FORM_PRO"               
[22] "ADULTE"                 
[23] "SITE_WEB_ORGNS"         
[24] "COORD_X_LL84_IMM"       
[25] "COORD_Y_LL84_IMM"       
[26] "ORDRE_ENS"              
[27] "CD_CS"                  
[28] "TYPE_CS"                
[29] "STYLE_CART"             
[30] "SHAPE"                  


Notre première réaction à la lecture de ces noms est qu’ils ne sont pas tous intuitifs! Examinons les quatre attributs suivants: “NOM_OFFCL_ORGNS”, “NOM_MUNCP_GDUNO_IMM”, “TYPE_CS”, et “SHAPE”.

L’attribut “NOM_OFFCL_ORGNS” correspond au nom de chaque école publique. On peut lire les premières entrées de cette liste de noms en utilisant la fonction head():

head(ecoles_pub$NOM_OFFCL_ORGNS)
[1] "Centre de formation professionnelle de Mont-Joli-Mitis"
[2] "Centre de formation des adultes de Mont-Joli-Mitis"    
[3] "École des Alizés"                                      
[4] "École de l'Écho-des-Montagnes-Lavoie"                  
[5] "École de Mont-Saint-Louis-Saint-Rosaire"               
[6] "École des Sources"                                     


L’attribut “NOM_MUNCP_GDUNO_IMM” correspond au nom de la municipalité dans laquelle se trouve une école publique. Pour avoir un aperçu des valeurs données, on utilise encore la fonction head:

head(ecoles_pub$NOM_MUNCP_GDUNO_IMM)
[1] "Mont-Joli"               
[2] "Mont-Joli"               
[3] "Mont-Joli"               
[4] "Saint-Fabien"            
[5] "Rimouski"                
[6] "Saint-Anaclet-de-Lessard"


L’attribut “TYPE_CS” identifie les écoles selon leur appartenance à une commission scolaire francophone, anglophone ou à statut linguistique particulier.

head(ecoles_pub$TYPE_CS)
[1] "Franco" "Franco" "Franco" "Franco" "Franco"
[6] "Franco"


Il y a trois types de commissions scolaires possibles: Anglo, Franco, et Statut. Il est possible d’obtenir cette information en utilisant la fonction levels() précédée de la fonction as.factor():

levels(as.factor(ecoles_pub$TYPE_CS))
[1] "Anglo"  "Franco" "Statut"


Finalement, l’attribut “SHAPE” donne la position géographique de chaque école publique et les métadonnées spatiales associées à cette couche:

head(ecoles_pub$SHAPE)
Geometry set for 6 features 
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -7666000 ymin: 6156000 xmax: -7590000 ymax: 6205000
Projected CRS: WGS 84 / Pseudo-Mercator
First 5 geometries:
POINT (-7590676 6204635)
POINT (-7590676 6204635)
POINT (-7590441 6205128)
POINT (-7665998 6156083)
POINT (-7648497 6168694)


Sélection d’un sous-ensemble de données

Pour simplifier la visualisation de cette couche, nous allons nous concentrer sur les écoles de la municipalité de Montréal. Pour ce faire, nous créons un nouveau shapefile en sélectionnant les données propres à la municipalité de Montréal:

ecoles_pub_Mtl<- ecoles_pub[ecoles_pub$NOM_MUNCP_GDUNO_IMM == "Montréal",]


Interprétons cette ligne de commande: elle utilise l’opérateur logique == pour sélectionner les écoles publiques de la municipalité de Montréal, ainsi que tous les autres attributs au sein de la couche ecoles_pub.

Visualisons maintenant ce nouveau shapefile en utilisant la fonction mapview().

map_pub_mtl<-mapview(ecoles_pub_Mtl, cex = 2)
map_pub_mtl


Ici, nous avons utilisé l’argument cex pour diminuer la taille des points sur la carte (la taille par défaut est 6). En cliquant sur l’un ou l’autre des points, vous obtiendrez l’ensemble des attributs propres à l’école sélectionnée.

Nous pouvons également assigner des couleurs aux données vectorielles en fonction des valeurs d’un de ses attributs. Ceci est possible en utilisant l’argument zcol de la fonction mapview() et en lui assignant de nom de l’attribut que nous désirons illustrer. Utilisons, par exemple, l’attribut “TYPE_CS” qui indique la langue de la commission scolaire.

mapview(ecoles_pub_Mtl, zcol = "TYPE_CS", cex = 2, layer.name = 'Commissions scolaires')


De façon similaire, nous aurions pu représenter les écoles de l’île de Montréal selon le niveau d’enseignement qu’on y dispense. Cette information est donnée par l’attribut “ORDRE_ENS”.

mapview(ecoles_pub_Mtl, zcol = "ORDRE_ENS", cex = 2, layer.name = 'Enseignement')


Visualisation de plusieurs couches d’une géodatabse

Nous voulons visualiser d’autres types d’établissement d’enseignement donnés dans la géodatabase du Ministère de l’Éducation et de l’Enseignement supérieur du Québec. Choisissons les écoles privées, les établissements de niveau collégial (e.g. CÉGEP) et les universités. Pour ce faire, nous utilisons encore la fonction st_read en spécifiant le nom de la couche (layer) désirée.

ecoles_priv <- st_read("Module4/Module4_donnees/Donnees_Ouvertes_MEES.gdb", layer = "PPS_Prive_Etablissement")
Reading layer `PPS_Prive_Etablissement' from data source `D:\Dropbox\Teluq\Enseignement\Cours\SCI1031\Developpement\Structure_test\sci1031\Module4\Module4_donnees\Donnees_Ouvertes_MEES.gdb' 
  using driver `OpenFileGDB'
Simple feature collection with 261 features and 15 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -8442000 ymin: 5623000 xmax: -7391000 ymax: 6484000
Projected CRS: WGS 84 / Pseudo-Mercator
college<- st_read("Module4/Module4_donnees/Donnees_Ouvertes_MEES.gdb", layer = "ES_Collegial")
Reading layer `ES_Collegial' from data source 
  `D:\Dropbox\Teluq\Enseignement\Cours\SCI1031\Developpement\Structure_test\sci1031\Module4\Module4_donnees\Donnees_Ouvertes_MEES.gdb' 
  using driver `OpenFileGDB'
Simple feature collection with 311 features and 17 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -8795000 ymin: 5661000 xmax: -6892000 ymax: 6486000
Projected CRS: WGS 84 / Pseudo-Mercator
univ <- st_read("Module4/Module4_donnees/Donnees_Ouvertes_MEES.gdb", layer = "ES_Universitaire")
Reading layer `ES_Universitaire' from data source 
  `D:\Dropbox\Teluq\Enseignement\Cours\SCI1031\Developpement\Structure_test\sci1031\Module4\Module4_donnees\Donnees_Ouvertes_MEES.gdb' 
  using driver `OpenFileGDB'
Simple feature collection with 22 features and 17 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -8795000 ymin: 5679000 xmax: -7627000 ymax: 6182000
Projected CRS: WGS 84 / Pseudo-Mercator


Toujours dans le but de simplifier la visualisation, sélectionnons au sein des couches ecoles_priv, college et univ les établissements situés à Montréal. Attention, pour ces couches le nom de l’attribut associé à la municipalité où se situent les établissements listés est “NOM_MUNCP” et non “NOM_MUNCP_GDUNO_IMM”.

ecoles_priv_Mtl <- ecoles_priv[ecoles_priv$NOM_MUNCP == "Montréal",] 
college_Mtl <- college[college$NOM_MUNCP == "Montréal",]
univ_Mtl <- univ[univ$NOM_MUNCP == "Montréal",]


Nous pouvons visualiser chacun de ces nouveaux shapefile individuellement en utilisant la fonction mapview(), mais plus intéressant encore est de les visualiser ensemble au sein d’une même carte. Pour ce faire, nous créons d’abord des cartes individuelles.

map_priv_mtl <- mapview(ecoles_priv_Mtl, color = "red", col.regions = "red", cex = 2)
map_college_mtl <- mapview(college_Mtl, color = "green", col.regions = "green", cex = 4)
map_univ_mtl <- mapview(univ_Mtl, color = "orange", col.regions = "orange", cex = 6)


Remarquez que nous utilisons différentes tailles de points et différentes couleurs pour bien différencier le type d’institution dans la carte qui les combinera. La couleur du contour du point est donnée par l’argument color et celle de l’intérieur du point par l’argument col.regions. Nous combinons toutes les couches par une simple addition des cartes individuelles.

map_pub_mtl + map_priv_mtl + map_college_mtl + map_univ_mtl


Dans le menu du coin supérieur gauche de la carte, remarquez que vous pouvez sélectionner/désélectionner chaque couche selon l’information que vous désirez explorer.

Il serait intéressant de créer une nouvelle géodatabase pour sauvegarder les quatre nouveaux shapefiles des institutions d’enseignement à Montréal au sein d’une même structure. Malheureusement, R peut seulement lire des géodatabases mais ne peut pas sauvegarder ce format qui est propriétaire de ESRI. Ainsi, il faudrait utiliser la fonction st_write() pour sauvegarder chacun des shapefiles individuellement.



  1. Ville de Montréal. Aménagements cyclables. Repéré le 19 mars 2020↩︎

  2. Les centres de services scolaires (qui remplacent les commissions scolaires depuis 2020) ont pour rôle d’épauler les établissements d’enseignement situés sur leur territoire. Pour plus d’informations, consultez le site web du MEES32↩︎