from geemap.common import ee_initialize import requests import folium import scholarpy import streamlit as st import geemap.foliumap as geemap if "dsl" not in st.session_state: st.session_state["dsl"] = scholarpy.Dsl() def get_orcid_data(orcid, info_type=None): """Retrieve ORCID data based on an ORCID and information type. Args: orcid (str): The ORCID to retrieve data for, e.g., 0000-0001-5437-4073 info_type (str): The type of information to retrieve, e.g., educations, employments, works Returns: dict: The ORCID data as a dictionary. """ headers = { "Accept": "application/vnd.orcid+json", } if info_type is not None: url = f"https://pub.orcid.org/v3.0/{orcid}/{info_type}" else: url = f"https://pub.orcid.org/v3.0/{orcid}" response = requests.get(url, headers=headers) return response.json() def get_education_data(orcid): result = get_orcid_data(orcid, "educations") affiliations = result["affiliation-group"] info_dict = {} try: for affiliation in affiliations: summary = affiliation["summaries"][0]["education-summary"] name = summary["source"]["source-name"]["value"] role = summary["role-title"] organization = summary["organization"]["name"] start_year = summary["start-date"]["year"]["value"] end_year = summary["end-date"]["year"]["value"] # start_date = ( # summary["start-date"]["year"]["value"] # + "-" # + summary["start-date"]["month"]["value"] # + "-" # + summary["start-date"]["day"]["value"] # ) # end_date = ( # summary["end-date"]["year"]["value"] # + "-" # + summary["end-date"]["month"]["value"] # + "-" # + summary["end-date"]["day"]["value"] # ) city = summary["organization"]["address"]["city"] region = summary["organization"]["address"]["region"] country = summary["organization"]["address"]["country"] address_list = [city, region, country] address = ", ".join([i for i in address_list if i]) # address = city + ", " + region + ", " + country coords = geemap.geocode(address)[0] lat = coords.lat lng = coords.lng info_dict[role] = { "name": name, "organization": organization, "start_year": start_year, "end_year": end_year, "city": city, "region": region, "country": country, "address": address, "lat": lat, "lng": lng, } except: pass return info_dict def app(): dsl = st.session_state["dsl"] st.title("Retrieve ORCID Data") m = geemap.Map(center=(20, 0), zoom=2, ee_initialize=False) row1_col1, row1_col2 = st.columns(2) with row1_col1: name = st.text_input("Enter a researcher name", "") if name: orcids = dsl.search_orcid_by_name(name, return_list=True) with row1_col2: if orcids is not None: selected = st.selectbox("Select an ORCID", orcids) else: selected = None st.write("No ORCID found.") # orcids = ["0000-0001-5437-4073", "0000-0001-6157-5519"] # if st.session_state.get("orcids", []) is not None: # orcids = orcids + st.session_state.get("orcids", []) # selected_orcid = st.selectbox("Select an ORCID:", orcids) # with row1_col2: # orcid = st.text_input("Enter an ORCID:", selected_orcid) row2_col1, row2_col2 = st.columns([1, 1]) if selected is not None: orcid = selected.split("|")[1].strip() education_data = get_education_data(orcid) roles = list(education_data.keys()) for role in roles: popup = f"Name: {education_data[role]['name']}
Organization: {education_data[role]['organization']}
Degree: {role}" marker = folium.Marker( [education_data[role]["lat"], education_data[role]["lng"]], popup=popup, ) marker.add_to(m) with row2_col1: markdown = f"""ORCID URL: """ st.markdown(markdown) if len(education_data) > 0: st.write("Education:") st.write(education_data) else: st.write("No education data found.") with row2_col2: m.to_streamlit()