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

Requêtes PostgreSQL Discussion :

[Postgis] Intersection raster vecteur


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut [Postgis] Intersection raster vecteur
    Bonjour,

    Dans une base Postgis, j'ai une couche raster et une couche vecteur (ligne).
    Je voudrais récupérer les valeurs des pixels du raster qui intersectent ma ligne :
    voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT sampno, 
    (ST_Intersection(r.no2, traj.geom)).geom road, 
    (ST_Intersection(r.no2, traj.geom)).val elevation,
    r.rid
    from output_1_t100_27572 as r,
    	(SELECT sampno,  ST_Transform(geom, 27572) as geom
    	from trajectories.corrected_gps_info_line_t
    	where sampno='1108964') as traj
    where r.rid=27
    and ST_Intersects(traj.geom, r.no2)
    r est ma couche raster et traj ma couche vecteur.

    Cette requête fonctionne, mais elle met plusieurs minutes à rendre le résultat !
    Est-ce qu'il y a un moyen de l'écrire autrement pour optimiser le temps de réponse ? comme c'est pour afficher sur une interface cartographique web, il faudrait que le temps de réponse soit 'raisonnable'

    Merci,
    Nico

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Avez-vous tenté de mettre un index spatial ?

    Sinon il reste SQL Server bien plus rapide pour le traiteent des données spatial.
    Pour info benchmark SIG SQL Server vs PostgreSQL: http://g-ernaelsten.developpez.com/t...-performances/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Bonjour

    J'essaie, mais quand je lance cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX idx_output_1_t100_27572 ON output_1_t100_27572 USING GIST (no2)
    J'ai le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ERREUR:  le type de données raster n'a pas de classe d'opérateurs par défaut pour la
    méthode d'accès « gist »
    HINT:  Vous devez spécifier une classe d'opérateur pour l'index ou définir une
    classe d'opérateur par défaut pour le type de données.
    ********** Error **********
     
    ERREUR: le type de données raster n'a pas de classe d'opérateurs par défaut pour la
    méthode d'accès « gist »
    SQL state: 42704
    Hint: Vous devez spécifier une classe d'opérateur pour l'index ou définir une
    classe d'opérateur par défaut pour le type de données.
    Qu'est ce qu'il faut faire ??

    Merci,
    Nico

  4. #4
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Je ne connais pas bien le SIG, mais qu'est ce qui empêche de remplacer la sous requête par la table correspondante?
    Citation Envoyé par DiverSIG Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT sampno, 
    (ST_Intersection(r.no2, traj.geom)).geom road, 
    (ST_Intersection(r.no2, traj.geom)).val elevation,
    r.rid
    from output_1_t100_27572 as r,
    	(SELECT sampno,  ST_Transform(geom, 27572) as geom
    	from trajectories.corrected_gps_info_line_t
    	where sampno='1108964') as traj
    where r.rid=27
    and ST_Intersects(traj.geom, r.no2)
    Je propose donc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT sampno, 
    (ST_Intersection(r.no2, ST_Transform(geom, 27572))).geom road, 
    (ST_Intersection(r.no2, ST_Transform(geom, 27572))).val elevation,
    r.rid
    from output_1_t100_27572 as r,trajectories.corrected_gps_info_line_t as traj
    where sampno='1108964' and r.rid=27
    and ST_Intersects(traj.geom, r.no2)
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Cette requête ne renvoie aucun résultat.
    La requête avec la sous-requête renvoie le bon résultat (c'est (trop) long, mais ça marche)

    Donc je suis plutôt dans la piste ''créer un index spatial'', mais je me débat avec mon message d'erreur (voir plus haut dans le post)

    Merci,
    Nico

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Si j'essaie de lui spécifier un opérateur comme vu ici, j'ai le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ERREUR:  la classe d'opérateur « gist_geometry_ops_2d » n'accepte pas le type de données raster
    ********** Error **********
     
    ERREUR: la classe d'opérateur « gist_geometry_ops_2d » n'accepte pas le type de données raster
    SQL state: 42804
    Nico

  7. #7
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Citation Envoyé par DiverSIG Voir le message
    Cette requête ne renvoie aucun résultat...
    Cela m'étonne énormément car je croie que les deux requêtes sont équivalentes sémantiquement. Peux-tu poster la requête que tu exécute et qui ne donne rien?
    Pour l'index, une recherche sur google me donne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX nom_indexe ON nom_table USING GIST (ST_ConvexHull(colonne_raster))
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    J'ai exécuté texto la requête que tu as proposé : 0 réponse.
    Pour la création d'index, j'ai déjà testé cela, mais j'ai une erreur de classe d'opérateur pour la méthode gist (cf. plus haut dans le post).

    J'ai essayé de recharger ma couche avec les commandes raster2pgsql et psql, en spécifiant l'option -I dans le commande raster2pgsql (qui justement crée un index de type gist.
    Ca fonctionne, dans pgadmin, je vois qu'il a crée un index nommé <nom de la couche>_st_convexhull_idx, donc c'est surement le même résultat que le create index que tu proposes.

    Mais ça n'améliore pas le temps de réponse de la requête...

    Nico

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    d'après ce que j'ai vu dans cet exemple, c'est pas gagné mon affaire !! (voir le chapitre 'intersecting the caribou buffers with the elevation rasters').

    J'ai essayé de recharger ma couche en diminuant la taille des tuiles (20x20 au lieu de 100x100), j'ai maintenant une erreur de topologie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ERREUR:  GEOSIntersects: TopologyException: side location conflict at 255376.400374944 6252156.2600285504
    CONTEXT:  fonction PL/pgsql _st_intersects(geometry,raster,integer), ligne 22 à RETURN
    fonction PL/pgsql st_intersection(geometry,raster,integer), ligne 5 à affectation
    ********** Error **********
     
    ERREUR: GEOSIntersects: TopologyException: side location conflict at 255376.400374944 6252156.2600285504
    SQL state: XX000
    Context: fonction PL/pgsql _st_intersects(geometry,raster,integer), ligne 22 à RETURN
    fonction PL/pgsql st_intersection(geometry,raster,integer), ligne 5 à affectation
    Pourtant quand je fait une requete ST_IsValid sur ma sous-requête, il me dit geometrie OK.


    Nico

  10. #10
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Citation Envoyé par DiverSIG Voir le message
    J'ai exécuté texto la requête que tu as proposé : 0 réponse...
    Tu as raison.
    Ma requête doit être corriger au niveau du WHERE... traj.geom est à remplacer par ST_Transform(geom, 27572)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT sampno, 
    (ST_Intersection(r.no2, ST_Transform(geom, 27572))).geom road, 
    (ST_Intersection(r.no2, ST_Transform(geom, 27572))).val elevation,
    r.rid
    from output_1_t100_27572 as r,trajectories.corrected_gps_info_line_t as traj
    where sampno='1108964' and r.rid=27
    and ST_Intersects(ST_Transform(geom, 27572), r.no2)
    Pour l'exemple cité, j'ai pas lu en entier, mais remarque la vétusté de produit...(PostgreSQL 8.4 et PostGIS 1.5.1)
    Voici le lien que j'avais trouvé (copie/colle):http://mesange.educagri.fr/htdocs/si...x_spatial.html
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  11. #11
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 014
    Points : 23 702
    Points
    23 702
    Par défaut
    Bonjour,

    Une piste rapide (je n'ai pas mené de tests pour vérifier) : je pense que la non-utilisation des index, et donc la lenteur de la requête, vient en grande partie du fait que vous faite une intersection entre un raster et une couche vecteur reprojetée à la volée (utilisation de ST_Transform).
    Du coup, à cause de cette reprojection, l'index GiST sur la couche vecteur n'est pas utilisable... Il faudrait nous afficher un EXPLAIN de la requête pour s'en assurer.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    J'ai donc transformé mon tracé GPS dans la même projection que mon raster (EPSG:3857).

    La requête mouline toujours, si je l'arrête en cours d'exécution, j'ai le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ERREUR:  Error performing intersection: InterruptedException: Interrupted!
    CONTEXT:  fonction PL/pgsql st_intersection(geometry,raster,integer), ligne 10 à RETURN QUERY
    ********** Error **********
     
    ERREUR: Error performing intersection: InterruptedException: Interrupted!
    SQL state: XX000
    Context: fonction PL/pgsql st_intersection(geometry,raster,integer), ligne 10 à RETURN QUERY
    si je lance un EXPLAIN de cette requête, j'ai le résultat :
    Nom : query_explain.jpg
Affichages : 873
Taille : 71,0 Ko

    Il a l'air d'utiliser l'index sur le champ geom du raster...

    Nico

  13. #13
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 014
    Points : 23 702
    Points
    23 702
    Par défaut
    Deux remarques :
    1. il faut mettre un index spatial sur la nouvelle couche vecteur (là, on voit un scan séquentiel) ;
    2. il faut faire un ANALYZE corrected_gps_info_line_t_3857, parce que les statistiques de la table ne sont pas à jour.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. Intersection de vecteur et variables multiples
    Par diego45 dans le forum MATLAB
    Réponses: 2
    Dernier message: 24/11/2014, 18h33
  2. [PostGIS] Intersection polyligne / polygone excluant le contour du polygone
    Par Gronimo dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 04/06/2014, 11h53
  3. Réponses: 15
    Dernier message: 28/06/2012, 14h19
  4. [OGR / GDAL] Raster vers vecteur
    Par Waugriff dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 06/04/2010, 20h41
  5. intersection entre plusieurs vecteurs
    Par FstDsi dans le forum Débuter
    Réponses: 10
    Dernier message: 08/08/2009, 14h31

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