Introduction À PostGIS
Introduction À PostGIS
des
applications
et
des
Contenu de larchive
Dans larchive lie ce document, vous trouverez:
workshop/
un rpertoire contenant ce document au format HTML
software/
un rpertoire contenant tous les logiciels que nous installerons
data/
un rpertoire contenant les fichier au format Shapefiles que nous utiliserons
Lensemble des donnes prsentes dans cette archive sont du domaine public et
librement redistribuables. Toute les applications de larchive sont des logiciels
libres, et librement redistribuables. Le document est publi sous licence Creative
Commons share alike with attribution, et est librement redistribuable en
respectant les termes de cette license.
Bienvenue
Partie 1 : Introduction
Partie 2 : Installation
Partie 20 : Validit
Partie 22 : galit
Annexes B : Glossaire
Annexes C : License
PostGIS - [Link]
o Documentation - [Link]
PostgreSQL - [Link]
o Tlchargement - [Link]
o Documentation - [Link]
o JDBC Driver - [Link]
o .Net Driver - [Link]
o Python Driver - [Link]
o C/C++ Driver - [Link]
Bienvenue
Conventions dcriture
Cette section prsente les diffrentes conventions dcriture qui seront utilises dans ce
document afin den faciliter la lecture.
Indications
Les indications pour vous, lecteurs de ce document, seront notes en gras.
Par exemple:
Cliquez sur Suivant pour continuer.
Code
Les exemples de requtes SQL seront affichs de la manire suivante :
SELECT postgis_full_version();
Cet exemple peut tre saisi dans la fentre de requtage ou depuis linterface en ligne de
commande.
Notes
Les notes sont utilises pour fournir une information utile mais non critique pour la
comprhension globale du sujet trait.
Note
Si vous navez pas mang une pomme aujourdhui, le docteur devrait se mettre en route.
Fonctions
Lorsque les noms de fonctions sont contenus dans une phrase, ils sont affichs en gras.
Par exemple:
ST_Touches(geometry A, geometry B) retourne vrai si un des contours de gomtrie touche lautre
contour de gomtrie
Menus et formulaires
Les menus et les lments de formulaire comme les champs ou les botes cocher ainsi que
les autre objets sont affichs en italique.
Par exemple:
Cliquez sur Fichier > Nouveau. Cochez la case qui contient Confirmer.
Organisation
Les diffrentes sections de ce document permettent dvoluer progressivement. Chaque section
suppose que vous ayez termin et compris les sections prcdentes.
Certaines sections fournissent des exemples fonctionnels ainsi que des exercices. Dans
certains cas, il y a aussi des sections Les choses essayer pour les curieux. Ces tches
contiennent des problmes plus complexes que dans les exercices.
Partie 1 : Introduction
Utiliss de manire combine, les types de donnes spatiales, les index et les fonctions
fournissent une structure flexible pour optimiser les performances et les analyses.
Au commencement
Dans les premires implmentations SIG, toutes les donnes spatiales taient stockes sous la
forme de fichiers plats et certaines applications SIG spcifiques taient ncessaires pour les
interprter et les manipuler. Ces outils de gestion de premire gnration avaient t conus
pour rpondre aux besoins des utilisateurs pour lesquels toutes les donnes taient localises
au sein de leur agence. Ces outils propritaires taient des systmes specifiquement crs
pour grer les donnes spatiales.
La seconde gnration des systmes de gestion de donnes spatiales stockait certaines
donnes dans une base de donnes relationelle (habituellement les attributs ou autres parties
non spatiales) mais ne fournissaient pas encore la flexibilit offerte par une intgration complte
des donnes spatiales.
Effectivement, les bases de donnes spatiales sont nes lorsque les gens ont commenc
considrer les objet spatiaux comme les autres objets dune base de donnes .
Les bases de donnes spatiales intgrent les donnes spatiales sous forme dobjets de la base
de donnes relationnelle. Le changement opr passe dune vision centre sur le SIG une
vision centre sur les bases de donnes.
Note :
Un systme de gestion de base de donnes peut tre utilis dans dautres cadres que celui des
SIG. Les bases de donnes spatiales sont utilises dans divers domaines : lanatomie humaine,
les circuits intgrs de grandes envergures, les structures molculaires, les champs electromagntiques et bien dautres encore.
proprits de lentit gographique comme ses contours ou sa dimension. Pour bien des
aspects, les types de donnes spatiales peuvent tre vus simplement comme des formes.
Les types de donnes spatiales sont organiss par une hirarchie de type. Chaque sous-type
hrite de la structure (les attributs) et du comportement (les mthodes et fonctions) de son type
suprieur dans la hierarchie.
Les tendues sont utilises car rpondre la question : est-ce que A se trouve lintrieur de
B ? est une opration coteuse pour les polygones mais rapide dans le cas ou ce sont des
rectangles. Mme des polygones et des lignes complexes peuvent tre reprsents par une
simple tendue.
Les index spatiaux doivent raliser leur ordonnancement rapidement afin dtre utiles. Donc au
lieu de fournir des rsultats exacts, comme le font les arbres binaires, les index spatiaux
fournissent des rsultats approximatifs. La question quelles lignes sont lintrieur de ce
polygone sera interprte par un index spatial comme : quelles lignes ont une tendue qui est
contenue dans ltendue de ce polygone ?
Les incrments spatiaux rels mis en application par diverses bases de donnes varient
considrablement. Les index spatiaux actuellement utiliss par les diffrents systmes de
gestion de bases de donnes varient aussi considrablement. Limplmentation la plus
commune est larbre R (utilis dans PostGIS), mais il existe aussi des implmentations de
type Quadtrees, et des index bass sur une grille.
2. Gestion: fonctions qui permettent de grer les informations relatives aux tables spatiales et
ladministration de PostGIS.
3. Rcupration: fonctions qui permettent de rcuprer les proprits et les mesures dune
gomtrie.
4. Comparaison: fonctions qui permettent de comparer deux gomtries en respectant leurs
relations spatiales.
5. Contruction: fonctions qui permettent de construire de nouvelles gomtries partir dautres.
La liste des fonctions possibles est trs vaste, mais un ensemble commun lensemble des
implmentations est dfini par la spcification term:OGC SFSQL. Cet ensemble commun (avec
dautres fonctions supplmentaires) est implment dans PostGIS.
pas de limite sur la taille des colonne (les tuples peuvent tre TOASTs) pour supporter des
objets gographiques
Les fichier au formats SIG requirent un logiciel spcifique pour les lire et les crire. Le
langage SQL est une abstraction de laccs alatoire aux donnes et leur analyse. Sans cette
abstraction, vous devrez dvelopper laccs et lanalyse par vos propre moyens.
Les questions compliques ncessitent des logiciels compliqus pour y rpondre. Les
question intressantes et compliques (jointures spatiales, aggrgations, etc) qui sont
exprimables en une ligne de SQL grce la base de donnes, ncessitent une centaine de
lignes de code spcifiques pour y rpondre dans le cas de fichiers.
La plupart des utilisateurs de PostGIS ont mis en place des systmes o diverses applications
sont susceptibles daccder aux donnes, et donc davoir les mthodes daccs SQL standard,
qui simplifient le dploiement et le dveloppement. Certains utilisateurs travaillent avec de
grands jeux de donnes sous forme de fichiers, qui peuvent tre segments en plusieurs
fichiers, mais dans une base de donnes ces donnes peuvent tre stockes dans une seule
grande table.
En rsum, la combinaison du support de laccs concurrent, des requtes complexes
spcifiques et de la performance sur de grands jeux de donnes diffrencient les bases de
donnes spatiales des systmes utilisant des fichiers.
Les mises jour rcentes de PostGIS ont permis dtendre la compatibilit avec les standards,
dajouter les gomtries courbes et les signatures de fonctions spcifies dans la norme
ISO SQL/MM. Dans un soucis de performance, PostGIS 1.4 a aussi augment
considrablement la rapidit dexcution des fonctions de tests sur les gomtries.
GlobeXplorer
GlobeXplorer est un service web fournissant un accs en ligne une imagerie satellite et
photos ariennes de plusieurs petabytes. GlobeXplorer utilise PostGIS pour grer les
mtadonnes associes avec le catalogue dimages. Les requtes pour accder aux images
recherchent dabord dans le catalogue PostGIS pour rcuprer la localisation des images
demandes, puis rcuprent ces images et les retournent au client. Lors du proccessus de
mise en place de leur systme, GlobeXplorer a essay dautres systmes de base de donnes
spatiales mais a conserv PostGIS cause de la combinaison du prix et de la performance quil
offre.
Chargement/Extraction
Ferm/Propritaire
Chargement/Extraction
Libre/Gratuit
Shp2Pgsql
ogr2ogr
Dxf2PostGIS
Ferm/Propritaire
Safe
FME
Translator/Converter
Desktop
Mapserver
Cadcorp GeognoSIS
Iwan Mapserver
MapDotNet Server
MapGuide
FDO)
Enterprise
(using
Logiciels bureautiques
o
uDig
QGIS
mezoGIS
OpenJUMP
OpenEV
SharpMap
SDK
[Link] 2.0
for
ZigGIS
ArcGIS/[Link]
for
Logiciels bureautiques
o
Cadcorp SIS
Manifold
GeoConcept
MapInfo (v10)
GvSIG
o GRASS
Partie 2 : Installation
Nous utiliserons OpenGeo Suite comme application dinstallation, car celle-ci contient
PostGIS/PostgreSQL dans un seul outil dinstallation pour Windows, Apple OS/X et Linux. La
suite contient aussi GeoServer, OpenLayers et dautres outils de visualisations sur le web.
Note
Les indications prcises de ce document sont propre Windows, mais linstallation sous OS/X
est largement similaire. Une fois la Suite installe, les instructions relatives au systme
dexploitation devraient tre identiques.
1. Dans le rpertoire postgisintro\software\ vous trouverez linstalleur de OpenGeo Suite
nomm :[Link] (sur OS/X, [Link]). Double cliquez sur cet
excutable pour le lancer.
2. Apprciez le message de courtoisie dOpenGeo, puis cliquez sur Next.
3. OpenGeo Suite est publie sous licence GPL, ce qui est prcis dans la fentre de
license. Cliquez sur I Agree.
6. Tous les composants de la Suite sont obligatoires ce niveau. Cliquez sur Next.
Le Dashboard et PgAdmin
Le Dashboard est une application centralisant les accs aux diffrentes parties de lopenGeo
Suite.
Lorsque vous dmarrez le dashboard pour la premire fois, il vous fournit une indication quand
au mot de passe par dfaut pour accder GeoServer.
Note
La base de donnes PostGIS a t installe sans la moindre restriction daccs pour les
utilisateurs locaux (les utilisateurs se connectant sur la mme machine que celle faisant tourner
le serveur de base de donnes). Cela signifie quil acceptera tout les mots de passe que vous
fournirez. Si vous devez vous connecter depuis un ordinateur distant, le mot de passe pour
lutilisateur postgres a utiliser est : postgres.
Pour ces travaux pratiques, nous nutilserons que les parties de la section PostGIS du
Dashboard.
1. Premirement, nous devons dmarrer le serveur de base de donnes PostGIS. Cliquez
sur le bouton vert Start en haut droite de la fentre du Dashboard.
2. La premire fois que la Suite se dmarre, elle initialise un espace de donnes et met en
place des modles de bases de donnes. Ceci peut prendre quelques minutes. Une fois
la
Suite
lance,
vous
pouvez
cliquer
composant PostGIS pour lancer loutil pgAdmin.
sur
le
Note
Note
Si vous aviez dj une installation pgAdmin sur votre ordinateur, vous naurez pas
lentre (localhost:54321). Vous devrez donc crer une nouvelle connexion. Allez
dans File > Add Server, puis enregistrez un nouveau serveur pour localhost avec le
port 54321 (notez que numro de port nest pas standard) afin de vous connecter au
serveur PostGIS install laide de lOpenGeo Suite.
Note
Double
nyc
Owner
postgres
Encoding
UTF8
Template
template_postgis
4.
5. Slectionnez la nouvelle base de donnes nyc et ouvrez-la pour consulter son contenu.
Vous verrez le schma public, et sous cela un ensemble de tables de mtadonnes
spcifiques PostGIS geometry_columns et spatial_ref_sys.
6. Cliquez sur le bouton SQL query comme prsent ci-dessous (ou allez dans Tools >
Query Tool).
Note
le
rpertoire
3. Saisissez les dtails de la section connexion PostGIS et cliquez sur le bouton Test
Connection....
Note
Username
postgres
Password
postgres
Server Host
localhost 54321
Database
nyc
Affecter le numro de port 54321 est trs important ! Le serveur PostGIS dOpenGeo utilise ce
port et non le port par dfaut (5432).
1. Saisissez les dtails de la section Configuration.
Destination Schema
public
SRID
26918
Destination Table
nyc_census_blocks
Geometry Column
geom
2. Cliquez sur le bouton Options et slectionnez Load data using COPY rather than
INSERT. Ce qui implique que le chargement des donnes sera plus rapide.
3. Pour finir, cliquez sur le bouton Import et regardez limportation sexcuter. Cela peut
prendre plusieurs minutes pour charger, mais ce fichier est le plus gros que nous aurons
charger.
4. Reptez la mthode afin dimporter les autres donnes prsentes dans le rpertoire
data. Hormis le nom du fichier et le nom de la table de sortie, les autres paramtres de
pgShapeLoader devrait rester les mmes :
o
nyc_streets.shp
nyc_neighborhoods.shp
nyc_subway_stations.shp
5. Lorsque tous les fichiers sont chargs, cliquez sur le bouton Refresh de pgAdmin pour
mettre jour larbre affich. Vous devriez voir vos quatre nouvellles tables affiches dans
la section Tables de larbre.
.shx lindex de formes; un index bas sur les positions des entits gographiques
.dbf les attributs; les donnes attributaires associes chaque forme, au format dBase III
Afin dutiliser un fichier Shapefile dans PostGIS, vous devez le convertir en une srie de
requtes SQL. En utilisant pgShapeLoader, un Shapefile est converti en une table que
PostgreSQL peut comprendre.
[Link]
Note
La table spatial_ref_sys de PostGIS est une table standard OGC qui dfinit tous les
systmes de rfrence spatiale connus par la base de donnes. Les donnes livres avec
PostGIS, contiennent 3000 systmes de rfrence spatiale et prcisent les informations
ncessaires la transformation ou la reprojection.
Dans les deux cas, vous obtiendrez une reprsentation du systme de rfrence
spatiale 26918 (affiche sur plusieurs lignes ici pour plus de clart).
PROJCS["NAD83 / UTM zone 18N",
GEOGCS["NAD83",
DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],
AUTHORITY["EPSG","6269"]],
PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4269"]],
UNIT["metre",1,AUTHORITY["EPSG","9001"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",-75],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
AUTHORITY["EPSG","26918"],
AXIS["Easting",EAST],
AXIS["Northing",NORTH]]
Les donnes que vous recevez des agences locales de lEtat - comme la ville de New York utilisent la plupart du temps des projections locales notes state plane ou UTM. Dans notre
cas, la projection est Universal Transverse Mercator (UTM) Zone 18 North soit EPSG:26918.
Noubliez pas saisir le nom de lutilisateur et le numro de port lorsque vous crez une base de
donnes en ligne de commande.
Pour visualiser la nature de vos tables depuis pgAdmin, cliquez avec le bouton droit sur une
table et slectionnez Properties. Vous trouverez un rsum des proprits de la table, incluant
la liste des attributs dune table dans longlet Columns.
nyc_census_blocks
Un bloc recens est la plus petite entit gographique pour laquelle un recensement est
rapport. Toutes les couches reprsentant les niveaux suprieurs (rgions, zones de mtro,
comts) peuvent tre contruites partir de ces blocs. Nous avons attach des donnes
dmographiques aux blocs.
Nombre denregistrements : 36592
blkid
popn_to
tal
popn_w
hite
popn_bl
ack
popn_na
tiv
popn_as
ian
popn_ot
her
hous_tot
Nombre de pices dans le bloc
al
hous_ow
Nombre de propritaires occupant le bloc
n
hous_re
nt
borona
me
geom
Pour disposer des donnes dun recensement dans votre SIG, vous avez besoin de joindre
deux informations: Les donnes socio-dmographiques et les limites gographiques des
blocs/quartiers. Il existe plusieurs moyen de se les procurer, dans notre cas, elles ont t
rcupres sur le site Internet du Census Bureaus American FactFinder.
nyc_neighborhoods
Les quartiers de New York
Nombre denregistrements: 129
name
Nom du quartier
borona
me
Nom de la section dans New York (Manhattan, The Bronx, Brooklyn, Staten
Island, Queens)
geom
nyc_streets
Les rues de New York
Nombre denregistrements: 19091
name
Nom de la rue
oneway
type
geom
nyc_subway_stations
Les stations de mtro de New York
Nombre denregistrements: 491
name
Nom de la station
boroug
h
Nom de la section dans New York (Manhattan, The Bronx, Brooklyn, Staten
Island, Queens)
routes
transfe
Lignes de mtro accessibles depuis cette station
rs
expres
s
geom
nyc_census_sociodata
Donnes socio-dmographiques de la ville de New York
Note
La donne nyc_census_sociodata est une table attributaire. Nous devrons nous connecter
aux gomtries correspondant la zone du recensement avant de conduire toute analyse
spatiale .
tractid
transit_public
transit_private
transit_other
transit_time_mins
family_count
family_income_me
dian
family_income_ag
gregate
edu_total
edu_no_highschoo
l_dipl
edu_highschool_di
pl
edu_college_dipl
edu_graduate_dipl
Maintenant que nous avons charg des donnes dans notre base, essayons dutiliser SQL pour
les interroger. Par exemple,
Quels sont les noms des quartiers de la ville de New York ?
Ouvrez une fentre SQL depuis pgAdmin en cliquant sur le bouton SQL
Mais que sest-il exactement pass ici ? Pour le comprendre, commenons par prsenter les
quatre types de requtes du SQL :
Nous travaillerons principalement avec des requtes de type SELECT afin dinterroger les tables
en utilisant des fonctions spatiales.
Note
Pour une description exhaustive des paramtres possible dune requte SELECT, consultez
ladocumentation de PostgresSQL.
Les colonnes sont soit des noms de colonnes, soit des fonctions utilisant les valeurs des
colonnes. Lesdonnes sont soit une table seule, soit plusieurs tables relies ensemble en
ralisant une jointure sur une clef ou une autre condition. Les conditions reprsentent le filtre
qui restreint le nombre de lignes retourner.
Quel sont les noms des quartiers de Brooklyn ?
Nous retournons notre table nyc_neighborhoods avec le filtre en main. La table contient
tous les quartiers de New York et nous voulons uniquement ceux de Brooklyn.
SELECT name
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
Bien souvent, nous sommes moins interesss par une ligne particulire que par un calcul
statistique sur lensemble rsultant. Donc, connatre la longueur des noms de quartiers est
moins intressant que de calculer la moyenne de ces longueurs. Les fonctions qui renvoient un
rsultat unique en utilisant un ensemble de valeurs sont appeles des fonctions
daggrgations.
Les fonctions dagrgation dans notre dernier exemple sont appliques chaque ligne de
lensemble des rsultats. Comment faire si nous voulons rassembler des donnes ? Pour cela,
nous utilisons la clauseGROUP BY. Les fonctions dagrgation ont souvent besoin dune
clause GROUP BY pour regrouper les lments en utilisant une ou plusieurs colonnes.
Quel est la moyenne du nombre de caractres des noms de quartiers et lcart-type du nombre de
caractres des noms de quartiers, renvoy par section de New York ?
SELECT boroname, avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
GROUP BY boroname;
Nous ajoutons la colonne boroname dans le rsultat afin de pouvoir dterminer quelle valeur
statistique sapplique quelle section. Dans une requte agrge, vous pouvez seulement
retourner les colonnes qui sont (a) membre de la clause de regroupement ou (b) des fonctions
dagrgation.
boroname
|
avg
|
stddev
---------------+---------------------+-------------------Brooklyn
| 11.7391304347826087 | 3.9105613559407395
Manhattan
| 11.8214285714285714 | 4.3123729948325257
The Bronx
| 12.0416666666666667 | 3.6651017740975152
Queens
| 11.6666666666666667 | 5.0057438272815975
Staten Island | 12.2916666666666667 | 5.2043390480959474
Liste de fonctions
avg(expression): fonction dagrgation de PostgreSQL qui retourne la valeur moyenne dune
colonne.
char_length(string): fonction sappliquant aux chanes de caractre de PostgreSQL qui retourne
le nombre de lettres dans une chane.
stddev(expression): fonction daggrgation de PostgreSQL qui retourne lcart type dun
ensemble de valeurs.
Un code 15 chiffres qui dfinit de manire unique chaque bloc ressenc . Ex:
360050001009000
popn_total
popn_whit
e
popn_blac
k
popn_othe
r
hous_total
hous_own
hous_rent
boroname
Nom du quartier de New York. Manhattan, The Bronx, Brooklyn, Staten Island, Queens
geom
Ici se trouvent certaines des fonctions daggrgation qui vous seront utiles pour rpondre aux
questions :
Note
Quest-ce que ce AS dans la requte ? vous pouvez donner un nom une table ou des
colonnes en utilisant un alias. Les alias permettent de rendre les requtes plus simple
crire et lire. Donc au lieu que notre colonne rsultat soit nomme sum nous utilisons
le AS pour la renommer en population.
SELECT
boroname,
100 * Sum(popn_white)/Sum(popn_total) AS white_pct
FROM nyc_census_blocks
GROUP BY boroname;
boroname
|
white_pct
---------------+--------------------Brooklyn
| 41.2005552206888663
The Bronx
| 29.8655310846808990
Manhattan
| 54.3594013771837665
Queens
| 44.0806610271290794
Staten Island | 77.5968611401579346
Introduction
Dans une partie prcdente nous avons charg diffrentes donnes. Avant de commencer
jouer avec, commenons par regarder quelques exemples simples. Depuis pgAdmin,
choisissez de nouveau la base de donne nyc et ouvrez loutil de requtage SQL. Copiez cette
exemple de code SQL (aprs avoir supprim le contenu prsent par dfaut si ncessaire) puis
excutez-le.
CREATE TABLE geometries (name varchar, geom geometry);
INSERT INTO geometries VALUES
('Point', 'POINT(0 0)'),
('Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'),
('Polygon', 'POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
('PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1
1))'),
('Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0
0)))');
SELECT Populate_Geometry_Columns();
SELECT name, ST_AsText(geom) FROM geometries;
Lexemple ci-dessus cr une table (geometries) puis y insre cinq gomtries : un point, une
ligne, un polygone, un polygone avec un trou, et une collection. Les lignes insres sont
slectionnes et affiches dans le tableau de sortie.
La seconde table, geometry_columns, fournit une liste de toutes les entits (dfinit comme
un objet avec un attribut gomtrique) et les dtails de base relatives ces entits.
f_geometry_column est le nom de la colonne qui contient la gomtrie pour les tables
ayant plusieurs colonnes gomtriques, il y a un enregistrement dans cette table pour chacune.
coord_dimension et srid dfinissent respectivement la dimension de la gomtrie (en 2-, 3or 4-dimensions) et le systme de rfrence spatiale qui fait rfrence la
table spatial_ref_sys.
La colonne type dfinit le type de gomtrie comme dcrit plus tt, nous avons dj vu les
points et les lignes.
En interrogeant cette table, les clients SIG et les libraires peuvent dterminer quoi attendre lors
de la rcupration des donnes et peuvent raliser les opration de reprojection, transformation
ou rendu sans avoir inspecter chaque gomtrie.
cela en ajoutant les reprsentation en 3 et 4 dimensions. Plus rcemment, la spcification SQLMultimedia Part 3 (SQL/MM) a officiellement dfinit sa propre reprsentation.
Notre table exemple contient diffrents types de gomtries. Nous pouvons rcuprer les
informations de chaque objet en utilisant les fonctions qui lisent les mtadonnes de la
gomtrie.
Les points
Un point reprsente une localisation unique sur la Terre. Ce point est reprsent par une seule
coordonne (incluant soit 2, 3 ou 4 dimensions). Les points sont utiliss pour reprsenter des
objets lorsque le dtail exact du contour nest pas important une chelle donne. Par
exemple, les villes sur une carte du monde peuvent tre dcrites sous la forme de points alors
quune carte rgionale utiliserait une reprsentation polygonale des villes.
SELECT ST_AsText(geom)
FROM geometries
WHERE name = 'Point';
POINT(0 0)
Certaines des fonctions spcifiques pour travailler avec les points sont :
Donc, nous pouvons lire les coordonnes dun point de la manire suivante :
Les lignes
Une ligne est un chemin entre plusieurs points. Elle prend la forme dun tableau ordonn
compos de deux (ou plusieurs) points. Les routes et les rivires sont typiquement
reprsentes sous la forme de lignes. Une ligne est dite ferme si elle commence et finit en un
mme point. Elle est dite simple si elle ne se coupe pas ou ne se touche pas elle-mme (sauf
ses extrmits si elle est ferme). Une ligne peut tre la foisferme et simple.
Le rseau des rues de New York ( nyc_streets) a t charg auparavant. Cet ensemble de
donnes contient les dtails comme le nom et le type des rues. Une rue du monde rel pourrait
tre constitue de plusieurs lignes, chacune reprsentant une segment de routes avec ses
diffrents attributs.
La requte SQL suivante retourne la gomtrie associe une ligne (dans la
colonne ST_AsText) :
SELECT ST_AsText(geom)
FROM geometries
WHERE name = 'Linestring';
LINESTRING(0 0, 1 1, 2 1, 2 2)
Les fonctions spatiales permettant de travailler avec les lignes sont les suivantes :
Les polygones
Un polygone est reprsent comme une zone. Le contour externe du polygone est reprsent
par une ligne simple et ferme. Les trous sont reprsents de la mme manire.
Les polygones sont utiliss pour reprsenter les objets dont les tailles et la forme sont
importants. Les limites de villes, les parcs, les btiments ou les cours deau sont habituellement
reprsents par des polygones lorsque lchelle est suffisament leve pour pouvoir distinguer
leurs zones. Les routes et les rivires peuvent parfois tre reprsentes comme des polygones.
La requte SQL suivante retournera la gomtrie associe un polygone (dans la
colonne ST_AsText).
SELECT ST_AsText(geom)
FROM geometries
WHERE name LIKE 'Polygon%';
Note
Plutt que dutiliser le signe = dans notre clause WHERE, nous avons utilis
loprateur LIKE pour pouvoir dfinir notre comparaison. Vous auriez sans doute voulu utiliser
le symbole * pour exprimer nimporte quelle valeur mais en SQL vous devez utiliser : % et
loprateur LIKE pour informer le systme que cette comparaison doit tre possible.
POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))
POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))
Le premier polygone a seulement une ligne. Le second a un trou. La plupart des systmes de
rendu graphique supportent le concept de polygone, mais les systmes SIG sont les seuls
accepter que les polygones puissent contenir des trous.
Remarquez que le polygone contenant un trou a une aire gale laire du contour externe (un
carr de 10 sur 10) moins laire du trou (un carr de 1 sur 1).
Les collections
Il y a quatre types de collections, qui regroupent ensemble plusieurs gomtries simples.
Les collections sont un concept prsents dans les logiciels SIG plus que dans les applications
de rendu graphique gnriques. Elles sont utiles pour directement modliser les objets du
monde rel comme des objet spatiaux. Par exemple, comment modliser une parcelle qui a t
coupe par un chemin ? Comme un MultiPolygon, ayant une partie de chaque cot du chemin.
GeoJSON
o
La requte SQL suivante montre un exemple de reprsentation en WKB (lappel encode() est
requis pour convertir le format binaire en ASCII pour lafficher) :
SELECT encode(
ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0 0,1 0 0,1 1 2)')),
'hex');
Dans le reste de ces travaux pratiques, nous utiliserons principalement le format WKT pour que
vous puissiez lire et comprendre les gomtries que nous voyons. Nanmoins, pour la plupart
des traitement actuels, comme la visualisation des donnes dans une application SIG, le
transfert de donnes des services web, ou lexcution distante de traitements, le format WKB
est un format de choix.
Puisque les formats WKT et le WKB sont dfinis dans la spcification SFSQL, ils ne prennent
pas en compte les gomtries 3 ou 4 dimensions. Cest pour cette raison que PostGIS dfinit
les formats Extended Well Known Text (EWKT) et Extended Well Known Binary (EWKB). Cela
permet de grer de faon similaire aux formats WKT et WKB les dimensions ajoutes.
Voici un exemple de ligne 3D au format WKT :
SELECT ST_AsEWKT(ST_GeometryFromText('LINESTRING(0 0 0,1 0 0,1 1 2)'));
SELECT encode(ST_AsEWKB(ST_GeometryFromText(
'LINESTRING(0 0 0,1 0 0,1 1 2)')), 'hex');
En plus de pouvoir gnrer les diffrents formats en sortie (WKT, WKB, GML, KML, JSON,
SVG), PostGIS permet aussi de lire 4 de ces formats (WKT, WKB, GML, KML). La plupart des
applications utilisent des fonctions crant des gomtries laide du format WKT ou WKB, mais
les autres marchent aussi. Voici un exemple qui lit du GML et retourne du JSON :
SELECT
ST_AsGeoJSON(ST_GeomFromGML('<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:P
oint>'));
type
ou
nyc_census_blocks
o
nyc_streets
o
nyc_subway_stations
o
name, geom
nyc_neighborhoods
o
Exercices
SELECT ST_Area(geom)
FROM nyc_neighborhoods
WHERE name = 'West Village';
1044614.53027344
Note
Laire est donne en mtres carrs. Pour obtenir laire en hectare, divisez par 10000.
Pour obtenir laire en acres, divisez par 4047.
Quelle
est
laire
de
Manhattan
en
acres ? (Astuce: nyc_census_blocks etnyc_neighborhoods ont toutes les deux le
champ boroname.)
or...
SELECT Sum(ST_Area(geom)) / 4047
FROM nyc_census_blocks
WHERE boroname = 'Manhattan';
14572.1575543757
SELECT Count(*)
FROM nyc_census_blocks
WHERE ST_NRings(geom) > 1;
66
Quel est la longueur totale des rues (en kilomtres) dans la ville de New
York ?(Astuce: lunit de mesure des donnes spatiales est le mtre, il y a 1000 mtres
dans un kilomtre.)
SELECT ST_Length(geom)
FROM nyc_streets
WHERE name = 'Columbus Cir';
308.34199
SELECT ST_AsGeoJSON(geom)
FROM nyc_neighborhoods
WHERE name = 'West Village';
{"type":"MultiPolygon","coordinates":
[[[[583263.2776595836,4509242.6260239873],
[583276.81990686338,4509378.825446927], ...
[583263.2776595836,4509242.6260239873]]]]}
SELECT ST_NumGeometries(geom)
FROM nyc_neighborhoods
WHERE name = 'West Village';
1
Note
Il nest pas rare de trouver des lments de type multi-polygone ne contenant quun seul
polygone dans des tables. Lutilisation du type multi-polygone permet dutiliser une seule
table pour y stocker des gomtries simples et multiples sans mlanger les types.
Quel est la longueur des rues de la ville de New York, suivant leur type ?
cycleway
| 8863.75144825929
pedestrian
| 4867.05032825026
construction
| 4803.08162103562
residential; motorway_link
| 3661.57506293745
trunk_link
| 3202.18981240201
primary_link
| 2492.57457083536
living_street
| 1894.63905457332
primary; residential; motorway_link; residential | 1367.76576941335
undefined
| 380.53861910346
steps
| 282.745221342127
motorway_link; residential
215.07778911517
Note
La clause ORDER BY length DESC ordonne le rsultat par la valeur des longueurs dans
lordre dcroissant. Le rsultat avec la plus grande valeur se retrouve au dbut la liste de
rsultats.
ST_Equals
ST_Equals(geometry A, geometry B) teste lgalit spatiale de deux gomtries.
ST_Equals retourne TRUE si les deux gomtries sont du mme type et ont des coordonnes
x.y identiques.
Premirement, essayons de rcuprer la reprsentation dun point
table nyc_subway_stations. Nous ne prendrons que lentre : Broad St.
de
Note
notre
La
reprsentation
du
point
nest
pas
vraiment
comprhensible
(0101000020266900000EEBD4CF27CF2141BC17D69516315141) mais cest exactement la
reprsentation des coordonnes. Pour tester lgalit, lutilisation de ce format est ncessaire.
ST_Touches
ST_Touches teste si deux gomtries se touchent en leur contours extrieurs, mais leur
contours intrieurs ne sintersectent pas
ST_Within et ST_Contains
ST_Within et ST_Contains teste si une gomtrie est totalement incluse dans lautre.
ST_Distance et ST_DWithin
Une question frquente dans le domaine du SIG est trouver tous les lments qui se trouvent
une distance X de cet autre lment.
La fonction ST_Distance(geometry A, geometry B) calcule la plus courte distance entre deux
gomtries. Cela est pratique pour rcuprer la distance entre les objets.
SELECT ST_Distance(
ST_GeometryFromText('POINT(0 5)'),
ST_GeometryFromText('LINESTRING(-2 2, 2 2)'));
3
Pour tester si deux objets sont la mme distance dun autre, la fonction ST_DWithin fournit
un test tirant profit des index. Cela est trs utile pour rpondre a une question telle que:
Combien darbres se situent dans un buffer de 500 mtres autour de cette route ?. Vous
navez pas calculer le buffer, vous avez simplement besoin de tester la distance entre les
gomtries.
En utilisant de nouveau notre station de mtro Broad Street, nous pouvons trouver les rues
voisines ( 10 mtres de) de la station :
SELECT name
FROM nyc_streets
WHERE ST_DWithin(
geom,
'0101000020266900000EEBD4CF27CF2141BC17D69516315141',
10
);
name
-------------Wall St
Broad St
Nassau St
Nous pouvons vrifier la rponse sur une carte. La station Broad St est actuellement
lintersection des rues Wall, Broad et Nassau.
nyc_census_blocks
o
nyc_streets
o
nyc_subway_stations
o
name, geom
nyc_neighborhoods
o
Exercices
SELECT geom
FROM nyc_streets
WHERE name = 'Atlantic Commons';
01050000202669000001000000010200000002000000093235673BE82141F319CD89A22E514170E
30E0ADFE82141CB2D3EFFA52E5141
Quels sont les quartiers et villes qui sont dans Atlantic Commons ?
SELECT name
FROM nyc_streets
WHERE ST_Touches(
geom,
'01050000202669000001000000010200000002000000093235673BE82141F319CD89A22E5141
70E30E0ADFE82141CB2D3EFFA52E5141'
);
name
--------------S Oxford St
Cumberland St
SELECT Sum(popn_total)
FROM nyc_census_blocks
WHERE ST_DWithin(
geom,
'01050000202669000001000000010200000002000000093235673BE82141F319CD89A22E514
170E30E0ADFE82141CB2D3EFFA52E5141',
50
);
1186
Nous avons pu regrouper chaque station de mtro avec le quartier auquel elle appartient, mais
dans ce cas nous nen voulions quune. Chaque fonction qui envoit un rsultat du type vrai/faux
peut tre utilise pour joindre spatialement deux tables, mais la plupart du temps on
utilise : ST_Intersects, ST_Contains, etST_DWithin.
Jointure et regroupement
La combinaison de JOIN avec GROUP BY fournit le type danalyse qui est couramment utilis
dans les systmes SIG.
Par exemple : Quelle est la population et la rpartition raciale du quartier de
Manhattan ? Ici nous avons une question qui combine les informations relatives la population
recense et les contours des quartiers, or nous ne voulons quun seul quartier, celui de
Manhattan.
SELECT
[Link] AS neighborhood_name,
Sum(census.popn_total) AS population,
Round(100.0 * Sum(census.popn_white) / Sum(census.popn_total),1) AS white_pct,
Round(100.0 * Sum(census.popn_black) / Sum(census.popn_total),1) AS black_pct
FROM nyc_neighborhoods AS neighborhoods
JOIN nyc_census_blocks AS census
ON ST_Intersects([Link], [Link])
WHERE [Link] = 'Manhattan'
GROUP BY [Link]
ORDER BY white_pct DESC;
neighborhood_name | population | white_pct | black_pct
---------------------+------------+-----------+----------Carnegie Hill
|
19909 |
91.6 |
1.5
North Sutton Area
|
21413 |
90.3 |
1.2
West Village
|
27141 |
88.1 |
2.7
Upper East Side
|
201301 |
87.8 |
2.5
Greenwich Village
|
57047 |
84.1 |
3.3
Soho
|
15371 |
84.1 |
3.3
Murray Hill
|
27669 |
79.2 |
2.3
Gramercy
|
97264 |
77.8 |
5.6
Central Park
|
49284 |
77.8 |
10.4
Tribeca
|
13601 |
77.2 |
5.5
Midtown
|
70412 |
75.9 |
5.1
Chelsea
|
51773 |
74.7 |
7.4
Battery Park
|
9928 |
74.1 |
4.9
Upper West Side
|
212499 |
73.3 |
10.4
Financial District |
17279 |
71.3 |
5.3
Clinton
|
26347 |
64.6 |
10.3
East Village
|
77448 |
61.4 |
9.7
Garment District
|
6900 |
51.1 |
8.6
Morningside Heights
Little Italy
Yorkville
Inwood
Lower East Side
Washington Heights
East Harlem
Hamilton Heights
Chinatown
Harlem
|
|
|
|
|
|
|
|
|
|
41499
14178
57800
50922
104690
187198
62279
71133
18195
125501
|
|
|
|
|
|
|
|
|
|
50.2
39.4
31.2
29.3
28.3
26.9
20.2
14.6
10.3
5.7
|
|
|
|
|
|
|
|
|
|
24.8
1.2
33.3
14.9
9.0
16.3
46.2
41.1
4.2
80.5
Que ce passe-t-il ici ? Voici ce qui se passe (lordre dvaluation est optimis par la base de
donnes) :
1. La clause JOIN cre une table virtuelle qui contient les colonnes la fois des quartiers et des
recensements (tables neighborhoods et census).
2. La clause WHERE filtre la table virtuelle pour ne conserver que la ligne correspondant
Manhattan.
3. Les lignes restantes sont regroupes par le nom du quartier et sont utilises par la fonction
dagrgation : Sum() pour raliser la somme des valeurs de la population.
4. Aprs un peu darithmtique et de formatage (ex: GROUP BY, ORDER BY)) sur le nombres
finaux, notre requte calcule les pourcentages.
Note
La clause JOIN combine deux parties FROM. Par dfaut, nous utilisons un jointure du
type :INNERJOIN, mais il existe quatres autres types de jointures. Pour de plus amples
informations ce sujet, consultez la partie type_jointure de la page de la documentation
officielle de PostgreSQL.
Nous pouvons aussi utiliser le test de la distance dans notre clef de jointure, pour crer une
regroupement de tous les lments dans un certain rayon. Essayons danalyser la gographie
raciale de New York en utilisant les requtes de distance.
Premirement, essayons dobtenir la rpartition raciale de la ville.
SELECT
100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct,
100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct,
Sum(popn_total) AS popn_total
FROM nyc_census_blocks;
white_pct
|
black_pct
| popn_total
---------------------+---------------------+-----------44.6586020115685295 | 26.5945063345703034 |
8008278
Donc, 8M de personnes dans New York, environ 44% sont blancs et 26% sont noirs.
Duke Ellington chantait que You / must take the A-train / To / go to Sugar Hill way up in
Harlem. Comme nous lavons vu prcdemment, Harlem est de trs loin le quartier ou se
trouve la plus grande concentration dafricains-amricains de Manhattan (80.5%). Est-il toujours
vrai quil faut prendre le train A dont Duke parlait dans sa chanson ?
Premirement, le contenu du champ routes de la table nyc_subway_stations va nous servir
rcuprer le train A. Les valeurs de ce champs sont un peu complexes.
SELECT DISTINCT routes FROM nyc_subway_stations;
A,C,G
4,5
D,F,N,Q
5
E,F
E,J,Z
R,W
Note
Le mot clef DISTINCT permet dliminer les rptitions de lignes de notre rsultat. Dans ce mot
clef, notre requte renverrait 491 rsultats au lieu de 73.
Donc pour trouver le train A, nous allons demander toutes les lignes ayant pour routes la
valeur A. Nous pouvons faire cela de diffrentes manires, mais nous utiliserons aujourdhui le
fait que la fonctionstrpos(routes,A) retourne un entier diffrent de 0 si la lettre A se trouve
dans la valeur du champ route.
SELECT DISTINCT routes
FROM nyc_subway_stations AS subways
WHERE strpos([Link],'A') > 0;
A,B,C
A,C
A
A,C,G
A,C,E,L
A,S
A,C,F
A,B,C,D
A,C,E
Essayons de regrouper la rpartition raciale dans un rayon de 200 mtres de la ligne du train A.
SELECT
100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct,
100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct,
Sum(popn_total) AS popn_total
FROM nyc_census_blocks AS census
JOIN nyc_subway_stations AS subways
ON ST_DWithin([Link], [Link], 200)
WHERE strpos([Link],'A') > 0;
white_pct
|
black_pct
| popn_total
---------------------+---------------------+-----------42.0805466940877366 | 23.0936148851067964 |
185259
Jointures avances
Dans la dernire partie nous avons vu que le train A nest pas utilis par des populations si
loignes de la rpartition totale du reste de la ville. Y-a-t-il des trains qui passent par des
parties de la ville qui ne sont pas dans la moyenne de la rpartition raciale ?
Pour rpondre cette question, nous ajouterons une nouvelle jointure notre requte, de telle
manire que nous puissions calculer simultanment la rpartition raciale de plusieurs lignes de
mtro la fois. Pour faire ceci, nous crerons une table qui permettra dnumrer toutes les
lignes que nous voulons regrouper.
CREATE TABLE subway_lines ( route char(1) );
INSERT INTO subway_lines (route) VALUES
('A'),('B'),('C'),('D'),('E'),('F'),('G'),
('J'),('L'),('M'),('N'),('Q'),('R'),('S'),
('Z'),('1'),('2'),('3'),('4'),('5'),('6'),
('7');
Maintenant nous pouvons joindre les tables des lignes de mtro notre requte prcdente.
SELECT
[Link],
Round(100.0 * Sum(popn_white) / Sum(popn_total), 1) AS white_pct,
Round(100.0 * Sum(popn_black) / Sum(popn_total), 1) AS black_pct,
Sum(popn_total) AS popn_total
FROM nyc_census_blocks AS census
JOIN nyc_subway_stations AS subways
ON ST_DWithin([Link], [Link], 200)
JOIN subway_lines AS lines
ON strpos([Link], [Link]) > 0
GROUP BY [Link]
ORDER BY black_pct DESC;
route | white_pct | black_pct | popn_total
-------+-----------+-----------+-----------S
|
30.1 |
59.5 |
32730
3
|
34.3 |
51.8 |
201888
2
|
33.6 |
45.5 |
535414
5
|
32.1 |
45.1 |
407324
C
|
41.3 |
35.9 |
430194
4
|
34.7 |
30.9 |
328292
B
|
36.1 |
30.6 |
261186
Q
|
52.9 |
26.3 |
259820
J
|
29.5 |
23.6 |
126764
A
|
42.1 |
23.1 |
370518
Z
|
29.5 |
21.5 |
81493
D
|
39.8 |
20.9 |
233855
G
L
6
1
F
M
E
R
7
|
|
|
|
|
|
|
|
|
44.8
53.9
52.7
54.8
60.0
50.0
69.4
57.7
42.4
|
|
|
|
|
|
|
|
|
20.0
17.1
16.3
12.6
8.6
7.8
5.3
4.8
3.8
|
|
|
|
|
|
|
|
|
138602
104140
257769
659028
438212
166721
86118
389124
107543
Comme prcdemment, les jointures crent une table virtuelle de toutes les combinaisons
possibles
et
disponibles
laide
des
contraintes
de
type JOIN ON`. Ces lignes sont ensuite utilises dans leregroupement ``GROU
P. La magie spatiale tient dans lutilisation de la fonction ST_DWithin qui sassure que les blocs
sont suffisamment proches des lignes de mtros incluses dans le calcul.
Liste de fonctions
ST_Contains(geometry A, geometry B): retourne TRUE si et seulement si aucun point de B est
lextrieur de A, et si au moins un point lintrieur de B est lintrieur de A.
ST_DWithin(geometry A, geometry B, radius): retourne TRUE si les gomtries sont distantes
du rayon donn.
ST_Intersects(geometry A, geometry B): retourne TRUE si les gomtries/gographies
sintersectent spatialement (partage une portion de lespace) et FALSE sinon (elles sont
disjointes).
round(v numeric, s integer): fonction de PostgreSQL qui arrondit s dcimales.
strpos(chane, sous-chane): fonction de chane de caractres de PostgreSQL qui retourne la
position de la sous-chaine.
sum(expression): fonction dagrgation de PostgreSQL qui retourne la somme dun ensemble
de valeurs.
Notes de bas de page
[1]
[Link]
nyc_census_blocks
o
nyc_streets
o
nyc_subway_stations
o
nyc_neighborhoods
o
Exercices
Quelle station de mtro se situe dans le quartier Little Italy ? Quelle est
litinraire de mtro emprunter ?
| The Bronx
Note
Nous avons utilis le mot clef DISTINCT pour supprimer les rptitions dans notre
ensemble de rsultats o il y avait plus dune seule station de mtro dans le quartier.
SELECT Sum(popn_total)
FROM nyc_neighborhoods AS n
JOIN nyc_census_blocks AS c
ON ST_Intersects([Link], [Link])
WHERE [Link] = 'Battery Park';
9928
SELECT
[Link],
Sum(c.popn_total) / (ST_Area([Link]) / 1000000.0) AS popn_per_sqkm
FROM nyc_census_blocks AS c
JOIN nyc_neighborhoods AS n
ON ST_Intersects([Link], [Link])
WHERE [Link] = 'Upper West Side'
OR [Link] = 'Upper East Side'
GROUP BY [Link], [Link];
name
| popn_per_sqkm
-----------------+-----------------Upper East Side | 47943.3590089405
Upper West Side | 39729.5779474286
Note
La commande DROP INDEX supprime un index existant de la base de donnes. Pour de plus
amples informations ce sujet, consultez la documentation officielle de PostgreSQL.
Maintenant, regardons le temps dexcution dans le coin en bas droite de linterface de
requtage de pgAdmin, puis lanons la commande suivante. Notre requte recherche les blocs
de la rue Broad.
SELECT [Link]
FROM nyc_census_blocks blocks
JOIN nyc_subway_stations subways
ON ST_Contains([Link], [Link])
WHERE [Link] = 'Broad St';
blkid
----------------360610007003006
Note
lutilisation de la clause USING GIST spcifie PostgreSQL de crer une structure (GIST) pour
cet
index.
Si
vous
recevez
un
message
derreur
ressemblant
ERROR: index row requires 11340 bytes,maximum size is 8191 lors
de
la
cration, cela signifie sans doute que vous avez omis la clause USINGGIST.
Sur lordinateur de test le temps dexcution se rduit 9 ms. Plus votre table est grande, plus
la diffrence de temps dexcution pour une requte utilisant les index augmentera.
Dans la figure ci-dessus, le nombre de lignes qui intersectent ltoile jaune est unique, la ligne
rouge. Mais ltendue des entits qui intersectent la bote jaune sont deux, la bote rouge et la
bote bleue.
La manire dont les bases de donnes rpondent de manire efficace la question Quelles
lignes intersectent ltoile jaune ? correspond premirement rpondre la question Quelle
tendue intersecte ltendue jaune en utilisant les index (ce qui est trs rapide) puis calculer
le rsultat exact de la question Quelles lignes intersectent ltoile jaune ? seulement en
utilisant les entits retournes par le premier test.
Pour de grandes tables, il y a un systme en deux tapes dvaluation en utilisant dans un
premier temps lapproximation laide dindex, puis en ralisant le test exact sur une quantit
bien moins importante de donnes ce qui rduit drastiquement le temps de calcul ncessaire
cette deuxime tape.
PotGIS et Oracle Spatial partage la mme notion dindex structur sous la forme darbres
R [1]. Les arbres R classent les donnes sous forme de rectangles, de sous-rectangles etc.
Cette structure dindex gre automatiquement la densit et la taille des objets.
SELECT Sum(popn_total)
FROM nyc_neighborhoods neighborhoods
JOIN nyc_census_blocks blocks
ON [Link] && [Link]
WHERE [Link] = 'West Village';
50325
Un plus faible nombre de rsultats ! La premire requte nous renvoie tous les blocs qui
intersectent ltendue du quartier, la seconde nous renvoie seulement les blocs qui intersectent
le quartier lui-mme.
Analyse
Le planificateur de requte de PostgreSQL choisit intelligemment dutiliser ou non les index
pour raliser une requte. Il nest pas toujours plus rapide dutiliser un index pour raliser une
recherche : si la recherche doit renvoyer lensemble des enregistrements dune table, parcourir
lindex pour rcuprer chaque valeur sera plus lent que de parcourir linairement lensemble de
la table.
Afin de savoir dans quelle situation il est ncessaire dutiliser les index (lire une petite partie de
la table plutt quune grande partie), PostgreSQL conserve des statistiques relatives la
distribution des donnes dans chaque colonne indexe. Par dfaut, PostgreSQL rassemble les
statistiques sur une base rgulire. Nanmoins, si vous changez dramatiquement le contenu de
vos tables dans une priode courte, les statistiques ne seront alors plus jour.
Pour vous assurez que les statistiques correspondent bien au contenu de la table actuelle, il est
courant dutiliser la commande ANALYZE aprs un grand nombre de modifications ou de
suppression de vos donnes. Cela force le systme de gestion des statistiques rcuprer
lensemble des donnes des colonnes indexes.
La commande ANALYZE demande PostgreSQL de parcourir la table et de mettre jour les
statistiques utilises par le planificateur de requtes (la planification des requtes sera trait
ultrieurement).
ANALYZE nyc_census_blocks;
Nttoyage
Il est souvent stressant de constater que la simple cration dun index nest pas suffisant pour
que PostgreSQL lutilise efficacement. Le nettoyage doit tre ralis aprs quun index soit cr
ou aprs un grand nombre de requtes UDATE, INSERT ou DELETE ait t ralis sur une
table. La commandeVACUUM demande PostgreSQL de rcuprer chaque espace non utilis
dans les pages de la table qui sont laisses en ltat lors des requtes UPDATE ou DELETE
cause du modle destampillage multi-versions.
Le nettoyage des donnes est tellement important pour une utilisation efficace du serveur de
base de donnes PostgreSQL quil existe maintenant une option autovacuum.
Active par dfaut, le processus autovacuum nettoie (rcupre lespace libre) et analyse (met
jour les statistiques) vos tables suivant un intervalle donn dtermin par lactivit des bases de
donnes. Bien que cela fonctionne avec les bases de donnes hautement transactionnelles, il
nest pas supportable de devoir attendre que le processus autovacuum se lance lors de la mise
jour ou la suppression massive de donnes. Dans ce cas, il faut lancer la
commande VACUUM manuellement.
Le nettoyage et lanalyse de la base de donnes peuvent tre raliss sparment si
ncessaire. Utiliser la commande VACUUM ne mettra pas jour les statistiques alors que lancer
la commande ANALYZE ne rcuprera pas lespace libre des lignes dune table. Chacune de
ces commandes peut tre lance sur lintgralit de la base de donnes, sur une table ou sur
une seule colonne.
VACUUM ANALYZE nyc_census_blocks;
[Link]
objets ont des tailles relatives aux autres, dautre projections conservent les angles (conformes)
comme la projection Mercator. Certaines projections tentent de minimiser la distorsion des
diffrents paramtres. Le point commun entre toutes les projections est quelles transforment le
monde (sphrique) en un systme plat de coordonnes cartsiennes, et le choix de la
projection dpend de ce que vous souhaitez faire avec vos donnes.
Nous avons dj rencontr des projections, lorsque nous avons charg les donnes de la ville
de Ney York .Rappelez-vous quelles utilisaient le SRID 26918. Parfois, vous aurez malgr tout
besoin de transformer et de reprojeter vos donnes dun systme de projection un autre, en
utilisant la fonctionST_Transform(geometry, srid). Pour manipuler les identifiants de systme
de
rfrence
spatiale
partir
dune
gomtrie,
PostGIS
fournit
les
fonctions ST_SRID(geometry) et ST_SetSRID(geometry, srid).
Nous pouvons vrifier le SRID de nos donnes avec la commande ST_SRID :
SELECT ST_SRID(geom) FROM nyc_streets LIMIT 1;
26918
Et quelle est la dfinition du 26918 ? Comme nous lavons vu lors de la partie chargement
des donnes, la dfinition se trouve dans la table spatial_ref_sys. En fait, deux dfinitions
sont prsentes. La dfinition au format WKT dans la colonne srtext
SELECT * FROM spatial_ref_sys WHERE srid = 26918;
En fait, pour les calculs internes de re-projection, cest le contenu de la colonne proj4text qui
est utilis. Pour notre projection 26918, voici la dfinition au format proj.4 :
SELECT proj4text FROM spatial_ref_sys WHERE srid = 26918;
+proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs
En pratique, les deux colonnes srtext et proj4text sont importantes : la colonne srtext est
utilise par les applications externes comme GeoServer, uDig <[Link]>`_, FME et
autres, alors que la colonne proj4text est principalement utilise par PostGIS en interne.
Comparaison de donnes
Combins, une coordonne et un SRID dfinissent une position sur le globe. Sans le SRID, une
coordonne est juste une notion abstraite. Un systme de coordonnes cartsiennes est
dfinit comme un systme de coordonnes plat sur la surface de la Terre. Puisque les
fonctions de PostGIS utilisent cette surface plane, les oprations de comparaison ncessitent
que lensemble des objets gomtriques soient reprsents dans le mme systme, ayant le
mme SRID.
Si vous utilis des gomtries avec diffrents SRID vous obtiendrez une erreur comme celle-ci :
SELECT ST_Equals(
ST_GeomFromText('POINT(0 0)', 4326),
Note
Si vous chargez les donnes ou crez une nouvelle gomtrie sans spcifier de SRID, la valeur
du SRID prendra alors la valeur -1. Rappelez-vous que dans les Partie 8 : Les gometries,
lorsque nous avons cr nos tables gomtriques nous navions pas spcifi un SRID. Si nous
interrogeons la base, nous devons nous attendre ce que toutes les tables prfixes
par nyc_ aient le SRID 26918, alors que la tablegeometries aura la valeur -1 par dfaut.
Pour visualiser la table dassignation des SRID, interrogez la table geometry_columns de la
base de donnes.
SELECT f_table_name AS name, srid
FROM geometry_columns;
name
| srid
---------------------+------nyc_census_blocks
| 26918
nyc_neighborhoods
| 26918
nyc_streets
| 26918
nyc_subway_stations | 26918
geometries
|
-1
Nanmoins, si vous connaissez le SRID de vos donnes, vous pouvez laffecter par la suite en
utilisant la fonction ST_SetSRID sur les gomtries. Ensuite vous pourrez les transformer dans
dautres systmes de projections.
SELECT ST_AsText(
ST_Transform(
ST_SetSRID(geom,26918),
4326)
)
FROM geometries;
[Link]
[Link]
nyc_census_blocks
o
nyc_streets
o
nyc_subway_stations
o
name, geom
nyc_neighborhoods
o
Exercices
SELECT Sum(ST_Length(geom))
FROM nyc_streets;
10418904.7172
Quelle est la longueur des rues de New York, mesure en utilisant le SRID 2831 ?
SELECT Sum(ST_Length(ST_Transform(geom,2831)))
FROM nyc_streets;
10421993.706374
Note
ville de New York) alors que le systme UTM 18 doit fournir un rsultat raisonnable pour
une zone rgionale beaucoup plus large.
SELECT ST_AsKML(geom)
FROM nyc_subway_stations
WHERE name = 'Broad St';
<Point><coordinates>74.010671468873468,40.707104815584088</coordinates></Point>
H ! les coordonnes sont gographiques bien que nous nayons pas fait appel la
fonctionST_Transform, mais pourquoi ? Parce que le standard KML spcifie que toutes les
coordonnes doiventtre gographiques (en fait, dans le systme EPSG:4326), donc la
fonction ST_AsKML ralise la transformation automatiquement.
Vous pouvez continuer utiliser des coordonnes gographiques comme des coordonnes
cartsiennes approximatives pour vos analyses spatiales. Par contre les mesures de distances,
daires et de longueurs seront errones. Etant donn que les coordonnes sphriques
mesurent des angles, lunit est le degr. Par exemple, les rsultats cartsien approximatifs de
tests tels que intersects et contains peuvent savrer terriblement faux. Par ailleurs, plus une
zone est situe prs du ple ou de la ligne de date internationale, plus la distance entre les
points est agrandie.
Voici par exemple les coordonnes des villes de Los Angeles et Paris.
La requte suivante calcule la distance entre Los Angeles et Paris en utilisant le systme
cartsien standard de PostGIS ST_Distance(geometry, geometry). Notez que le SRID 4326
dclare un systme de rfrence spatiale gographique.
SELECT ST_Distance(
ST_GeometryFromText('POINT(-118.4079 33.9434)', 4326), -- Los Angeles (LAX)
ST_GeometryFromText('POINT(2.5559 49.0083)', 4326)
-- Paris (CDG)
);
121.898285970107
Diffrentes bases de donnes spatiales dveloppent diffrentes approches pour manipuler les
coordonnes gographiques.
Oracle essaye de mettre jour la diffrence de manire transparente en lanant des calculs
lorsque le SRID est gographique.
SQL Server utilise deux types spatiaux, STGeometry pour les coordonnes cartsiens et
STGeography pour les coordonnes gographqiues.
Informix Spatial est une pure extension cartsienne dInformix, alors quInformix Geodetic est une
pure extension gographique.
Toutes les valeurs retournes tant en mtres, notre rponse est donc 9124 kilomtres.
Les versions plus anciennes de PostGIS supportaient uniquement des calculs sur sphre trs
basiques comme la fonction ST_Distance_Spheroid(point, point, measurement). Celle-ci est
trs limite et ne fonctionne uniquement sur des points. Elle ne supporte pas non plus
lindexation au niveau des ples ou de la ligne de date internationale.
Le besoin du support des autres types de gomtries se fit ressentir lorsquil sagissait de
rpondre des questions du type A quelle distance la ligne de vol dun avion Los
Angeles/Paris passe-t-elle de lIslande?
Rpondre cette question en travaillant avec un plan cartsien fournit une trs mauvaise
rponse en effet ! En utilisant la ligne rouge, nous obtenons une bien meilleure rponse. Si
nous convertissons notre vol LAX-CDG en une ligne et que nous calculons la distance un
point en Islande, nous obtiendrons la rponse exacte, en mtres.
SELECT ST_Distance(
Donc le point le plus proche de lIslande pendant le vol LAX-CDG est de 532 kilomtres.
Lapproche cartsienne pour manipuler les coordonnes gographiques perd tout son sens
pour les objets situs au dessus de la ligne de date internationale. La route sphrique la plus
courte entre Los-Angeles et Tokyo traverse locan Pacifique. La route cartsienne la plus
courte traverse quant elle les ocans Atlantique et Indien.
SELECT ST_Distance(
ST_GeometryFromText('Point(-118.4079 33.9434)'),
ST_GeometryFromText('Point(139.733 35.567)'))
AS geometry_distance,
ST_Distance(
ST_GeographyFromText('Point(-118.4079 33.9434)'),
ST_GeographyFromText('Point(139.733 35.567)'))
AS geography_distance;
geometry_distance | geography_distance
-------------------+-------------------258.146005837336 |
8833954.76996256
-- LAX
-- NRT (Tokyo/Narita)
-- LAX
-- NRT (Tokyo/Narita)
la
La construction dune indexation spatiale sur une table stockant des objets
type geography est exactement identique la mthode employe pour les gomtries :
de
La diffrence est camoufle : lindexation des objets de type geography gre correctement les
requtes qui recouvrent les ples ou traversent les fuseaux horaires, alors que les gomtries
ne le supporteront pas.
Il ny a quun petit nombre de fonctions disponibles pour le type geography :
Lors de la dfinition le type GEOGRAPHY(Point) spcifie que nos aroports sont des points. Le
nouveau champ gographie nest pas rfrenc dans la table geometry_columns. Le
stockage des mtadonnes relatives aux donnes de type geography seffectue dans une vue
appele geography_columns qui est maintenue jour automatiquement sans avoir besoin
dutiliser des fonctions comme geography_columns.
SELECT * FROM geography_columns;
f_table_name
| f_geography_column | srid |
type
-------------------------------+--------------------+------+---------nyc_subway_stations_geography | geog
|
0 | Geometry
airports
| geog
| 4326 | Point
Note
La possibilit de dfinir les types et le SRID lors de la cration de la table (requte CREATE), et
la mise jour automatique des mtadonnes geometry_columns sont des fonctionalits qui
seront adaptes pour le type gomtrie pour la version 2.0 de PostGIS.
Conversion de type
Bien que les fonctions de base qui sappliquent au type geography puissent tre utilises dans
un grand nombre de cas dutilisation, il est parfois ncessaire daccder aux autres fonctions
qui ne supportent que le type gomtrie. Heureusement, il est possible de convertir des objets
de type gomtrie en des objets de types gographie et inversement.
La syntaxe habituelle de PostgreSQL pour les conversion de type consiste ajouter la valeur
la chane suivante ::typename. Donc, 2::text convertit la valeur numrique deux en une
chane de caractres 2. La commande : 'POINT(0 0)'::geometry convertira la
reprsentation textuelle dun point en une point gomtrique.
La fonction ST_X(point) supporte seulement le type gomtrique. Comment lire la coordonne
X dune de nos gographie ?
SELECT code, ST_X(geog::geometry) AS longitude FROM airports;
code | longitude
------+----------LAX | -118.4079
CDG |
2.5559
REK | -21.8628
Deuximement, les calculs sur une sphre sont plus consomateurs en ressource que les mmes
calculs dans un systme cartsien. Par exemple, la formule de calcul de distance (Pythagore)
entrane un seul appel la fonction racine carr (sqrt()). La formule de calcul de distance
sphrique (Haversine) utilise deux appels la fonction racine carr, et un appel arctan(), quatre
appels sin() et deux cos(). Les fonctions trigonomtriques sont trs coteuses, et les calculs
sphriques les utilisent massivement.
Si, dun autre cot, vous avez besoin de calculer des distances qui sont gographiquement
parses (recouvrant la plupart du monde), utilisez le type geography. La complexit de
lapplication vite en travaillant avec des objets de type geography dpassera les problmes
de performances. La conversion de type en gomtrie permettra de dpasser les limites des
fonctionnalits proposes pour ce type.
Les fonctions buffer et intersection sont actuellement construites sur le principe de conversion de
type en gomtries, et ne sont pas actuellement capable de grer des coordonnes sphriques. Il en
rsulte quelles peuvent ne pas parvenir retourner un rsultat correcte pour des objets ayant une
[1 grande tendue qui ne peut tre reprsent correctement avec une reprsentation planaire.
]
ST_Centroid / ST_PointOnSurface
Un besoin commun lors de la cration de requtes spatiales est de remplacer une entit
polygonale par un point reprsentant cette entit. Cela est utile pour les jointures spatiales
(comme
indiqu
ici
:Polygones/Jointures
de
polygones)
car
utiliser ST_Intersects(geometry,geometry) avec deux polygones impliquera un double
comptage : un polygone pour le contour externe intersectera dans les deux sens; le remplacer
par un point le forcera tre dans un seul sens, pas les deux.
ST_Buffer
Lopration de zone tampon est souvent disponible dans les outils SIG, il est aussi disponible
dans PostGIS. La fonction ST_Buffer(geometry,distance) prend en paramtre une gomtrie
et une distance et retourne une zone tampon dont le contour est une distance donne de la
gomtrie dorigine.
Par exemple, si les services des parcs amricains souhaitaient renforcer la zone du traffic
maritime autour de lle Liberty, ils pourraient construire une zone tampon de 500 mtres
autour de lle. Lle de Liberty est reprsente par un seul bloc dans notre
table nyc_census_blocks, nous pouvons donc facilement raliser ce calcul.
-- Cration d'une nouvelle table avec une zone tampon de 500 m autour de 'Liberty
Island'
CREATE TABLE libery_island_zone AS
SELECT ST_Buffer(geom,500) AS geom
FROM nyc_census_blocks
WHERE blkid = '360610001009000';
-- Mise jour de la table geometry_columns
SELECT Populate_Geometry_Columns();
La fonction ST_Buffer permet aussi dutiliser des valeurs ngatives pour le paramtre distance
et construit un polygone inclus dans celui pass en paramtre. Pour les points et les lignes
vous obtiendrez simplement un rsultat vide.
ST_Intersection
Une autre opration classique prsente dans les SIG - le chevauchement - cre une nouvelle
entit en calculant la zone correspondant lintersection de deux polygones superposs. Le
rsultat la proprit de permettre de reconstruire les entits de base laide de ce rsultat.
ST_Union
Dans lexemple prcdent, nous intersections des gomtries, crant une nouvelle gomtrie
unique partir de deux entits. La commande ST_Union fait linverse, elle prend en paramtre
des gomtries et supprime les parties communes. Il y a deux versions possibles de la
fonction ST_Union :
ST_Union(geometry, geometry): une version avec deux paramtres qui prend les
gomtries et retourne lunion des deux. Par exemple, nos deux cercles ressemblent
ce qui suit si nous utilisons lopration union plutt que lintersection.
Comme
exemple
pour
la
fonction
dagrgation ST_Union,
considrons notre
table nyc_census_blocks. Les gographie du recensement sont construites de manire ce
quon puisse crer dautres gographies partir des premires. ainsi, nous pouvons crer une
carte des secteurs de recensement en fusionnant les blocs que forme chaque secteur (comme
nous le ferons aprs dans la cration des tables secteurs). Ou, nous pouvons crer une carte
du comt en fusionnant les blocs qui relvent de chaque comt.
Pour effectuer la fusion, notez que la cl unique blkid incorpore des informations sur les
gographies de niveau suprieur. Voici les parties de la cl pour Liberty Island que nous avons
utilis prcdemment.
360610001009000 = 36 061 00100 9000
36
061
000100
9
000
=
=
=
=
=
Ainsi, nous pouvons crer une carte du comt en fusionnant toutes les gomtries qui
partagent les 5 premiers chiffres de blkid.
-- Cration d'une table nyc_census_counties en regroupant les blocs
CREATE TABLE nyc_census_counties AS
SELECT
ST_Union(geom) AS geom,
SubStr(blkid,1,5) AS countyid
FROM nyc_census_blocks
GROUP BY countyid;
Un test de surface peut confirmer que notre opration dunion na pas perdu de gomtries.
Tout dabord, nous calculons la surface de chacun des blocs de recensement et faisons la
somme de ces surfaces en les groupant par lidentifiant de recensement des comts.
SELECT SubStr(blkid,1,5) AS countyid, Sum(ST_Area(geom)) AS area
FROM nyc_census_blocks
GROUP BY countyid;
countyid |
area
----------+-----------------36005
| 109807439.720947
36047
| 184906575.839355
36061
| 58973521.6225586
36081
| 283764734.207275
36085
| 149806077.958252
Ensuite nous calculons laire de chaque zone de nos nouveaux polygones de rgion de la table
count :
SELECT countyid, ST_Area(geom) AS area
FROM nyc_census_counties;
countyid |
area
----------+-----------------36005
| 109807439.720947
36047
| 184906575.839355
36061
| 58973521.6225586
36081
| 283764734.207275
36085
| 149806077.958252
La mme rponse ! Nous avons construit avec succs une table des rgions de NYC partir de
nos donnes initiales.
le
menu
et
naviguez
jusquau
=
=
=
=
=
Nous sommons les statistiques qui nous intressent, nous les divisons ensuite la fin. Afin
dviter lerreur de non-division par zro, nous ne prenons pas en compte les quartiers qui nont
aucune personne ayant obtenu un diplme.
graduate_pct |
name
| boroname
--------------+-------------------+----------40.4 | Carnegie Hill
| Manhattan
40.2 | Flatbush
| Brooklyn
34.8 | Battery Park
| Manhattan
33.9 | North Sutton Area | Manhattan
33.4 | Upper West Side
| Manhattan
33.3 | Upper East Side
| Manhattan
32.0 | Tribeca
| Manhattan
31.8 | Greenwich Village | Manhattan
29.8 | West Village
| Manhattan
29.7 | Central Park
| Manhattan
Polygones/Jointures de polygones
Dans notre requte intressante (dans Rpondre une question intressante) nous avons
utilis la fonction ST_Intersects(geometry_a, geometry_b) pour dterminer quelle entit
polygonale inclure dans chaque groupe de quartier. Ce qui nous conduit la question : que ce
passe-t-il si une entit tombe entre deux quartiers ? Il intersectera chacun dentre eux et ainsi
sera inclut dans chacun des rsultats.
La mthode simple consiste a sassurer que chaque entit ne se retrouve que dans unseul
groupe gographique (en utilisant ST_Centroid(geometry))
La mthode complexe consiste disviser les parties qui se croisent en utilisant les bordures (en
utilisant ST_Intersection(geometry,geometry))
Voici un exemple dutilisation de la mthode simple pour viter le double comptage dans notre
requte prcdente :
SELECT
Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct,
[Link], [Link]
FROM nyc_neighborhoods n
JOIN nyc_census_tracts t
ON ST_Contains([Link], ST_Centroid([Link]))
WHERE t.edu_total > 0
GROUP BY [Link], [Link]
ORDER BY graduate_pct DESC
LIMIT 10;
sexcuter,
puisque
la
graduate_pct |
name
| boroname
--------------+-------------------+----------49.2 | Carnegie Hill
| Manhattan
39.5 | Battery Park
| Manhattan
34.3 | Upper East Side
| Manhattan
33.6 | Upper West Side
| Manhattan
32.5 | Greenwich Village | Manhattan
32.2 | Tribeca
| Manhattan
31.3 | North Sutton Area | Manhattan
30.8 | West Village
| Manhattan
30.1 | Downtown
| Brooklyn
28.4 | Cobble Hill
| Brooklyn
Avec la population des gens de New York dans un rayon de 500 mtres dune station de mtro :
SELECT Sum(popn_total)
FROM nyc_census_blocks census
JOIN nyc_subway_stations subway
ON ST_DWithin([Link], [Link], 500);
10556898
La solution est de sassurer que nous avons seulement des blocs distincts avant de les
regrouper. Nous pouvons raliser cela en cassant notre requte en sous-requtes qui
rcuprent les blocs distincts, les regroupent pour ensuite retourner notre rponse :
SELECT Sum(popn_total)
FROM (
SELECT DISTINCT ON (blkid) popn_total
FROM nyc_census_blocks census
JOIN nyc_subway_stations subway
ON ST_DWithin([Link], [Link], 500)
) AS distinct_blocks;
4953599
Cest mieux ! Donc un peu plus de 50 % de la population de New York vit proximit (500m,
environ 5 7 minutes de marche) du mtro.
Partie 20 : Validit
Dans 90% des cas la rponse la question pourquoi mes requtes me renvoient un message
derreur du type TopologyException error est : un ou plusieurs des arguments passs sont
invalides. Ce qui nous conduit nous demander : que signifie invalide et pourquoi est-ce
important ?
Les contours qui dfinissent des trous doivent tre inclus dans la zone dfinie par le contour
extrieur.
Les contours ne doivent pas toucher les autres contours, sauf en un point unique.
Les deux dernires rgles font partie de la catgorie arbitraire. Il y a dautres moyens de dfinir
des polygones qui sont consistants mais les rgles ci-dessus sont celles utilises dans le
standard OGCSFSQL que respecte PostGIS.
La raison pour laquelle ces rgles sont importantes est que les algorithmes de calcul dpendent
de cette structuration consistante des arguments. Il est possible de construire des algorithmes
qui nutilisent pas cette structuration, mais ces fonctions tendent tre trs lentes, tant donn
que la premire tape consiste analyser et construire des structures lintrieur des
donnes.
Voici un exemple de pourquoi cette structuration est importante. Ce polygone nest pas valide :
POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0));
Vous pouvez comprendre ce qui nest pas valide en regardant cette figure :
Le contour externe est exactement en forme en 8 avec une intersection au milieu. Notez que la
fonction de rendu graphique est tout de mme capable den afficher lintrieur, donc
visuellement cela ressemble bien une aire : deux units carr, donc une aire couplant ces
deux units.
Essayons maintenant de voir ce que pense la base de donnes de notre polygone :
SELECT ST_Area(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0,
0 0))'));
st_area
--------0
Que ce passe-t-il ici ? Lalgorithme qui calcule laire suppose que les contours ne sintersectent
pas. Un contour normal devra toujours avoir une aire qui est borne (lintrieur) dans un sens
de la ligne du contour (peu importe quelle sens, juste un sens). Nanmoins, dans notre figure
en 8, le contour externe est droite de la ligne pour un lobe et gauche pour lautre. Cela
entraine que les aires qui sont calcules pour chaque lobe annulent la prcdente (lune vaut 1
et lautre -1) donc le rsultat est une aire de zro.
Dtecter la validit
Dans lexemple prcdent nous avions un polygone que nous savions non-valide. Comment
dterminer les gomtries non valides dans une tables dun million denregistrements ? Avec la
fonctionST_IsValid(geometry) utilise avec notre polygone prcdent, nous obtenons
rapidement la rponse :
SELECT ST_IsValid(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1
0, 0 0))'));
f
Maintenant nous savons que lentit est non-valide mais nous ne savons pas pourquoi. Nous
pouvons utiliser la fonction ST_IsValidReason(geometry) pour trouver la cause de non validit
:
SELECT ST_IsValidReason(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1
1, 1 0, 0 0))'));
Self-intersection[1 1]
Un bon outil pour rparer visuellement des gomtries non valide est OpenJump
([Link] qui contient un outils de validation depuis le menu Tools->QA->Validate
Selected Layers.
Maintenant, la bonne nouvelle : un grand nombre de non-validits peut tre rsolu dans la
base de donnes en utilisant la fonction : ST_Buffer.
Le coup du Buffer tire avantage de la manire dont les buffers sont construits : une gomtrie
bufferise est une nouvelle gomtrie, construite en dplaant les lignes de la gomtrie
dorigine. Si vous dplacez les lignes originales par rien (zero) alors la nouvelle gomtrie aura
une structure identique loriginale, mais puisquelle utilise les rgles topologiques de lOGC,
elle sera valide.
Par exemple, voici un cas classique de non-validit - le polygone de la banane - un seul
contour que cre une zone mais se touche, laissant un trou qui nen est pas un.
POLYGON((0 0, 2 0, 1 1, 2 2, 3 1, 2 0, 4 0, 4 4, 0 4, 0 0))
En crant un buffer de zero sur le polygone retourne un polygone OGC valide, le contour
externe et un contour interne qui touche lautre en un seul point.
SELECT ST_AsText(
ST_Buffer(
ST_GeometryFromText('POLYGON((0 0, 2 0, 1 1, 2 2, 3 1, 2 0, 4 0, 4 4, 0 4,
0 0))'),
0.0
)
);
POLYGON((0 0,0 4,4 4,4 0,2 0,0 0),(2 0,3 1,2 2,1 1,2 0))
Note
non valides et prfre la forme de banane pour ce cas de figure. Le modle de lOGC est
linverse.
Une faon simple dditer ce fichier de configuration est dutiliser loutil nomm : Backend
Configuration Editor. Depuis pgAdmin, allez dans File > Open [Link].... Il vous sera
demand le chemin du fichier, naviguez dans votre arborescence jusquau
fichier C:\Documents andSettings\%USER\.opengeo\pgdata\%USER.
Cette partie dcrit certains des paramtres de configuration qui doivent tre modifis pour la
mise ne place dune base de donnes spatiale en production. Pour chaque partie, trouvez le
bon paramtre dans la liste et double cliquez dessus pour lditer. Changez le champ Value par
la valeur que nous recommandons, assurez-vous que le champ est bien activ puis cliquez
sur OK.
Note
Ces valeurs sont seulement celles que nous recommandons, chaque environnement diffrera et
tester les diffrents paramtrages est toujours ncessaire pour sassurer dutiliser la
configuration optimale. Mais dans cette partie nous vous fournissons un bon point de dpart.
shared_buffers
Alloue la quantit de mmoire que le serveur de bases de donnes utilise pour ses segments
de mmoires partages. Cela est partag par tous les processus serveur, comme son nom
lindique. La valeur par dfaut est affligeante et inadapte pour une base de donnes en
production.
Valeur par dfaut : typiquement 32MB
Valeur recommande : 75% de la mmoire de la base de donnes (500MB)
work_mem
Dfinit la quantit de mmoire que les opration internes dordonnancement et les tables de
hachages peuvent consommer avec le serveur sur le disque. Cette valeur dfinit la mmoire
disponible pour chaque opration complexe, les requtes complexes peuvent avoir plusieurs
ordres ou opration de hachage tournant en parallle, et chaque client connect peut excuter
une requte.
Vous devez donc considrer combien de connexions et quelle complexit est attendue dans les
requtes avant daugmenter cette valeur. Le bnfice acquis par laugmentation de cette valeur
est que la plupart des opration de classification, dont les clause ORDER BY et DISTINCT, les
jointures, les agrgation bases sur les hachages et lexcution de requte imbriques,
pourront tre ralises sans avoir passer par un stockage sur disque.
Valeur par dfaut : 1MB
Valeur recommande : 16MB
maintenance_work_mem
Dfinit la quantit de mmoire utilise pour les opration de maintenance, dont le nettoyage
(VACUUM), les index et la cration de clefs trangres. Comme ces opration sont
couramment utilises, la valeur par dfaut devrait tre acceptable. Ce paramtre peut tre
augment dynamiquement lexcution depuis une connexion au serveur avant lexcution
wal_buffers
Dfinit la quantit de mmoire utilise pour lcriture des donnes dans le journal respectant la
rgle du defer (WAL). Elle indique que les informations pour annuler les effets dune opration
sur un objet doivent tre crites dans le journal en mmoire stable avant que lobjet modifi ne
migre sur le disque. Cette rgle permet dassurer lintgrit des donnes lors dune reprise
aprs dfaillance. En effet, il suffira de lire le journal pour retrouver ltat de la base lors de son
arrt brutal.
La taille de ce tampon ncessite simplement dtre suffisament grand pour stocker les donnes
WAL pour une seule transaction. Alors que la valeur par dfaut est gnralement suffisante, les
donnes spatiales tendent tre plus larges. Il est donc recommand daugmenter la taille
spcifie dans ce paramtre.
Valeur par dfaut : 64kB
checkpoint_segments
Cette valeur dfinit le nombre maximum de segments des journaux (typiquement 16MB) qui doit
tre remplit entre chaque point de reprise WAL. Un point de reprise WAL est une partie dune
squence de transactions pour lequel on garantit que les fichiers de donnes ont t mis jour
avec toutes les requtes prcdant ce point. ce moment-l toutes les pages sont punaises
sur le disque et les points de reprise sont crits dans le fichier de journal. Cela permet au
processus de reprise aprs dfaillance de trouver les derniers points de reprise et applique
toute les lignes suivantes pour rcuprer ltat des donnes avant la dfaillance.
tant donn que les points de reprise ncessitent un punaisage de toutes le pages ayant t
modifies sur le disque, cela va crer une charge dentres/sorties significative. Le mme
argument que prcdemment sapplique ici, les donnes spatiales sont assez grandes pour
contrebalancer loptimisation de donnes non spatiales. Augmenter cette valeur limitera le
nombre de points de reprise, mais impliquera un redmarrage plus lent en cas de dfaillance.
Valeur par dfaut : 3
Valeur recommande : 6
random_page_cost
Cette valeur sans unit reprsente le cot daccs alatoire une page du disque. Cette valeur
est relative aux autres paramtres de cot notamment laccs squentiel aux pages, et le cot
des oprations processeur. Bien quil ny ait pas de valeur magique ici, la valeur par dfaut est
gnralement trop faible. Cette valeur peut tre affecte dynamiquement par session en
utilisant la commande SET random_page_costTO 2.0.
Valeur par dfaut : 4.0
Valeur recommande : 2.0
seq_page_cost
Cest une paramtre qui contrle le cot des accs squentiels aux pages. Il nest
gnralement pas ncessaire de modifier cette valeur mais la diffrence entre cette valeur et la
valeur random_page_costaffecte drastiquement le choix fait par le planificateur de requtes.
Cette valeur peut aussi tre affecte depuis une session.
Valeur par dfaut : 1.0
Valeur recommande : 1.0
Recharger la configuration
Aprs avoir ralis les changements mentionns dans cette partie sauvez-les puis rechargez la
configuration.
Cliquez sur le bouton Shutdown depuis le Dashboard OpenGeo, puis cliquez sur Start.
Pour finir reconnectez-vous au serveur depuis pgAdmin (cliquez avec le bouton droit sur le
serveur puis slectionnez Connect).
Partie 22 : galit
galit
tre en mesure de dterminer si deux geomtries sont gales peut tre compliqu. PostGIS
met votre disposition diffrentes fonctions permettant de juger de lgalit diffrents niveaux,
bien que pour des raison de simplicit nous nous contenterons ici de la dfinition fournie plus
bas. Pour illustrer ces fonctions, nous utiliserons les polygones suivants.
Exactement gaux
Lgalit exacte est dtermine en comparant deux gomtries, sommets par sommets, dans
lordre, pour sassurer que chacun est une position identique. Les exemples suivant montrent
comment cette mthode peut tre limite dans son efficacit.
SELECT [Link], [Link], CASE WHEN ST_OrderingEquals([Link], [Link])
THEN 'Exactly Equal' ELSE 'Not Exactly Equal' end
FROM polygons as a, polygons as b;
Dans cette exemple, les polygones sont seulement gaux eux-mme, mais jamais avec un
des autres polygones (dans notre exemple les polygones de 1 3). Dans le cas des polygones
1, 2 et 3, les sommets sont des positions identiques mais sont dfinis dans un ordre diffrent.
Le polygone 4 a des sommets en double causant la non-galit avec le polygone 1.
Spatialement gaux
Comme nous lavons prcdemment montr, lgalit exacte ne prend pas en compte la nature
spatiale des gomtries. Il y a une fonction, nomme ST_Equals, permettant de tester lgalit
spatiale ou lquivalence des gomtries.
SELECT [Link], [Link], CASE WHEN ST_Equals([Link], [Link])
THEN 'Spatially Equal' ELSE 'Not Equal' end
FROM polygons as a, polygons as b;
Ces rsultats sont plus proches de notre comprhension intuitive de lgalit. Les polygones de
1 4 sont considrs comme gaux, puisque quils recouvrent la mme zone. Notez que ni la
direction des polygones nest considre, ni le point de dpart pour la dfinition du polygone, ni
le nombre de points. Ce qui importe cest que la zone gographique reprsente soit la mme.
Comme vous pouvez le constater, toutes les gomtries gales ont aussi une tendue gale.
Malheureusement, le polygone 5 est aussi retourn comme tant gal avec ce test, puisquil
partage la mme tendue que les autres gomtries. Mais alors, pourquoi est-ce utile ? Bien
que cela soit trait en dtail plus tard, la rponse courte est que cela permet lutilisation
dindexations spatiales qui peuvent rduire drastiquement les ensembles de gomtries
comparer en utilisant des filtres utilisant cette galit dtendue.
Constructeurs
ST_MakePoint(Longitude, Latitude)
Retourne un nouveau point. Note : ordre des coordonnes (longitude puis latitude).
ST_GeomFromText(WellKnownText, srid)
Retourne une nouvelle gomtrie partir dun reprsentation au format WKT et un SRID.
ST_SetSRID(geometry, srid)
Met jour le SRID dune gomtrie. Retourne la mme gomtrie. Cela ne modifie pas les
coordonnes de la gomtrie, cela met simplement jour le SRID. Cette fonction est utile pour
reconditionner les gomtries sans SRID.
ST_Expand(geometry, Radius)
Retourne une nouvelle gomtrie qui est une extension de ltendue de la gomtrie passe en
argument. Cette fonction est utile pour crer des enveloppes pour des recherches utilisant les
indexations.
Constructeurs
ST_MakePoint(Longitude, Latitude)
Retourne un nouveau point. Note : ordre des coordonnes (longitude puis latitude).
ST_GeomFromText(WellKnownText, srid)
Retourne une nouvelle gomtrie partir dun reprsentation au format WKT et un SRID.
ST_SetSRID(geometry, srid)
Met jour le SRID dune gomtrie. Retourne la mme gomtrie. Cela ne modifie pas les
coordonnes de la gomtrie, cela met simplement jour le SRID. Cette fonction est utile pour
reconditionner les gomtries sans SRID.
ST_Expand(geometry, Radius)
Retourne une nouvelle gomtrie qui est une extension de ltendue de la gomtrie passe en
argument. Cette fonction est utile pour crer des enveloppes pour des recherches utilisant les
indexations.
Sorties
ST_AsText(geometry)
Mesures
ST_Area(geometry)
Retourne laire dune gomtrie dans lunit du systme de rfrence spatiale.
ST_Length(geometry)
Retourne la longueur de la gomtrie dans lunit du systme de rfrence spatiale.
ST_Perimeter(geometry)
Retourne le primtre de la gomtrie dans lunit du systme de rfrence spatiale.
ST_NumPoints(linestring)
Retourne le nombre de sommets dans une ligne.
ST_NumRings(polygon)
Retourne le nombre de contours dans un polygone.
ST_NumGeometries(geometry)
Retourne le nombre de gomtries dans une collection de gomtries.
Relations
ST_Distance(geometry, geometry)
Retourne la distance entre deux gomtries dans lunit du systme de rfrence spatiale.
ST_DWithin(geometry, geometry, radius)
Retourne TRUE si les gomtries sont distantes dun rayon de lautre, sinon FALSE.
ST_Intersects(geometry, geometry)
Retourne TRUE si les gomtries sont disjointes, sinon FALSE.
ST_Contains(geometry, geometry)
Retourne TRUE si la premire gomtrie est totalement contenue dans la seconde, sinon
FALSE.
ST_Crosses(geometry, geometry)
Retourne TRUE si une ligne ou les contours dun polygone croisent une ligne ou un contour de
polygone, sinon FALSE.
Sorties
ST_AsText(geometry)
Retourne une gomtrie au format WKT.
ST_AsGML(geometry)
Retourne la gomtrie au format standard OGC GML.
ST_AsGeoJSON(geometry)
Retourne une gomtrie au format standard GeoJSON.
Mesures
ST_Area(geometry)
Retourne laire dune gomtrie dans lunit du systme de rfrence spatiale.
ST_Length(geometry)
Retourne la longueur de la gomtrie dans lunit du systme de rfrence spatiale.
ST_Perimeter(geometry)
Retourne le primtre de la gomtrie dans lunit du systme de rfrence spatiale.
ST_NumPoints(linestring)
Retourne le nombre de sommets dans une ligne.
ST_NumRings(polygon)
Retourne le nombre de contours dans un polygone.
ST_NumGeometries(geometry)
Retourne le nombre de gomtries dans une collection de gomtries.
Constructeurs
ST_MakePoint(Longitude, Latitude)
Retourne un nouveau point. Note : ordre des coordonnes (longitude puis latitude).
ST_GeomFromText(WellKnownText, srid)
Retourne une nouvelle gomtrie partir dun reprsentation au format WKT et un SRID.
ST_SetSRID(geometry, srid)
Met jour le SRID dune gomtrie. Retourne la mme gomtrie. Cela ne modifie pas les
coordonnes de la gomtrie, cela met simplement jour le SRID. Cette fonction est utile pour
reconditionner les gomtries sans SRID.
ST_Expand(geometry, Radius)
Retourne une nouvelle gomtrie qui est une extension de ltendue de la gomtrie passe en
argument. Cette fonction est utile pour crer des enveloppes pour des recherches utilisant les
indexations.
Sorties
ST_AsText(geometry)
Retourne une gomtrie au format WKT.
ST_AsGML(geometry)
Retourne la gomtrie au format standard OGC GML.
ST_AsGeoJSON(geometry)
Retourne une gomtrie au format standard GeoJSON.
Mesures
ST_Area(geometry)
Retourne laire dune gomtrie dans lunit du systme de rfrence spatiale.
ST_Length(geometry)
Retourne la longueur de la gomtrie dans lunit du systme de rfrence spatiale.
ST_Perimeter(geometry)
Retourne le primtre de la gomtrie dans lunit du systme de rfrence spatiale.
ST_NumPoints(linestring)
Retourne le nombre de sommets dans une ligne.
ST_NumRings(polygon)
Retourne le nombre de contours dans un polygone.
ST_NumGeometries(geometry)
Retourne le nombre de gomtries dans une collection de gomtries.
Relations
ST_Distance(geometry, geometry)
Retourne la distance entre deux gomtries dans lunit du systme de rfrence spatiale.
ST_DWithin(geometry, geometry, radius)
Retourne TRUE si les gomtries sont distantes dun rayon de lautre, sinon FALSE.
ST_Intersects(geometry, geometry)
Retourne TRUE si les gomtries sont disjointes, sinon FALSE.
ST_Contains(geometry, geometry)
Retourne TRUE si la premire gomtrie est totalement contenue dans la seconde, sinon
FALSE.
ST_Crosses(geometry, geometry)
Retourne TRUE si une ligne ou les contours dun polygone croisent une ligne ou un contour de
polygone, sinon FALSE.
Annexes B : Glossaire
CRS
Un systme de rfrence spatiale. La combinaison dun systme de coordonnee
gographiques et un systme de projection.
GDAL
Geospatial Data Abstraction Library, prononc GDAL, une bibliothque open source
permettant daccder aux donnes rasters supportant un grand nombre de formats,
utilis largement la fois dans les applications open source et propritaires.
GeoJSON
Javascript Object Notation, un format texte qui est trs rapide et qui permet de
reprsenter des objets JavaScript. En spatial, la spcification tendue GeoJSON est
couramment utilise.
SIG
Systme dInformation Gographique capture, stocke, analyse, gre, et prsente les
donnes qui sont relies la zone gographique.
GML
Geography Markup Language. Le GML est un format standard XML OGC pour
reprsenter les donnes gographiques.
JSON
Javascript Object Notation, un format texte qui est trs rapide et permet de stocker des
objets JavaScript. Au niveau spatial, la spcification tendue GeoJSON est couramment
utilis.
JSTL
JavaServer Page Template Library, est une bibliothque pour JSP qui encapsule
plusieurs fonctionnalits de bases gres en JSP (requte de bases de donnes,
itration, conditionnel) dans un syntaxe tierce.
JSP
JavaServer Pages est un systme de script pour les serveur dapplications Java qui
permet de mixer du code XML et du code Java.
KML
Keyhole Markup Language, le format XML utilis par Google Earth. Google Earth. Il ft
lorigine dvelopp par la socit Keyhole, ce qui explique sa prsence (maintenant
obscure) dans le nom du format.
OGC
Open Geospatial Consortium [Link] (OGC) est une organisation qui
dveloppe des spcifications pour les services spatiaux.
OSGeo
Open Source Geospatial Foundation [Link] (OSGeo) est une association but
non lucratif ddie la promotion et au support des logiciels cartographiques open
source.
SFSQL
La spcification Simple Features for SQL (SFSQL) de lOGC dfinit les types et les
fonctions qui doivent tre disponibles dans une base de donnes spatiale.
SLD
Les spcifications Styled Layer Descriptor (SLD) de lOGC dfinissent un format
permettant de dcrire la manire dafficher des donnes vectorielles.
SRID
Spatial reference ID est un identifiant unique assign un systme de coordonnes
gographiques particulier. La table PostGIS spatial_ref_sys contient une large collection
de valeurs de SRID connus.
SQL
Structured query language est un standard permettant de requter les bases de
donnes relationnelles. Rfrence [Link]
SQL/MM
SQL Multimedia; spcification contenant diffrentes sections sur les types tendues. Elle
inclue une section substantielle sur les types spatiaux.
SVG
Scalable vector graphics est une famille de spcifications bas sur le format XML pour
dcrire des objet graphiques en 2 dimensions, aussi bien statiques que dynamiques (par
exemple
interactif
ou
anim).
Rference : [Link]
WFS
La spcification Web Feature Service (WFS) de lOGC dfinit une interface pour lire et
crire des donnes gographiques travers internet.
WMS
La spcification Web Map Service (WMS) de lOGC dfinit une interface pour requter
une carte travers internet.
WKB
WKT
Well-known text. Fait rfrence la reprsentation textuelle de gomtries, avec des
chanes commenant par POINT, LINESTRING, POLYGON, etc. Il peut aussi faire
rfrence la reprsentation textuelle dun CRS, avec une chane commenant par
PROJCS, GEOGCS, etc. Les reprsentations au format Well-known text sont des
standards de lOGC, mais nont pas leur propres documents de spcifications. La
premire description du WKT (pour les gomtries et pour les CRS) apparaissent dans
les spcifications SFSQL 1.0.
Annexes C : License
Ce contenu est publi sous licence Creative Commons share alike with attribution, et est
librement redistribuable en respectant les termes de cette license.
Vous devez conserver lensemble des copyrights prsents dans ce document.