Message posté par : Nicolas Ribot
----------------------------------------
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
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=324647#p324647
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net