Jag fick en fråga om hur man kan använda data från en XML källa på nätet till geodata i QGIS. Det praktiska exemplet var SMHI API för varningar.

https://www.smhi.se/data/utforskaren-oppna-data/varningar-api
Jag har ingen större erfarenhet av att jobba med API på det här sättet, så jag såg det som ett bra tillfälle att lära mig något nytt. Det finns säkerligen bättre och enklare sätt att göra detta på, så se det jag visar här som ett exempel.
För det första så finns det två datakällor. Dels via XML och dels via JSON. Jag valde att använda XML, men jag gissar att det skulle gått ungefär lika bra med JSON, även om metoderna skulle sett lite annorlunda ut.
Jag valde även att konvertera data från XML till QGIS manuellt och inte dynamiskt. Skriptet som jag skapar körs när jag vill, och det skapar en ögonblicksbild lokalt för aktuella varningar vid just det tillfället.
(Hela mitt skript finns via en länk sist i artikeln.)
import requests import xml.etree.ElementTree as ET
Jag använder ”requests” för att hämta xml-data och ”xml.etree.ElementTree” för att läsa dessa.
smhi_layers = 'https://opendata-download-warnings.smhi.se/api/version/2/districtviews/all.xml' root = ET.fromstring(requests.get(smhi_layers).text)
Datakällan hämtas och läses in i xml-trädet ”root”.
Skriptet skapar ett minneslager med lämpliga attribut genom att använda QgsVectorLayer() och addAttributes() från PyQGIS Developer Cookbook.
Jag använder root.findall() för att hitta de delar i xml-texten som jag är intresserad av och matar in dessa värden i attributtabellen med setAttributes().
Här var det ett litet problem i och med att de punkter som används i SMHI API har omvända latitud och longitudvärden. När jag läser in punkter eller polygoner som Well Known Text (WKT) så hamnar allt i trakten av persiska viken…

Om man är nöjd med detta så finns det ett processverktyg som enkelt vänder X och Y koordinater i ett lager. Detta finns bland verktygen för vektorgeometri i verktygspanelen. Verktyget kan dessutom köras direkt på ett befintligt lager utan att skapa nya, vilket kan underlätta.

Verktyget kan dock köras med python precis som alla andra processverktyg. Med några rader extra kod så kan jag därför använda swapXy() i skriptet för att få alla objekt på rätt plats.
Varningarna finns sedan i en egen xml-källa som används på liknande sätt med etree.ElementTree för att ”uppdatera” attributtabellen med de varningar som för tillfället finns.
Avslutningsvis så får man stilsätta lagret på ett passande sätt. Jag använder även ”Map Tips” för att visa mer detaljer när man håller muspekaren över ett objekt.

Skriptet kördes från pythonkonsolen medan jag utvecklade det, men det går att bygga om det till ett processverktyg om man skulle önska det, eller baka in i ett plugin…
Jag har valt att skapa ett processverktyg som inte har vare sig input- eller output-fält, utan så fort verktyget körs så läggs ett vektorlager till.
Du kan hämta skriptet via GitHub:
Lägg sedan till skriptet i din tool-box.

Därefter hittar du verktyget bland dina skript.

Har du skapat motsvarande verktyg för QGIS? Varför inte dela med dig av dessa på samma sätt…
Har du ingen egen GitHub (eller motsvarande) så är jag övertygad om att det går att skicka skripten till QGIS Sverige så kan de lägga upp dessa på deras GitHub (GitHub/QGIS-Sverige).
Varför inte också passa på att bli medlem i föreningen, och därmed stötta QGIS projektet (bli medlem).
Bra ide att samla processing-script på QGIS Sveriges GitHub. Har börjat titta på sådana script själv och de kan bli väldigt kraftfulla och flexibla.