banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 27 May 2014 14:28

Lsam
Participant assidu
Date d'inscription: 27 Nov 2013
Messages: 157

[Spatialite] problème de performance d'une requête spatiale

Bonjour,

Je souhaite exécuter la requête spatiale suivante dans ma base Spatialite :

Code:

select "c1"."geometry" from "c1", "c2" where within("c1"."geometry",buffer("c2"."geometry",1000))

Au bout de 36 minutes, toujours pas résultat ! Je ne m'explique pas ce manque de performance.

c1 est une table avec une géométrie de type Point, comprenant 247434 enregistrements
c2 est une table avec une géométrie de type Multipolygon, comprenant 6 enregistrements

Les 2 tables ont un index spatial.

J'ai l'impression que mon passage à la version 4 de Spatialite est à l'origine du problème. Me trompe-je ou quelqu'un aurait une autre idée sur le problème ? Je ne pense pas que ma requête soit si complexe que ça pourtant ?!

Merci

Dernière modification par Lsam (Tue 27 May 2014 17:12)

Hors ligne

 

#2 Wed 26 April 2017 15:29

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: [Spatialite] problème de performance d'une requête spatiale

Bonjour,

j'arrive un peu tard mais comme ce sujet est sans réponse, je me permets de proposer une réponse.

Plutôt que d'utiliser le buffer, vous pouvez essayer ceci, si vous possédez la fonction PtDistWithin qui dépend de PROJ4:

Code:

select "c1"."geometry" from "c1", "c2" where PtDistWithin("c1"."geometry","c2"."geometry",1000)

Mais surtout pour profitez des index, il peut être intéressant de rajouter une clause.

Sous postgis il s'agit de :

Code:

AND c1.geometry && c2.geometry

Sous spatialite, c'est un peu plus compliqué :

Code:

AND c1.ROWID IN (
    SELECT ROWID
    FROM SpatialIndex
    WHERE f_table_name = 'c1' AND search_frame = c2.geometry
)

qu'on traduit par: parmi les géométries dont l'id est dans la fenêtre de recherche de la géométrie 2.

Donc d'abord, je créerai une table c3 qui est une copie de c2 dont la géométrie est le buffer.
ta requête complète sans la fonction PtDistWithin :

Code:

SELECT"c1"."geometry" from "c1", "c3" 
WHERE 
c1.ROWID IN (
    SELECT ROWID
    FROM SpatialIndex
    WHERE f_table_name = 'c1' AND search_frame = c3.geometry
)
AND within("c1"."geometry","c3"."geometry",1000))

Cordialement,

Dernière modification par lejedi76 (Wed 26 April 2017 15:34)

Hors ligne

 

Pied de page des forums

Powered by FluxBB