Bio_data / app.py
RubaAnam1's picture
Update app.py
ba741e6 verified
import streamlit as st
import requests
from urllib.parse import quote
st.set_page_config(page_title="Clean Biodiversity Explorer", layout="centered")
st.title("🌍 Clean Biodiversity Explorer (فلتر دقيق)")
country_to_code = {
"sudan": "SD", "السودان": "SD",
"egypt": "EG", "مصر": "EG",
"saudi arabia": "SA", "السعودية": "SA",
"uae": "AE", "الامارات": "AE",
"usa": "US", "الولايات المتحدة": "US",
"uk": "GB", "المملكة المتحدة": "GB"
}
search_types = {
"🐦 Birds": {"class": "Aves", "rank": "CLASS"},
"🐍 Reptiles": {"class": "Reptilia", "rank": "CLASS"},
"🐘 Mammals": {"class": "Mammalia", "rank": "CLASS"},
"🦋 Insects": {"class": "Insecta", "rank": "CLASS"},
"🐸 Amphibians": {"class": "Amphibia", "rank": "CLASS"},
"🌳 غابات (نباتات)": {"kingdom": "Plantae", "taxonKey": 7707728, "rank": "KINGDOM"}
}
def get_country_code(user_input):
if not user_input:
return None
return country_to_code.get(user_input.strip().lower())
def get_species(country_code, search_key):
url = "https://api.gbif.org/v1/occurrence/search"
params = {
"country": country_code.upper(),
"limit": 80,
"occurrence_status": "PRESENT"
}
search_info = search_types[search_key]
if "class" in search_info:
params["class"] = search_info["class"]
elif "kingdom" in search_info:
params["kingdom"] = search_info["kingdom"]
if "taxonKey" in search_info:
params["taxonKey"] = search_info["taxonKey"]
try:
r = requests.get(url, params=params, timeout=15)
r.raise_for_status()
data = r.json()
except:
return []
results = data.get("results", [])
species_set = set()
species_list = []
bad = ["sp.", "cf.", "aff.", "unknown", "unclassified", "indet.", "hybrid"]
for item in results:
# التصفية حسب الفئة المطلوبة (الصارمة)
if "class" in search_info:
returned_class = item.get("class")
if returned_class != search_info["class"]:
continue # تخطى إذا لم يكن نفس الكلاس
elif "kingdom" in search_info:
returned_kingdom = item.get("kingdom")
if returned_kingdom != search_info["kingdom"]:
continue
sp = item.get("species") or item.get("scientificName")
key = item.get("speciesKey") or item.get("taxonKey")
if not sp or not key or len(sp) < 5:
continue
if any(b in sp.lower() for b in bad):
continue
if sp not in species_set:
species_set.add(sp)
species_list.append((sp, key))
if len(species_list) >= 12:
break
return species_list
def get_wikipedia_real_title(scientific_name):
search_url = "https://en.wikipedia.org/w/api.php"
params = {
"action": "query",
"list": "search",
"srsearch": scientific_name,
"format": "json",
"srlimit": 1
}
try:
resp = requests.get(search_url, params=params, timeout=5)
resp.raise_for_status()
data = resp.json()
pages = data.get("query", {}).get("search", [])
if pages:
return pages[0]["title"]
except:
pass
return None
def make_links(species_name, species_key):
links = {}
links["GBIF"] = f"https://www.gbif.org/species/{species_key}"
real_title = get_wikipedia_real_title(species_name)
if real_title:
links["Wikipedia"] = f"https://en.wikipedia.org/wiki/{real_title.replace(' ', '_')}"
else:
links["Wikipedia"] = f"https://en.wikipedia.org/w/index.php?search={quote(species_name)}&title=Special:Search"
links["iNaturalist"] = f"https://www.inaturalist.org/search?q={quote(species_name)}"
links["Scholar"] = f"https://scholar.google.com/scholar?q={quote(species_name)}"
return links
user_country = st.text_input("🇺🇳 اسم الدولة (مثال: Sudan, السودان, Egypt, مصر)")
selected_type = st.selectbox("📂 اختر نوع البحث", list(search_types.keys()))
if st.button("🔍 بحث"):
if not user_country:
st.warning("يرجى إدخال اسم الدولة أولاً.")
st.stop()
country_code = get_country_code(user_country)
if not country_code:
st.error(f"❌ رمز البلد لـ '{user_country}' غير معروف.")
st.stop()
with st.spinner(f"جلب البيانات من GBIF ..."):
species_data = get_species(country_code, selected_type)
if not species_data:
st.warning(f"😕 لا توجد أنواع مطابقة لـ {selected_type} في {user_country}.")
st.stop()
st.success(f"✅ تم العثور على {len(species_data)} نوعاً")
st.subheader(f"📌 {selected_type} في {user_country}")
for name, key in species_data:
st.markdown(f"### 🍃 {name}")
links = make_links(name, key)
st.markdown(
f"🔗 [GBIF]({links['GBIF']}) | "
f"📘 [Wikipedia]({links['Wikipedia']}) | "
f"📸 [iNaturalist]({links['iNaturalist']}) | "
f"📚 [Google Scholar]({links['Scholar']})"
)
st.markdown("---")