#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: 1160
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: 1554
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