Open sylvain-m opened 1 year ago
@nleguillarme et @DonovanMaillard, je vois ici que vous vous ĂȘtes dĂ©jĂ penchĂ©s sur la question :
Nous avons dĂ©veloppĂ© de notre cĂŽtĂ© des pipelines d'acquisition de donnĂ©es depuis iNaturalist et Pl@ntNet [...] Ces pipelines sont destinĂ©s Ă ĂȘtre diffusĂ©s plus largement. Je sais que @DonovanMaillard notamment est potentiellement intĂ©ressĂ©.
Salut Sylvain,
C'est touours prévu de mon coté, tant pour le GBIF que pour iNaturalist. Mais question de temps, je n'ai toujours pas pu m'y atteler. Mes espoirs pour fin 2023 s'amenuisent peu à peu ;)
Salut Sylvain,
Oui c'est toujours une idée qui est dans les tuyaux. J'ai commencé à développer un module GeoNature permettant de "parser" des API externes. Il est fonctionnel pour se connecter à d'autres GeoNature et également des flux XML. On a pour ambition de développer un nouveau "parser" pour se connecter à l'API du GBIF. Le code est ici : https://github.com/PnX-SI/api2GN . C'est écrit en Python. N'hésite pas à y contribuer si ça t'inspire.
Ă bientĂŽt
Pour moi iNaturalist est un outil et une communauté de contribution au GBIF (parmi plein d'autres dont l'INPN). Donc il s'agirait bien de pouvoir récupérer les données du GBIF dans GeoNature et non pas de iNaturalist (car elles sont intégrées dans le GBIF), il me semble.
Attention aussi au fait que les données de l'INPN sont versées réguliÚrement dans le GBIF donc on pourrait récupérer des données qu'on a déjà . Mais ça c'est classique quand on récupÚre des données dans une BDD agglomératrice.
De la mĂȘme maniĂšre, il est souhaitĂ© pouvoir importer des donnĂ©es depuis l'INPN en interrogeant l'API d'OpenObs.
Donc il s'agirait bien de pouvoir récupérer les données du GBIF dans GeoNature et non pas de iNaturalist
On est d'accord ! (et c'est pour ça que je l'ai mis en premier dans le titre)
donc on pourrait rĂ©cupĂ©rer des donnĂ©es qu'on a dĂ©jĂ
Oui, c'est un point d'attention à avoir, et je sais que le GBIF a développé des outils avancés de détection de doublons. Et sinon, ce sujet serait grandement simplifié avec l'implémentation de la notion d'identifiant unique observateur (ORCID) évoqué dans cette issue : https://github.com/PnX-SI/GeoNature/issues/1393
De la mĂȘme maniĂšre, il est souhaitĂ© pouvoir importer des donnĂ©es depuis l'INPN en interrogeant l'API d'OpenObs.
đđđ
J'ai commencé à développer un module GeoNature permettant de "parser" des API externes. [...] Le code est ici : https://github.com/PnX-SI/api2GN .
Super !!! Merci @TheoLechemia đđđ Je vais regarder ça (mais je ne suis toujours pas dĂ©veloppeur, donc pas sĂ»r de pouvoir aider)
Content de voir que le sujet ne dĂ©clenche pas de polĂ©mique đ
Vive l'OpenData et les communs numĂ©riques đ
De la mĂȘme maniĂšre, il est souhaitĂ© pouvoir importer des donnĂ©es depuis l'INPN en interrogeant l'API d'OpenObs.
Je me suis penché sur la question, et pour le moment je ne trouve aucune API qui retourne les obs complÚtes dans la doc des API d'OpenObs...
Oui l'API INPN d'OpenObs n'est pas documentĂ©e actuellement et donc pas forcĂ©ment prĂ©vue pour le moment pour ĂȘtre interroger directement pas des outils tiers ?
Mais Amandine avait aussi commencé des tests et noté cela mais avec des mailles 10km - https://github.com/PnX-SI/Ressources-techniques/tree/master/SINP/open_obs
Mais Amandine avait aussi commencé des tests et noté cela mais avec des mailles 10km
Pas vraiment "open", "OpenObs" ? đ
Dans tous les cas, il est préférable de pointer directement sur le GBIF, les données "Open" y seront dispo "brutes". J'ai testé, avec les miennes, c'est bon elles remontent bien. Exemple : https://www.inaturalist.org/observations/129881560 => https://www.gbif.org/occurrence/4145546442
Autant pointer sur le plus haut niveau, puis effectivement appliquer un filtre pour supprimer les données qui proviendraient de cette instance GeoNature, ou qui y auraient déjà été intégrées.
Vous aviez pas déjà fait ca pour la Jamaïque ?
Sinon oui, trÚs preneur pour les territoire qui font un ABC, ils veulent des données.
Pas vraiment "open", "OpenObs" ? đ
Si car c'est de l'opendata et on peut tĂ©lĂ©charger les donnĂ©es prĂ©cises (non sensibles) comme prĂ©vu dans le SINP, donc c'est un super outil et une super avancĂ©e. C'est juste que l'API n'est pas encore documentĂ©e Ă ma connaissance, et peut-ĂȘtre pas encore prĂ©vue pour ĂȘtre utilisĂ©e directement, mais c'est en cours. Tout ça prend du temps, de l'argent et des gens.
Oui les donnĂ©es de iNaturalist remontent directement et bien dans le GBIF, mais ce qui est saisi dans un GeoNature ou les outils français, ou est intĂ©grĂ© dans l'INPN ne remonte pas aussi simplement et rapidement dans le GBIF. Et il faut voir si la prĂ©cision des donnĂ©es et leur qualitĂ© dans l'INPN est la mĂȘme quand ça remonte dans l'INPN, etc... Donc pas mal de choses Ă voir, vĂ©rifier et analyser car la chaine de travail et les remontĂ©es de donnĂ©es ont de nombreux intermĂ©diaires qui ne sont pas encore si simples ni automatisĂ©s.
Ensuite sur le fait d'intégrer les données de l'INPN ou du GBIF dans un GeoNature d'un parc, je ne pense pas qu'il y ait de rÚgle ou de réponse unique. Notre objectif est de le prévoir techniquement, ensuite libre à chacun de le faire ou non.
Pour ma part, je ne suis pas convaincu qu'un GeoNature territorial d'un parc national ou régional nécessite de réintégrer toutes les données existantes sur son territoire, tant qu'elles sont disponibles quelque part d'accessible et ouvert. De notre cÎté, je pense qu'un GeoNature d'un territoire est avant tout une instance de production de données pour les utiliser et les diffuser localement, puis régionalement, puis nationalement, puis internationalement.
Mais à terme, quand les flux, les API et les outils d'import automatiques seront disponibles, libre à chacun d'enrichir son GeoNature avec des données nationales ou internationales.
Vous aviez pas déjà fait ça pour la Jamaïque ?
On avait fait un projet expĂ©rimental pour tester de rĂ©cupĂ©rer toutes les donnĂ©es GBIF d'un pays (JamaĂŻque pour l'exemple) et d'une ville (Copenhague en complĂ©ment) et de monter un GeoNature-atlas sur ces donnĂ©es. Et oui, ça avait fonctionnĂ©, mĂȘme si c'Ă©tait un export et import manuel Ă un instant T, pour le test. Et on avait documentĂ© ça ici - https://si.ecrins-parcnational.com/blog/2019-05-geonature-atlas-gbif-jamaica.html Ce projet expĂ©rimental avait gagnĂ© un prix du GBIF - https://www.ecrins-parcnational.fr/breve/geonature-podium
Les atlas GeoNature basés sur les données GBIF de Jamaïque et de Copenhague sont malheureusement éteints actuellement, car on avait besoin de ressources serveurs pour d'autres projet. :-)
Tout ça prend du temps, de l'argent et des gens.
Oui oui, c'est Ă©vident : je lance le sujet, car je trouve que c'est important d'y rĂ©flĂ©chir, mais je n'attends pas Ă ce que ce soit en place rapidement. Mais au moins, le dĂ©bat est lancĂ© (et justement, c'est important de le lancer puisque je lis quelques apprĂ©ciations diffĂ©rentes dans la suite de ton message đ)
Pour ma part, je ne suis pas convaincu qu'un GeoNature territorial d'un parc national ou régional nécessite de réintégrer toutes les données existantes sur son territoire, tant qu'elles sont disponibles quelque part d'accessible et ouvert.
LĂ , je suis moins d'accord, mais bien entendu, je ne suis qu'un "simple utilisateur" de GeoNature, avec la vision d'un naturaliste et/ou gestionnaire d'espace naturels.
Pour un "gestionnaire d'espace naturels" il est utile d'avoir un outil de "monitoring" de son territoire d'Ă©tude. Et c'est quand mĂȘme une des fonctions de GeoNature non ?
Ensuite, prĂ©senter un Atlas de la BiodiversitĂ© du PNR de Tartempion, avec des cartes de fiches espĂšces qui ne reflĂštent qu'une partie de la connaissance, alors que cette derniĂšre est accessible, c'est quand mĂȘme bien dommage (j'ai plusieurs observations sous iNaturalist de nouvelles espĂšces pour le territoire du PNR concernĂ©, qui n'apparaissent donc pas dans les listings/cartes, alors qu'elles le devraient).
Je pense, pour participer à de nombreux réseaux naturalistes, que de plus en plus de données viendront de cette plateforme (iNaturalist), et que les ignorer serait une "faute stratégique".
Et comme ces données sont dans le GBIF (c'est une des raisons, aprÚs l'ergonomie, pour laquelle j'utilise iNaturalist), autant se connecter au GBIF directement, c'est la logique pour éviter d'avoir à multiplier les connexions à la multiplicités des instances/plateformes productrices.
Non ?
C'est juste que l'API n'est pas encore documentĂ©e Ă ma connaissance, et peut-ĂȘtre pas encore prĂ©vue pour ĂȘtre utilisĂ©e directement, mais c'est en cours.
Il y a bien une doc développeurs avec certaines API, des exemples avec une doc swagger téléchargeables etc, mais seulement pour des routes qui synthétisent des données : statistiques, infos d'un taxon, statistiques par années etc : https://openobs.mnhn.fr/developer
Pour le moment je n'ai pas trouvĂ© d'API qui retourne des objets "occurrences" mais c'est peut ĂȘtre Ă venir. A voir aussi sur le projet source, open obs est basĂ© sur un outil dĂ©ployĂ© dans d'autres pays.
Pour un "gestionnaire d'espace naturels" il est utile d'avoir un outil de "monitoring" de son territoire d'Ă©tude.
Ca c'est des questions de positionnements qui dĂ©pendent des utilisateurs et des gestionnaires. Je gĂšre plusieurs instances, certains ont besoin d'avoir leurs donnĂ©es dans une boite isolĂ©e pour leurs rendus, analyses etc, et d'avoir accĂšs aux donnĂ©es des autres dans des outils distincts. D'autres veulent tout dans leur base pour avour tout au mĂȘme endroit. Et certains sites protĂ©gĂ©s ne sont prospectĂ©s que par ou pour le gestionnaire puisque interdit aux autres. Les contextes et les besoins sont trĂšs variables et l'outil ne doit pas faire le choix Ă la place de son administrateur :)
Les contextes et les besoins sont trĂšs variables
On est bien d'accord ! đ
et l'outil ne doit pas faire le choix Ă la place de son administrateur :)
On donc, si l'administrateur d'une instance souhaite que son outil affiche les données OpenData, il faut anticiper cette demande.
certains ont besoin d'avoir leurs données dans une boite isolée
Il va de soit que les donnĂ©es en OpenData externes ne doivent pas ĂȘtre mĂ©langĂ©e avec les donnĂ©es de l'administrateur de l'instance. C'est pour ça que l'on parle d'import en SynthĂšse, avec possibilitĂ© de connexion, et d'affichage optionnel.
Oui oui, mais du coup on est plusieurs à s'y intéresser, et à le prévoir pour le GBif. Le soucis pour beaucoup d'entre nous c'est de trouver le temps de faire un truc qui fonctionne bien, qui soit facile à utiliser, et qui gÚre bien les questions des métadonnées, des doublons avec les données qu'on récupÚre localement etc :) Mais ça reste au programme !
Salut Ă tous, Je reviens aux nouvelles sur ce sujet. MĂȘme si c'est brouillon et pas gĂ©nĂ©rique, je suis intĂ©ressĂ© si quelqu'un a dĂ©jĂ quelques bouts de codes Ă partager đ J'ai vu sur plusieurs autres discussions que certains ont dĂ©jĂ fait ce travail : ce serait sympa de le partager ? (mĂȘme si c'est imparfait !)
On a discutĂ© rĂ©cemment ici d'intĂ©grer le rĂ©fĂ©rentiel taxonomique du GBIF Ă la place de Taxref : https://github.com/PnX-SI/TaxHub/issues/318 Mais pas d'intĂ©grer des donnĂ©es GBIF dans la synthĂšse de GeoNature, mĂȘme si c'est ce que j'avais fait et expliquĂ© dans l'article rĂ©fĂ©rencĂ© dans cette mĂȘme discussion sur l'intĂ©gration de donnĂ©es GBIF Ă Copenhague ou en JamaĂŻque.
En terme d'automatisation de cela il n'y a rien de nouveau Ă m connaissance.
Merci Camille pour ta réponse.
intégrer le référentiel taxonomique du GBIF à la place de Taxref : https://github.com/PnX-SI/TaxHub/issues/318
Cela ne me semble pas pertinent pour le besoin identifié d'import dans une instance française/SINP. (dans le cas précis du ticket référencé, pourquoi pas, puisque ce ne sont pas des espÚces sauvages/françaises)
Le lien entre TAXREF et GBIF est déjà opérationnel à 96% : https://www.gbif.org/fr/dataset/0e61f8fe-7d25-4f81-ada7-d970bbb2c6d6
Il ne faut donc pas intégrer le référentiel du GBIF "à la place de Taxref", mais "en complément de TaxRef", en ajoutant par exemple à TaxHub un champ id_gbif
, ce qui permettra de faire la correspondance pour 96% des taxons (et sans doute encore plus de pourcentage d'occurrences)
Je me permets Ă nouveau de relancer ce sujet.
De mon cÎté, j'ai finalement découvert que la correspondance TAXREF
<=> GBIF
est déjà disponible "en dur" dans TAXREF (v17), via la table TAXREF_LIENS
, dont voici un extrait :
(au total, 616463 cd_nom
ont un lien GBIF)
Par ailleurs, le GBIF dispose d'une API, et un module Python dédié : PyGBIF : https://github.com/gbif/pygbif
De maniÚre assez simple, j'ai pu récupérer via ce module les occurrences, en filtrant par exemple selon une emprise (bounding-box) et un jeu de donnée (Dataset "iNaturalist Research-grade Observations") Mais n'ayant pour l'instant pas accÚs à l'administration d'une instance GeoNature, je ne peux aller plus loin dans mes tests.
Il me semble que tout est rĂ©uni pour que ce travail soit relativement "simple", si l'objectif est "juste" d'ajouter un jeu de donnĂ©es "GBIF" rĂ©pondant Ă quelques filtres (spatiaux, taxonomiques, sources, ...). Reste quand mĂȘme le gros travail de mise en correspondance des champs des occurrences, mais ce travail n'a pas besoin d'ĂȘtre exhaustif, puisque le lien vers la source permet d'avoir toutes les infos.
Avant que je n'aille plus loin, n'étant pas véritablement développeur, je me permets de relancer la bouteille à la mer pour savoir si certains auraient déjà fait ce travail, et des bouts de code à partager ? Ou si ceux qui se seraient frottés à ce sujet ne voudraient pas profiter de ce fil pour partager les éventuelles difficultés rencontrés ?
Merci, en effet il y a matiÚre à regarder tout ça.
Pour ma part, je ne peux et ne veux pas récupérer les données seules sans les métadonnées, ce qui complique un peu les choses. Je ne me suis pas repenché sur ce sujet pour le moment, je n'ai pas de deadline pour ça donc ça ne sera pas pour les prochaines semaines,
Pour ce qui concerne les métadonnées, je pensais créer manuellement un jeu de donnée dédiée au Dataset "iNaturalist Research-grade Observations" Les métadonnées de ce jeu de données ne sont donc à saisir qu'une seule fois.
Sinon, pour ceux que cela intĂ©resse, voici dĂ©jĂ un code fonctionnel, basĂ© sur une liste d'Observateurs "en dur". Ce qui serait mieux, c'est une table de correspondance entre l'identifiant de l'utilisateur GeoNature (userhub si je me souviens bien đ ) et l'identifiant utilisateur dans la base externe, selon le Dataset. Et l'idĂ©al Ă©tant Ă terme de se baser sur ORCID (cf. https://github.com/PnX-SI/GeoNature/issues/1393), mais ça marche pour l'instant trĂšs bien avec le champ 'RecordBy'.
import csv
from pygbif import occurrences as occ
from datetime import datetime
# Export name for naming export file
exportname = 'iNaturalist_gbif_observers_list_ornearea'
# Bounding box (latitude/longitude) to limit area
min_latitude = 48.175391
max_latitude = 48.977037
min_longitude = -0.867335
max_longitude = 0.98335
# List of observers
observer_list = ['User1', 'User Toto', 'Sylvain Montagner'] # based on recordedBy field
# Search params
search_params = {
'country': 'FR', # France
'decimalLatitude': f'{min_latitude},{max_latitude}',
'decimalLongitude': f'{min_longitude},{max_longitude}',
'datasetKey': '50c9509d-22c7-4a22-a47d-8c48425ef4a7', # iNaturalist dataset
'limit': 300, # Limit of 300 occurrences per request
}
# Function to retrieve all occurrences with pagination
def get_all_occurrences(params, observers):
all_occurrences = []
for observer in observers:
offset = 0
params['recordedBy'] = observer
while True:
params['offset'] = offset
occurrences = occ.search(**params)
results = occurrences['results']
if not results:
break
all_occurrences.extend(results)
offset += len(results)
print(f"{offset} occurrences retrieved for observer {observer} ...")
return all_occurrences
# Retrieve all occurrences
all_occurrences = get_all_occurrences(search_params, observer_list)
# List all available fields
all_fields = set()
for occurrence in all_occurrences:
all_fields.update(occurrence.keys())
# Get current date and time for export name
current_datetime = datetime.now().strftime("%Y%m%d_%H%M%S")
# Save occurrences in a CSV file
output_file = f"occurrences_{exportname}_{current_datetime}.csv"
with open(output_file, mode='w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=list(all_fields))
writer.writeheader()
for occurrence in all_occurrences:
writer.writerow({field: occurrence.get(field, '') for field in all_fields})
print(f"occurrences have been recorded in the {output_file} file.")
J'ai commencé a bricoler un truc suite aux rencontres geonature, pour utiliser https://github.com/PnX-SI/api2GN afin de faire l'intégration des données.
gbif_parser.py
from pygbif import occurrences , registry , species
from geojson import Feature
from shapely import wkt
from geoalchemy2.shape import from_shape
from api2gn.parsers import JSONParser
class GBIFParser(JSONParser):
srid = 4326
progress_bar = False # Assuming no progress bar is needed for a single request
def __init__(self, occurrence_id):
# Initialize the parent class
super().__init__()
self.occurrence_id = occurrence_id
self.data = self.fetch_data()
self.validate_mapping()
def fetch_data(self):
# Using pygbif to fetch occurrence data
response = occurrences.get(self.occurrence_id)
if response.get('status') == 'success':
return response['data']
else:
raise ValueError(f"Failed to fetch data for occurrence ID {self.occurrence_id}")
@property
def items(self):
return [self.data] # Return data as a list with a single item
@property
def total(self):
return 1 # Only one item in this case
def get_geom(self, row):
if 'decimalLatitude' in row and 'decimalLongitude' in row:
point = f"POINT({row['decimalLongitude']} {row['decimalLatitude']})"
geom = wkt.loads(point)
return from_shape(geom, srid=4326)
return None
mapping = {
# "unique_id_sinp":
"eventDate": "date_min",
"scientificName": "cd_nom",
"decimalLatitude": "latitude",
"decimalLongitude": "longitude",
"species": "species",
"recordedBy": "observers",
"identifiedBy": "determiner",
"locality": "place_name",
"habitat": "cd_hab",
"occurrenceRemarks": "comment_context",
# Add more fields as necessary
}
Pour le moment, je suis que a l'étape du POC mais j'ai repÚre la lib python pygbif et je me suis dit qu'il y avait moyen de récupérer les métadonnées en complément.
https://api.gbif.org/v1/organization/28eb1a3f-1c15-4a95-931a-4af90ecb574d https://api.gbif.org/v1/dataset/50c9509d-22c7-4a22-a47d-8c48425ef4a7 https://api.gbif.org/v1/geocode/gadm/FRA.3_1/subdivisions (Bretagne mais ils ont oublié le 44)
par contre je n'arrive pas a trouver l'uuid de l'observation et d'aprĂšs les discutions c'Ă©tait disponible đ€ ex : https://api.gbif.org/v1/occurrence/4407389321
Avec ton exemple, je vais essayer de creuser dans les semaines qui viennent pour avoir un truc fonctionnel sur un secteur et les données provenant de Inaturalist. On a des conservateurs bénévoles qui préfÚrent saisir sur cet outil et on voit jamais les données...
je vais crĂ©er une branche dĂ©diĂ©e bientĂŽt. Merci pour le partage đ
Trop bien ! Hésite pas à faire une PR sur le repo API2GN. J'ai hùte de tester ça
Super : bravo @pierre56 đ Je suis de trĂšs trĂšs loin les Ă©volutions de GN depuis quelques annĂ©es, mais du coup, si ça marche, la question qui devra ĂȘtre posĂ©e sera : quelles donnĂ©es intĂšgre-t-on via cet outil. Pour ce que j'imaginais concernant notre instance, j'aurais bien vu pouvoir choisir le/les jeux de donnĂ©es Ă importer (et commencer par "iNaturalist Research-grade Observations" ), et que les donnĂ©es ne soient rĂ©cupĂ©rĂ©es que pour une certaine liste d'utilisateurs qui auraient donnĂ© leur accord.
MĂȘme si la licence des donnĂ©es permettrait d'intĂ©grer la totalitĂ© du jeu de donnĂ©es, l'intĂ©rĂȘt, c'est que cela donne Ă l'observateur le choix d'intĂ©grer ou non ses donnĂ©es d'autres plateforme dans son instance de saisie.
Salut la Team GeoNature đ
Longtemps que je ne suis pas passé ici, et désolé par avance si le sujet a déjà été évoqué.
Je n'administre plus aucune base GeoNature, mais je reste naturaliste et animé de la passion de saisir/valoriser mes observations, et à ce titre il m'arrive encore de saisir des observations sur plusieurs instances GeoNature.
Cependant, je dois avouer qu'en tant que photographe naturaliste, j'ai aussi été séduit par l'ergonomie et surtout la philosophie d'iNaturalist, qui selon moi est une révolution en la matiÚre (je pourrai en parler des heures, mais ce n'est pas le lieu).
Finalement, que ce soit iNaturalist, le GBIF (ou d'autres plateformes que je ne connaitrais pas), il y a aujourd'hui un certain nombre de données naturalistes de qualité, librement accessibles (dans le cas d'iNaturalist ou GBIF, via une API par exemple).
De mon point de vue (mais j'accepte d'ĂȘtre contredit), ces donnĂ©es devraient ĂȘtre intĂ©grĂ©es dans la synthĂšse d'une instance GeoNature, selon le pĂ©rimĂštre de cette instance (gĂ©ographique, taxonomique, ...).
La synthÚse pouvant alimenter un ou des Atlas, il serait dommage de se priver de données libres pour compléter la répartition ou la phénologie des fiches espÚces de cet Atlas.
J'ouvre donc cette issue pour
Merci Ă vous !
Sylvain