recette #15
Lieux très habités

Février 2011


Précédent

Table des matières

Suivant


Le problème

Un nouveau problème basé sur la table populated_places. Cette fois la question est:

  • Identifier tous les couples possibles de Populated Places peu éloignés l'un de l'autre: < 1 Km

note: ce problème cache une petite complication.

  • la table Populated Places utilise le SRID 4236 (Geographic, WGS84, long-lat)

  • ainsi, les distances sont naturellement en dégrée décimal

  • mais notre contrainte de distance est en mètres/Km


PopulatedPlace #1

Distance (meters)

PopulatedPlace #2

Vallarsa

49.444299

Raossi

Raossi

49.444299

Vallarsa

Seveso

220.780551

Meda

Meda

220.780551

Seveso

...

...

...



SELECT pp1.name AS "PopulatedPlace #1",
  GeodesicLength(
    MakeLine(pp1.geometry, pp2.geometry))
      AS "Distance (meters)",
  pp2.name AS "PopulatedPlace #2"
FROM populated_places AS pp1,
  populated_places AS pp2
WHERE GeodesicLength(
    MakeLine(pp1.geometry, pp2.geometry)) < 1000.0
  AND pp1.id <> pp2.id
  AND pp2.ROWID IN (
    SELECT pkid
    FROM idx_populated_places_geometry
    WHERE pkid MATCH RTreeDistWithin(
      ST_X(pp1.geometry),
      ST_Y(pp1.geometry), 0.02))
ORDER BY 2;

Cette fois ci, nous  allons directement à la solution
Je suppose que maintenant vous avez bien compris la nécessite d'utiliser un Index Spatial pour obtenir une requète performante et qu'une jointure entre deux instances d'une même table est également nécessaire pour ce type d'analyse spatiale.

On va s’intéresser aux points les plus importants:

Exécuter une requête de ce type sans se préoccuper des performances (ie sans R*Tree) nécessite un temps de calcul extrêmement long, même pour les processeurs les plus récents et les plus performants.
L'optimisation des requêtes va permettre de réduire grandement ce temps de calcul: le temps que l'on y consacre est très souvent largement récompensé.


Précédent

Table des matières

Suivant


Author: Alessandro Furieri a.furieri@lqt.it
Traduced From English by RIVIERE Romain

This work is licensed under the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.


Permission is granted to copy, distribute and/or modify this document under the terms of the
GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.