Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoRezo vous rend service, faites un don.

Merci à tous pour votre fidélité.

L'équipe GeoRezo

#1 mar. 27 mai 2014 14:28

Lsam
Membre
Date d'inscription: 27 nov. 2013
Messages: 100

[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 (mar. 27 mai 2014 17:12)

Hors ligne

 

#2 mer. 26 avril 2017 15:29

lejedi76
Membre
Date d'inscription: 8 août 2013
Messages: 239

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 (mer. 26 avril 2017 15:34)

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |