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

Printemps des cartes 2024

#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: 1132

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: 1536

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à wink )

Nicolas

Hors ligne

 

#4 Thu 29 August 2019 11:13

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

Re: requete avec cercles de localisation en utilisation web

(ah je vois que tumasgiu a répondu déjà wink)


Oui, et comme d'habitude trop vite smile,
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: 1536

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: 1536

Re: requete avec cercles de localisation en utilisation web

franck06 a écrit:

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: 1536

Re: requete avec cercles de localisation en utilisation web

franck06 a écrit:

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

 

Pied de page des forums

Powered by FluxBB