#1 Thu 29 August 2019 10:34
- franck06
- Juste Inscrit !
- Date d'inscription: 9 Mar 2007
- Messages: 9
requete avec cercles de localisation en utilisation web
Bonjour à tous je souhaite créer une requête postgis sur nos données adresses pour utilisation QGIS en mode web.
Chaque numéro de rue est relié à un tronçon de voie par un identifiant commun.
Le but est que lorsque une adresse est recherchée, lors du centrage (car dans un environnement tablette) l’adresse trouvée soit entourée de deux disques concentriques de couleurs différentes matérialisant 50 mètres et 100 mètres.
Nom de la table : point_routier, le champ de l adresse (du numéro) NOM, le champ pour faire correspondance avec la voie : IDENTIFIANT
merci de votre aide
Hors ligne
#2 Thu 29 August 2019 10:52
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: requete avec cercles de localisation en utilisation web
Salut,
si votre version de postgis le permet vous pouvez
utiliser la fonction ST_MinimumBoundingCircle, au nom
assez explicite.
Ensuite avec la fonction st_Buffer, vous pourrez faire "gonfler"
vos cercles.
Hors ligne
#3 Thu 29 August 2019 11:03
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: requete avec cercles de localisation en utilisation web
Bonjour,
Si les adresses ne disposent pas d'une géométrie ponctuelle exacte, il va falloir que vous géocodiez ces adresses pour avoir ces points, sinon vous ne pourrez pas créer des cercles centrés sur les adresses
(pour créer ces cercles: st_buffer(geom_adresse, 50) et st_buffer(geom_adresse, 100))
Vous pouvez géocoder des adresses avec le géocodeur data.gouv.fr en ligne (https://adresse.data.gouv.fr/csv). Ca peut se faire depuis PG avec une fonction python ou un FDW qui se connecte au géocodeur et envoie les adresses de votre table.
(ah je vois que tumasgiu a répondu déjà )
Nicolas
Hors ligne
#4 Thu 29 August 2019 11:13
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: requete avec cercles de localisation en utilisation web
(ah je vois que tumasgiu a répondu déjà )
Oui, et comme d'habitude trop vite ,
j'avais compris que c'était le tronçon qui devait être entouré...
Dernière modification par tumasgiu (Thu 29 August 2019 11:13)
Hors ligne
#5 Thu 29 August 2019 11:19
- franck06
- Juste Inscrit !
- Date d'inscription: 9 Mar 2007
- Messages: 9
Re: requete avec cercles de localisation en utilisation web
Merci à vous, je débute avec postgis (avant sur oracle) et qgis donc je repars de la base.
version postgresql9.5.12.2.
Oui nous nous repérons à l'adresse exacte c.a.d au numéri de rue qui possèdent un x,y.
merci à vous
Hors ligne
#6 Thu 29 August 2019 11:26
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: requete avec cercles de localisation en utilisation web
Si ce sont bien les adresses qui doivent etre entourées, voici une fonction plpython, appelable en SQL, qui geocode une serie d'adresses et renvoie un ensemble de docs JSON avec champs remplis par le geocodeur (meme structure que le doc renvoyé par le geocodeur):
• La fonction prend une requete SQL qui doit renvoyer les champs ids, voie, ville, cp: ids est un tableau des id à géocoder, histoire de pouvoir faire un update sur la table (tableau car dans mon cas, j'avais une table avec plusieurs adresses identiques et je en voulais pas appeler le geocodeur plusieurs fois pour la meme adresse)
• Elle construit le csv en mémoire et l'envoie au géocodeur, puis retourne un objet jsonb par adresse géocodée, cet objet contient les lat/long de l'adresse:
Code:
drop function geocode_add(query text); create or replace function geocode_add(query text) RETURNS setof jsonb as $$ import csv import io from collections import OrderedDict import requests import json with io.BytesIO(b"") as stream: writer = csv.writer(stream, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) writer.writerow(["ids", "voie", "ville", "cp"]) for row in plpy.cursor(query): # writes row in csv to csv stream writer.writerow([row['ids'], row['voie'], row['ville'], row['cp']]) requests_session = requests.Session() kwargs = { 'data': OrderedDict([ ('columns', ['voie', 'ville', 'cp']), ('postcode', 'cp') ]), 'method': 'post', 'files': OrderedDict([ ('data', ('addpg.csv',stream.getvalue())) ]), 'stream': True, 'url': 'https://api-adresse.data.gouv.fr/search/csv/' } response = requests_session.request(**kwargs) for row in csv.DictReader(response.text.encode('utf-8').splitlines()): yield json.dumps(row) $$ language plpythonu VOLATILE;
La fonction s'utilise comme ceci pour extraire les infos des documents retournés:
Code:
select t->>'ids' as ids, t->>'result_label' as adr, st_astext(st_transform( st_setSRID( st_makePoint((t->>'longitude')::float, (t->>'latitude')::float), 4326), 2154)) as geom from geocode_add($$select '{1}'::text[] as ids, '2, place du capitole' as voie, 'TOulouse' as ville, '31000' as cp$$) as t; ids adr geom ['1'] Place du Capitole 31000 Toulouse POINT(574291.035317137 6279607.04961392)
Nico
Hors ligne
#7 Thu 29 August 2019 11:33
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: requete avec cercles de localisation en utilisation web
Merci à vous, je débute avec postgis (avant sur oracle) et qgis donc je repars de la base.
version postgresql9.5.12.2.
Oui nous nous repérons à l'adresse exacte c.a.d au numéri de rue qui possèdent un x,y.
merci à vous
Ah ! Alors le lien vers le troncon ne sert pas vraiment dans ce cas, si ?
Code:
select id_adresse, st_buffer(geom, 50) as cercle1, st_buffer(geom, 100) as cercle2
Ou si vous voulez une seule geom avec deux cercles:
Code:
select id_adresse, st_collect(st_buffer(geom, 50) , st_buffer(geom, 100)) as cercles
Nico
Hors ligne
#8 Thu 29 August 2019 11:51
- franck06
- Juste Inscrit !
- Date d'inscription: 9 Mar 2007
- Messages: 9
Re: requete avec cercles de localisation en utilisation web
Lorsque j'interroge un point adresse voici ce qui est renseigné dans le champ géométrie
SQL> select geometrie from num_voirie where cle_oracle='4680877';
GEOMETRIE(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 2154, SDO_POINT_TYPE(1024570,4, 6282014,4, NULL), NULL, NULL)
SQL
Faut il géocoder? il ne me semble pas
Merci
Hors ligne
#9 Thu 29 August 2019 12:05
- franck06
- Juste Inscrit !
- Date d'inscription: 9 Mar 2007
- Messages: 9
Re: requete avec cercles de localisation en utilisation web
le tronçon est aussi un champ de la table num_voirie (le numéro adresse) pour faire le lien entre le numéro de la rue et son nom
Hors ligne
#10 Thu 29 August 2019 12:08
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: requete avec cercles de localisation en utilisation web
Lorsque j'interroge un point adresse voici ce qui est renseigné dans le champ géométrie
SQL> select geometrie from num_voirie where cle_oracle='4680877';
GEOMETRIE(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 2154, SDO_POINT_TYPE(1024570,4, 6282014,4, NULL), NULL, NULL)
SQL
Faut il géocoder? il ne me semble pas
Merci
Non c'est bon, la table num_voirie contient bien une geom Oracle point.
Si vous voulez limiter les transferts de données, la conversion d'une bd à l'autre, etc., il existe un Foreign Data Wrapper Oracle (https://github.com/laurenz/oracle_fdw).
Il vous permettra de définir dans PG une table virtuelle pointant sur la table Oracle, vous pourrez alors faire des requetes sur cette table depuis Postgis.
Par exemple, pour créer dans Postgis une table des cercles des adresses:
Code:
create table voirie_cercle as select st_buffer(geometrie, 50) from num_voirie_fdw where cle_oracle='4680877';
ici, num_voirie_fdw est la FOREIGN TABLE pointant sur la table Oracle, qu'il faudra créer avant (cf doc FDW)
Nicolas
Hors ligne
#11 Thu 29 August 2019 13:49
- franck06
- Juste Inscrit !
- Date d'inscription: 9 Mar 2007
- Messages: 9
Re: requete avec cercles de localisation en utilisation web
Merci beaucoup à vous, nous allons mettre entre oracle et post gis des scripts FME pour une actualisation quotidienne des différentes tables exploitées
Hors ligne