[TALEND] Intégration de données API Overpass

Bonjour,

Je reprends ici quelques échanges que j’ai eu sur la liste de diffusion.

Je souhaite utiliser l’ETL Talend (et son extension spatiale https://github.com/talend-spatial) pour récupérer des contours de communes ou d’arrondissement.

Dans overpass-turbo cela donne par exemple http://overpass-turbo.eu/s/2Ep pour les arrondissements parisiens.

Dans Talend spatial, 2 composants peuvent être utilisés pour osm, l’un pour les Nodes et l’autre pour les Ways.

L’exemple fourni fonctionne très bien et permet d’importer des données OSM (“http://api.openstreetmap.org/api/0.6/map?bbox=5.9733,45.5086,6.0128,45.5603”) en d’en générer un shapefile.

Sauf que ce qui m’intéresse pour le coup c’est de pouvoir filtrer les éléments en amont, ce que je peux faire très facilement avec overpass.

Le problème c’est que le XML généré par la requête API ci-dessus ne renvoit pas les mêmes éléments qu’une requête overpass :

Avec l’API : http://api.openstreetmap.org/api/0.6/map?bbox=5.9733,45.5086,6.0128,45.5603

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="CGImap 0.3.3 (23626 thorn-01.openstreetmap.org)" copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright" license="http://opendatacommons.org/licenses/odbl/1-0/">
 <bounds minlat="45.5086000" minlon="5.9733000" maxlat="45.5603000" maxlon="6.0128000"/>
 <node id="12610244" visible="true" version="5" changeset="766446" timestamp="2009-03-09T09:36:26Z" user="Eric S" uid="45284" lat="45.5319369" lon="5.9714798"/>
 <node id="12610253" visible="true" version="3" changeset="766446" timestamp="2009-03-09T09:36:07Z" user="Eric S" uid="45284" lat="45.5239575" lon="5.9766952"/>
 <node id="13552258" visible="true" version="3" changeset="766446" timestamp="2009-03-09T09:35:28Z" user="Eric S" uid="45284" lat="45.5086483" lon="6.0104599"/>
 <node id="13552261" visible="true" version="4" changeset="1048685" timestamp="2009-05-02T14:30:17Z" user="Marc Mongenet" uid="74847" lat="45.5116580" lon="6.0050951"/>
 <node id="13552264" visible="true" version="4" changeset="1048685" timestamp="2009-05-02T14:30:18Z" user="Marc Mongenet" uid="74847" lat="45.5120481" lon="6.0046624"/>
 <node id="13552259" visible="true" version="4" changeset="1048685" timestamp="2009-05-02T14:30:18Z" user="Marc Mongenet" uid="74847" lat="45.5098946" lon="6.0084595"/>
 <node id="13552256" visible="true" version="6" changeset="1048685" timestamp="2009-05-02T14:30:18Z" user="Marc Mongenet" uid="74847" lat="45.5071192" lon="6.0125287"/>
 <node id="60314513" visible="true" version="1" changeset="13231" timestamp="2007-10-01T14:13:33Z" user="sxpert" uid="143" lat="45.5092687" lon="6.0058970">
  <tag k="created_by" v="JOSM"/>
 </node>
...

Avec Overpass :

wget -O target.osm --post-file=request.osm "http://overpass-api.de/api/interpreter"

Le Fichier request.osm :

<osm-script output="xml" timeout="25">
  <!-- gather results -->
  <union>
    <query type="relation">
      <has-kv k="boundary" v="administrative"/>
      <has-kv k="admin_level" v="9"/>
      <bbox-query s="48.79759200667088" w="2.1701431274414062" n="48.92272485351708" e="2.439651489257812"/>
    </query>
  </union>
  <!-- print results -->
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton" order="quadtile"/>
</osm-script>

Le résultat :

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
  <relation id="9517">
    <member type="way" ref="184994832" role="outer"/>
    <member type="way" ref="32809940" role="outer"/>
    <member type="way" ref="164286227" role="outer"/>
    <member type="way" ref="23636204" role="outer"/>
    <member type="way" ref="164245443" role="outer"/>
    <member type="way" ref="23636206" role="outer"/>
    <member type="way" ref="164286226" role="outer"/>
    <member type="way" ref="164338492" role="outer"/>
    <member type="way" ref="22966698" role="outer"/>
    <member type="way" ref="30660060" role="outer"/>
    <member type="way" ref="165166078" role="outer"/>
    <member type="way" ref="165166079" role="outer"/>
    <member type="way" ref="30660063" role="outer"/>
    <member type="way" ref="30677984" role="outer"/>
    <member type="way" ref="164248374" role="outer"/>
    <member type="way" ref="30677982" role="outer"/>
    <member type="way" ref="31564797" role="outer"/>
    <member type="way" ref="164247236" role="outer"/>
    <member type="node" ref="517969463" role="admin_centre"/>
    <tag k="addr:postcode" v="75016;75116"/>
    <tag k="admin_level" v="9"/>
    <tag k="alt_name" v="XVIe Arrondissement"/>
    <tag k="boundary" v="administrative"/>
    <tag k="landuse" v="residential"/>
    <tag k="loc_name" v="Passy"/>
    <tag k="name" v="16e Arrondissement"/>
    <tag k="name:en" v="16th Arrondissement"/>
    <tag k="name:ru" v="XVI округ"/>
...
    <tag k="short_name" v="5e"/>
    <tag k="type" v="boundary"/>
    <tag k="wikipedia" v="fr:5e arrondissement de Paris"/>
  </relation>
  <node id="248172355" lat="48.8271379" lon="2.2922207"/>
  <node id="248172353" lat="48.8259109" lon="2.2976469"/>
  <node id="248172354" lat="48.8266901" lon="2.2942296"/>
  <node id="245797559" lat="48.8270986" lon="2.3035623"/>
  <node id="245798141" lat="48.8251754" lon="2.3013340"/>
  <node id="248172297" lat="48.8251252" lon="2.3013179"/>
...

Les erreurs que j’ai dans talend viennent d’attributs xml qui ne sont pas trouvé comme :

Missing attribute 'version' on OSM primitive with id 9517 (at line 3, column 23)

L’idée est donc dans un premier temps de voir si l’on peut arriver au même résultat avec overpass qu’avec l’API…

Merci de vos éclairages :wink:

Bonjour,
Il faut remplacer la valeur de “print mode” skeleton par meta pour avoir les infos de version des objets. Tu devrais alors avoir des résultats convergeants entre tes 2 fournitures.

vincent

Merci pour la réponse je regarde ça :wink:

Bonjour,

Le flux de sortie correspond davantage mais je me fais encore jeter pour des attributs manquants… j’ai posé un ticket sur le projet : https://github.com/talend-spatial/talend-spatial/issues/56 et je vous tient au courant…

@++

Le souci est dans la ligne 16 de ta requête, où il reste un ‘print mode=body’. En le remplaçant par ‘print mode=meta’ tu as bien toutes les metadonnées de la relation, dont sa version.

vincent

Le dernier test que j’ai fait c’était avec le mode meta comme tu l’as indiqué.
Le xml renvoyé n’est effectivement pas le même mais j’ai toujours des erreurs sur des balises que je supprime manuellement (meta et note) et d’autres comme

Missing attribute 'version' on OSM primitive with id 9517 (at line 4, column 23)

…sur la balise relation…

Pour info, request.osm :

<osm-script output="xml" timeout="25">
  <!-- gather results -->
  <union>
    <query type="relation">
      <has-kv k="boundary" v="administrative"/>
      <has-kv k="admin_level" v="9"/>
      <bbox-query s="48.79759200667088" w="2.1701431274414062" n="48.92272485351708" e="2.439651489257812"/>
    </query>
  </union>
  <!-- print results -->
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="meta" order="quadtile"/>
</osm-script>

La réponse :

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">

  <relation id="9517">
    <member type="way" ref="184994832" role="outer"/>
...

<node id="1911683222" lat="48.8534778" lon="2.2241606" version="1" timestamp="2012-09-12T15:39:12Z" changeset="13084470" uid="300459" user="didier2020"/>
  <node id="249747200" lat="48.8384274" lon="2.2520553" version="24" timestamp="2010-11-18T13:19:16Z" changeset="6399911" uid="49047" user="vincent_95"/>
  <node id="791865548" lat="48.8373102" lon="2.2530140" version="3" timestamp="2011-03-08T12:57:57Z" changeset="7493648" uid="49047" user="vincent_95">
    <tag k="highway" v="crossing"/>
    <tag k="source" v="survey"/>
  </node>
  <node id="791974790" lat="48.8382361" lon="2.2522187" version="1" timestamp="2010-06-26T22:14:59Z" changeset="5085033" uid="49047" user="vincent_95"/>
  <node id="791975468" lat="48.8383916" lon="2.2520859" version="1" timestamp="2010-06-26T22:15:08Z" changeset="5085033" uid="49047" user="vincent_95"/>
  <node id="875698674" lat="48.8359204" lon="2.2541952" version="2" timestamp="2012-08-30T10:08:04Z" changeset="12915739" uid="225036" user="crismapper"/>
  <node id="976978214" lat="48.8369684" lon="2.2533009" version="2" timestamp="2011-08-31T12:29:57Z" changeset="9175885" uid="29717" user="eumiro">

...

  <way id="30158961" version="18" timestamp="2014-01-17T13:18:43Z" changeset="20050162" uid="145231" user="woodpeck_repair">
    <nd ref="332341375"/>
    <nd ref="249690962"/>
    <nd ref="249690961"/>
    <nd ref="318378363"/>
    <nd ref="1430743220"/>
    <tag k="admin_level" v="6"/>
    <tag k="border_type" v="departement"/>
    <tag k="boundary" v="administrative"/>
    <tag k="source" v="cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2011"/>
  </way>

</osm>

La requête que tu montres a bien toujours une ligne print mode=“body” et en effet ce mode ne renvoit pas la version des objets. C’est 3 lignes avant la fin de ta requête, là où j’ai ajouté des ‘*******’. En changeant “body” en “meta” tu as a priori ce que Talend attend.

Yes, c’est mieux… je n’ai plus que les 2 balises notes et meta qu’il faut supprimer mais ça passe.

Merci beaucoup :wink: