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 Tue 13 June 2023 14:39

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 201

API Cadastre IGN à partir geojson

Bonjour à toutes et tous,

Je suis en train de me casser les dents avec l'API Carto - Module Cadastre de l'IGN : https://api.gouv.fr/documentation/api_carto_cadastre

Je pense que ma requête est faisable, mais n'étant pas développeur, je ne suis pas dans mon éléments lorsqu'il faut interroger une API avec peu de doc ou d'exemple.

J'ai une couche (geosjon en wgs84) avec quelques centaines de polygones dans toute la France, je souhaiterais obtenir les parcelles qui sont concernées par ces polygones.

Mais je n'arrive pas à demander à l'API (via curl) de lire le fichier geojson comme paramètre "geom" et de me retourner un geosjon avec les parcelles concernées.

Je suis preneur d'une aide pour ceux qui ont l'habitude de l'API Carto.

Merci à vous !

J.

PS : J'ai fais le même type de requête avec l'API de la BAN et du csv sans trop de difficulté, mais la c'est la débandade !

Hors ligne

 

#2 Fri 16 June 2023 19:23

ThomasG
Membre
Lieu: Nantes
Date d'inscription: 9 Sep 2005
Messages: 943
Site web

Re: API Cadastre IGN à partir geojson

Bonjour,


Il faut prendre un GeoJSON en entrée du type Feature comme ci-dessous

Code:

{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"coordinates":[[[-1.5567700133586584,47.21868047390478],[-1.5567362349704865,47.21787748555562],[-1.5560156293505258,47.21776277194195],[-1.5554413967479377,47.21783924771219],[-1.5554301372852422,47.21858870442267],[-1.5558917752596528,47.218802832966105],[-1.5560494077386977,47.21878753809898],[-1.556398451085954,47.21872635858563],[-1.5567700133586584,47.21868047390478]]],"type":"Polygon"}}]}

Ensuite, il faut prendre le bloc après "geometry":

Ce qui est compliqué, c'est l'encodage de l'URL. Attention, ma solution est sous Bash et dépend d'un outil tiers nommé jq. Je vous recommande de passer par la solution Python alternative proposée après.

Code:

demo='{ "coordinates": [ [ [ -1.5567700133586584, 47.21868047390478 ], [ -1.5567362349704865, 47.21787748555562 ], [ -1.5560156293505258, 47.21776277194195 ], [ -1.5554413967479377, 47.21783924771219 ], [ -1.5554301372852422, 47.21858870442267 ], [ -1.5558917752596528, 47.218802832966105 ], [ -1.5560494077386977, 47.21878753809898 ], [ -1.556398451085954, 47.21872635858563 ], [ -1.5567700133586584, 47.21868047390478 ] ] ], "type": "Polygon" }'
encoded=$(printf %s $demo|jq -sRr @uri)
curl -X 'GET' \
  "https://apicarto.ign.fr/api/cadastre/parcelle?geom=${encoded}" \
  -H 'accept: application/json'

Solution en Python pour la portabilité

Code:

import json
import urllib.parse
import urllib.request

url = "https://apicarto.ign.fr/api/cadastre/parcelle"

feature_geojson = {"type":"Feature","properties":{},"geometry":{"coordinates":[[[-1.5567700133586584,47.21868047390478],[-1.5567362349704865,47.21787748555562],[-1.5560156293505258,47.21776277194195],[-1.5554413967479377,47.21783924771219],[-1.5554301372852422,47.21858870442267],[-1.5558917752596528,47.218802832966105],[-1.5560494077386977,47.21878753809898],[-1.556398451085954,47.21872635858563],[-1.5567700133586584,47.21868047390478]]],"type":"Polygon"}}
parameters = 'geom=' + urllib.parse.quote(json.dumps(feature_geojson.get('geometry')))

url_with_parameters = "%s?%s" % (url, parameters)
req = urllib.request.Request(url_with_parameters)
req.add_header('accept', 'application/json')
r = urllib.request.urlopen(req)
data = json.load(r)

with open('out.geojson', 'w') as outfile:
    json.dump(data, outfile)

Pour le besoin, si on veut un GeoJSON avec plusieurs zones pour sélectionner les parcelles chaque fois, il faut ensuite adapter. La solution dans la vraie vie, c'est vous avez votre GeoJSON en entrée. Vous bouclez sur chaque "Feature" pour récupérez leur géométrie, vous appelez l'API, vous stockez soit un fichier pour chaque zone qui sélectionne vos parcelles, soit vous stockez dans un seul fichier les parcelles de toutes les zones mais cela demande de pouvoir retracer quelle zone a sélectionnée quelle(s) parcelle(s).

Attention:

Il faut noter qu'il faut éviter d'utiliser des géométries complexes pour au moins ne pas rencontrer la limite d'un appel http GET https://stackoverflow.com/a/50510203. Si votre géométrie est trop complexe avec trop de points, vous risquez de voir votre géométrie coupée et le serveur ne rien retourné car il recevra un contenu coupé.

Il faut aussi éviter de prendre une zone trop large: si vous demandez toutes les parcelles d'un grande zone, c'est potentiellement des millions de points qui seront retournés et vous surchargerez le serveur (qui pourrait planter) et vous devrez gérer de la pagination pour obtenir toutes les parcelles.

Cordialement,

Thomas

Hors ligne

 

Pied de page des forums

Powered by FluxBB