Importer shelters (sheltere) til Supabase fra GeoFA (Geografiske Fagdata).
schema.sql, og kør det. (Uden denne tabel får du fejlen “Could not find the table ‘public.shelters’”.)shelterdk/.env (se .env.example).python3 import_shelters.pyGeoFA laget “Facilitet punkt” (t_5800_fac_pkt) indeholder alle slags faciliteter (shelter, bålpladser, toiletter, parkering, museer osv.). Import-scriptet filtrerer på feltet facil_ty og importerer kun:
Titler hentes fra navn; mangler den, bruges fx “Shelter, [kommune]” eller “Shelter (objekt_id)” i stedet for “Ukendt Shelter”. Beskrivelse kommer fra beskrivels / d_k_beskr. Billeder importeres fra GeoFA-felterne foto_link / geofafoto når de er udfyldt; mange faciliteter har ingen billed-URL i GeoFA.
Billeder fra udinaturen.dk: Udinaturen.dk viser samme faciliteter (samme id som GeoFA) og har ofte billeder. For shelters uden image_url kan du køre python3 fetch_udinaturen_images.py – scriptet henter facilitetssiden på udinaturen.dk (via source_id) og opdaterer image_url / image_urls.
By/kommune fra koordinater: Hvis shelters mangler by ved MapPin, kan du udfylde kommune via reverse geocoding: python3 backfill_kommune_from_geo.py. Bruger OpenStreetMap Nominatim (gratis, 1 req/s). Kør evt. --dry-run først.
GeoFA WFS kan desværre give 500 fra deres server. Brug da lokal GeoJSON fra de officielle værktøjer.
geofa_shelters.geojson i mappen shelterdk/.Eller sæt sti til din fil:
export GEOFA_GEOJSON_FILE=/sti/til/din/fil.geojson
python3 import_shelters.py
500-fejlen kom ofte af at typeName manglede schema-prefix: serveren forventer fkg:fkg.t_5800_fac_pkt (med “fkg.” foran tabellen), ikke fkg:t_5800_fac_pkt. Import-scriptet bruger nu det korrekte lag-navn. Hvis du stadig ser 500 fra GeoFA (PHP: $layer null i Wms.php), kan du:
Accept: application/json, og en POST GetFeature med XML-body (nogle servere håndterer kun POST korrekt).python3 geofa_debug_capabilities.py
Hvis du får status 200, ved vi at WFS i det mindste svarer på GetCapabilities.
Wms.php (Argument #6 $layer null).Book en Shelter har ikke et offentligt API, og deres server blokerer ofte automatiske kald (455) fra datacentre. Kør altid scriptene fra din egen computer (hjemme-IP) så blokering ofte undgås.
1. Opret staging-tabel i Supabase (én gang):
Kør i SQL Editor indholdet af migrations/002_bookenshelter_raw.sql.
2. Gratis måder at få data på:
bookenshelter_urls.txt (én URL per linje). Se bookenshelter_urls.txt.example.python3 fetch_bookenshelter_from_urls.py
Scriptet henter hver URL, udtrækker koordinater/titel/billeder og gemmer GeoJSON + bookenshelter_raw. Hvis en side ikke har koordinater, udtrækkes adressen fra teksten (fx “Nyborgvej 518, 5881 Skårup”) og geocodes via Nominatim (OpenStreetMap), så flere shelters får koordinater.
python3 fetch_bookenshelter_sitemap.py
Hvis du kun får 0–2 URLs, er sitemappen tom eller blokeret – brug URL-listen i stedet.
pip3 install playwright && python3 -m playwright install chromium
python3 fetch_bookenshelter_playwright.py
Åbner find-en-shelter i headless Chrome og fanger netværk/DOM. Virker ofte ikke fordi kort-data loades lukket.
3. Match mod GeoFA-shelters:
python3 match_bookenshelter_to_shelters.py
Betalt alternativ: Oxylabs Web Scraper API – sæt OXYLABS_USER og OXYLABS_PASSWORD i .env og kør python3 fetch_bookenshelter_oxylabs.py. Se scriptets docstring.
Mange shelters på Naturstyrelsens arealer kan bookes via book.naturstyrelsen.dk. Søg-siden loader steder med JavaScript, så der er ingen simpel sitemap – du samler links manuelt.
1. Opret tabel i Supabase (én gang):
Kør i SQL Editor indholdet af migrations/003_naturstyrelsen_raw.sql.
2. Find URLs og hent data:
naturstyrelsen_urls.txt (én URL per linje). Se naturstyrelsen_urls.txt.example.python3 fetch_naturstyrelsen_from_urls.py
Scriptet udtrækker titel, beskrivelse og adresse fra hver side, geocoder adressen (Nominatim) hvis der ikke er koordinater, og gemmer i naturstyrelsen_raw + GeoJSON.
3. Match mod GeoFA-shelters:
python3 match_naturstyrelsen_to_shelters.py
Kun shelters der ikke allerede har booking_url (fx fra Book en Shelter) opdateres, så begge kilder kan bruges uden at overskrive hinanden.
For at tjekke at Supabase-importen virker, kan du bruge den medfølgende testfil med et par shelters:
cp geofa_shelters_sample.geojson geofa_shelters.geojson
python3 import_shelters.py