Jean-Hugues Roy

Expériences | réflexions | scrapbook

L’oléoduc Énergie Est en 701 points UTM

Le 5 décembre, Pierre Chauvin, journaliste que je ne connaissais pas, m’a posé cette question sur Twitter:

TweetLeChauvin

 

Je lui ai proposé une solution, PDF Tables, un outil mis au point par ScraperWiki. Mais M. Chauvin l’avait déjà essayée et ça ne répondait pas à ses besoins.

Ce qu’il cherchait à faire, c’était d’extraire les tableaux se trouvant à la gauche de ces cartes du tracé de l’oléoduc Énergie est au Québec:

TracéEnergieEst

Ces tableaux donnaient une description de tous les cours d’eau croisés par l’oléoduc projeté par la société TransCanada et les coordonnées des intersections. On en trouve 701 dans le document original complet est accessible en ligne. J’ai moi aussi essayé d’extraire ces tableaux, mais en vain. Même si le PDF est «natif», les cartes viennent tout bousiller pour les services d’extraction.

Finalement, j’ai trouvé la même information dans un autre document sur le site de l’Office national de l’Énergie. Je l’ai signalé à Pierre Chauvin qui a pu procéder à l’extraction des tableaux qu’il contenait.

Coordonnées UTM vs LatLong

Mais un autre obstacle s’est dressé sur sa route. Les coordonnées des points qui se trouvaient dans le second document n’étaient pas exprimées en degrés de longitude ou de latitude:

UTM

Horreur!

C’est le système UTM, basé sur la projection de Mercator, tristement célèbre pour déformer les régions proches des pôles. Le système UTM a ses avantages, paraît-il. Mais pour nous, simples mortels, c’est du chinois et on a besoin de traduire ces coordonnées étranges en rassurantes latitudes et longitudes.

Pierre Chauvin s’y est attaqué et il y est parvenu. Il m’a recontacté, le 17 décembre, pour me faire part de sa recette. En gros, il est passé par un site britannique, Nearby, qui propose un API gratuit. Il faut cependant s’inscrire pour obtenir une clé, car le propriétaire du site veut éviter les abus. Voici le tutoriel complet de Pierre, en quinze étapes (en anglais), si jamais vous tombez sur des coordonnées en UTM.

Pierre a fait un gros boulot. Et en voyant cela, je me suis dit qu’il doit y avoir moyen de faire plus simple.

En cherchant un peu, j’ai trouvé une librairie ruby qui convertit des coordonnées UTM en coordonnées de latitude et de longitude. Elle s’appelle tout bonnement coordinate-converter et on peut l’intégrer dans un script dans lequel on utilise la formule magique suivante:

Coordinates.utm_to_lat_long(ellipsoide, northing, easting, zone)

La formule, une méthode, en fait, demande quatre arguments:

l’ellipsoïde de référence (le plus souvent, on peut écrire « WGS-84 ».

northing (qu’on traduit en français par «vers le nord»):

UTM - northing

easting:

UTM - easting

zone (la Terre est découpée en 60 de ces zones dans le système UTM):

UTM - zone

Et la formule nous retourne un hash à deux paires contenant chacune la latitude et la longitude du point:

# => {:lat => 46.2399303597183, :long => -74.92496237547609}

Pierre Chauvin m’a gracieusement donné son fichier CSV de départ, issu de l’extraction des tableaux du document de l’ONÉ. Il ne contient que trois colonnes, comme ce qu’on voit dans les captures d’écran ci-haut: un numéro d’intersection (Crossing ID), le nom du cours d’eau croisé et les coordonnées UTM du point.

Je m’en suis servi pour écrire un court script qui extrait ces coordonnées, les traduit en coordonnées de longitude et de latitude, et pond un deuxième CSV contenant toutes ces informations et dont on peut se servir pour placer les points sur une carte à l’aide d’un service comme CartoDB ou ArcGIS.

Voici le script, que j’ai baptisé transcanada.rb et qui contient 42 lignes:

#!/usr/bin/env ruby
# ©2014 Jean-Hugues Roy. GNU GPL v3.

require "csv"
require "coordinate-converter"

fichierAvant = "TransCanadaQC-UTM.csv"
fichierApres = "TransCanadaQC-LatLong.csv"

transcanada = CSV.read(fichierAvant, headers:true)
tout = []

transcanada.each do |point|
	nouv = {}
	ref = "WGS-84"
	easting = point[2][point[2].index("E ")+2..point[2].index("\nN ")-2].gsub(",",".").to_f
	northing = point[2][point[2].index("\nN ")+3..-1].gsub(",",".").to_f
	zone = point[2][0..2]
	coord = Coordinates.utm_to_lat_long(ref,northing,easting,zone)
	lat = coord[:lat]
	long = coord[:long]
	puts coord, lat, long, easting, northing, zone
	puts "="*50
	nouv["Nom"] = point[0]
	nouv["Description"] = point[1].gsub("\n","")
	nouv["UTM"] = point[2]
	nouv["Zone"] = zone
	nouv["Easting"] = easting
	nouv["Northing"] = northing
	nouv["Latitude"] = lat
	nouv["Longitude"] = long
	tout.push nouv
end

puts tout

CSV.open(fichierApres, "wb") do |csv|
  csv << tout.first.keys
  tout.each do |hash|
    csv << hash.values
  end
end

En prime, voici la carte des points qui reproduit fidèlement le tracé de l’oléduc projeté.


 

1 commentaire

Commentez
  1. Well, truth be told, I have never before wkoerd with UTM coordinates, but after looking into it a bit, it isn’t all that hard. Depending in which UTM zone you are in (I for one, am in zone 31U; 31 being the zone and U’ being the latitude band; see also ). Every UTM longitude zone has a particular Cartesian coordinate system (i.e. local xy coordinate system) associated to it. The UTM easting and northing coordinates are the x and y coordinates, respectively, of this system. Each longitude zone (in my case zone 31) has a central meridian midway between its two bounding meridians. The central meridian of each longitude zone is assigned the easting coordinate 500000m (i.e., x= 500 000 m). The UTM northing (y) coordinate increases continuously as one moves northward. In the northern hemisphere the equator is assigned the northing coordinate of 0m N (i.e. y=0 m). In the southern hemisphere the equator is assigned the northing coordinate of 10000000m N (i.e., y=10 000 000 m).So, assuming you have the UTM coordinates for a particular zone, and lets say your survey points are located in the northern hemisphere, all you need to do is define your 0,0 (x,y) point in your drawing. Your drawing needs to be set to the WCS (World Coordinate System) which you will have to define (somewhere in you title block information) as being the equator and 500 000 m west of the centerline (central meridian) of your particular zone. Setting up your survey points should be very easy then, as you can set those up by simply placing them on the x and y axis. Depending on how precise your survey points are, you might want to set your units to mm, despite the UTM system being in meters. You can just at the UTM coordinates you have: If there are 3 digits after the comma (for instance, you can set up your drawing in mm (which I would recommend anyway, if you are using the metric system).Hopefully this will help a bit.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Jean-Hugues Roy [CC] BY-NC-SA, 1988-aujourd'hui Frontier Theme