IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

PostGis : Recherche d'une ligne la plus proche d'un point


Sujet :

PostgreSQL

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut PostGis : Recherche d'une ligne la plus proche d'un point
    Bonjour à tous,

    Je possède trois tables définissant des lignes (St_LineString), et une définissant des points (St_Point).

    Chaque point possède une référence à la ligne correspondante, mais parfois je ne l'ai pas via les données d'entrée. Alors je souhaite remplir cette référence en me basant sur la ligne la plus proche de ce point.

    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE point a SET ref_line = (
    	SELECT name FROM (
    		select name, geometry from lines1
    			union
    		select name, geometry from lines2
    			union
    		select name, geometry from lines3
    	) sub
    	order by st_distance(sub.geometry, a.geometry) ASC
    	limit 1
    ) where ref_line is null or char_length(ref_line) = 0;
    Cette requête me paraît plutôt simple, mais elle est très longue à s'exécuter :
    - Machine : Core i3, 1.7Ghz, 3Go de RAM
    - OS : Ubuntu
    - Données : 113789 lignes et 15385 points

    Temps : plus de 6h d'exécution.

    Est-ce qu'il n'y aurait pas possibilité d'améliorer cette fonction ? C'était une bonne idée le ORDER BY / LIMIT 1 ?

    Peut-être mieux vaut-t-il placer les tables de lignes dans une vue avant de taper dedans ?

    Merci à vous,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faudrait voir le EXPLAIN de la requête.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    J'ai trouvé, il fallait d'abord utiliser l'index GIST en réduisant la zone géographique comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE sub.geometry && St_Expand(a.geometry, 0.001)
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Complexité] recherche des n points les plus proches d'un point dans une liste
    Par Benoit_T dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 20/06/2009, 15h55
  2. [DEBUTANT]recherche de date - heure la plus proche
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/06/2007, 12h15
  3. Réponses: 10
    Dernier message: 06/03/2007, 14h36
  4. le pixel noir le plus proche d'un point dans une image
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 28/03/2006, 08h44
  5. [VBA-E]recherche d'une ligne
    Par calimero91 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/01/2006, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo