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 !.
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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Thu 21 September 2017 09:20

vincent52
Participant occasionnel
Date d'inscription: 21 Sep 2016
Messages: 15

Requête Spatialite et Postgis

Bonjour à tous,

Ayant jusqu'à maintenant travaillé uniquement avec Spatialite pour effectuer des requêtes spatiales, je souhaite me mettre à Postgis pour pouvoir coupler SQL et R.
Bref, j'ai deux couches de points a et b, et je souhaite trouver le point b le plus proche de chaque point a.

Je veux un output du style :id_a, id_b, distance_mini.
Sur spatialite, je fais ce code :

Code:

select pa.id as id_a, pb.id as pb_id, min(st_distance(pa.geom,pb.geom)) as dist
from point_a as pa, point_b as pb
group by id_a​

et ça fonctionne bien.

Mais lorsque je fais cette requête sur Postgis : "ERREUR:  la colonne « b.id » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat"... 

Quelqu'un a une idée ?

Merci d'avance et bonne journée

Hors ligne

 

#2 Thu 21 September 2017 11:42

vincent52
Participant occasionnel
Date d'inscription: 21 Sep 2016
Messages: 15

Re: Requête Spatialite et Postgis

Finalement j'ai trouvé la solution :

Code:

select distinct on (pa.id) pa.id as id_a, pb.id as id_b, st_distance(pa.geom,pb.geom) as dist
from point_a as pa, point_b as pb
where st_dwithin(pa.geom,pb.geom,8000)
order by pa.id,dist

Ici on calcule toutes les distances puis on les classe dans l'ordre croissant puis on selectionne la première lignes de chaque ID (avec distinct on). J'ai rajouté la clause where st_dwithin qui permet de diminuer le temps de calcul en donnant une distance limite, et ainsi éviter de calculer les distances pour la totalité des points B.

Hors ligne

 

#3 Thu 21 September 2017 11:44

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1129

Re: Requête Spatialite et Postgis

Salut,

bête et méchant :

Code:

SELECT
id_a, (array_agg(id_b ORDER by d))[1] id_b , MIN(d) d
FROM (
    SELECT pa.id id_a, pb.id id_b, st_distance(pa.geom, pb.geom) d
    FROM point_a pa, point_b pb
    ) foo
GROUP BY id_a

EDIT: je n'avais pas vu que vous vous étiez répondu.

Dernière modification par tumasgiu (Thu 21 September 2017 11:54)

Hors ligne

 

#4 Thu 21 September 2017 13:11

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: Requête Spatialite et Postgis

Bonjour

Postgis dispose d'un opérateur plus proche voision (KNN), tres performant:

http://postgis.net/docs/geometry_distance_knn.html

Nicolas

Hors ligne

 

#5 Thu 21 September 2017 13:38

vincent52
Participant occasionnel
Date d'inscription: 21 Sep 2016
Messages: 15

Re: Requête Spatialite et Postgis

Merci pour vos réponses

Hors ligne

 

Pied de page des forums

Powered by FluxBB