Detta är ett litet test för at se om man ev kan matcha våra sjukhus mot deras geo-koordinater för att sedan markera dessa enheter på karta. Det finns ett öppet API mot delar av HSA-katalogen. Bara ett mindre antal landsting är ännu anslutna (VGR finns) Smen jag tolkar det som att fler landsting kommer föras in framöver. Mer info finns här: http://hip.se/oppen-data/domain/5141bf7ee211b84875000010/service/lista-hsa-objekt-1/
Den data jag läser ner via JSON från HSA-katalogen är visserligen en data frame men inte i det format som dplyr-paketet kräver. Vissa kolumner är nämligen inte atomic vectors utan i sin tur data frames. Dock läser jag in dplyr ändå för tillgång till pipen.
library(dplyr)
library(leaflet) # För att skapa karta
hsa <- jsonlite::fromJSON("http://api.offentligdata.minavardkontakter.se/orgmaster-hsa/v1/hsaObjects.json")
names(hsa)
## [1] "hsaId" "hsaIdUrlEncoded"
## [3] "type" "dn"
## [5] "parentDn" "parentDnUrlEncoded"
## [7] "relativeDistinguishedName" "description"
## [9] "management" "postalAddress"
## [11] "countyCode" "countyName"
## [13] "street" "webAddress"
## [15] "geoLocation" "careType"
## [17] "businessClassificationCode" "businessClassificationName"
## [19] "telephoneNumber" "orgNo"
## [21] "surgeryHours" "telephoneHours"
För att få en mer hanterlig datamängd kan vi begränsa oss til gynekologiska enheter. Jag testar att identifiera dessa enheter via deras namn enligt http://www.inera.se/Documents/TJANSTER_PROJEKT/Katalogtjanst_HSA/Innehall/HSA_innehall_verksamhetskod.pdf
gyn_enheter <- c(
"Gynekologi",
"Onkologi, gynekologisk",
"Akutverksamhet vid sjukhus, gynekologi "
)
# Begränsa till gyn_enheter
index_gyn_enheter <-
unlist(lapply(hsa$businessClassificationName,
function(x) any(x %in% gyn_enheter)))
hsa <- subset(hsa, index_gyn_enheter)
Eftersom vi inte har ngt HSA-id direkt knutet till våra enheter så tror jag detta kan bli svårt tyvärr. Ev får man försöka gå via namn i klartext Det är inte jättetydligt vad enheterna i HSA-katalogen heter men man kan få fram namninformation från variabel “dn”. Varje element är en teckensträng med flera delar enligt http://hip.se/oppen-data/domain/5141bf7ee211b84875000010/meta/ Jag begränsar mig till de delar av strängen som inleds med “ou=” dvs organisationsenheter
# Plocka fram textsträng som kan matchas mot våra sjukhusnamn i klartext
dn <- strsplit(hsa$dn, ",") %>%
lapply(function(x) x[substr(x, 1, 2) == "ou"] %>% substring(4))
head(dn)
## [[1]]
## [1] "Kvinnokliniken Hallands sjukhus" "Område 4"
## [3] "Hallands sjukhus"
##
## [[2]]
## [1] "Gynmottagning Köping" "Kvinnokliniken" "Västmanlands sjukhus"
##
## [[3]]
## [1] "Gynekologisk enhet" "Kvinnoklinik"
## [3] "Södra Älvsborgs Sjukhus"
##
## [[4]]
## [1] "Gynekologisk enhet" "Kvinnoklinik"
## [3] "Södra Älvsborgs Sjukhus"
##
## [[5]]
## [1] "Kvinnoklinikens mottagning" "Kvinnokliniken"
## [3] "Västmanlands sjukhus"
##
## [[6]]
## [1] "Gynekologimottagning" "Opererande specialiteter"
## [3] "Angereds Närsjukhus"
Tyvärr lyckas jag inte komma vidare härifrån. Jag försökte t ex matcha namnen i dn mot våra namn från decode-översättning med hjälp av “fuzzy matching” via min funktion “best_match” i rcc-paketet men tydligen är namnen för olika för att kunna matchas :-( Men om man skulle lyckas med en matchning (eller få en HSA-nyckel-id-nyckel direkt) så finns sedan koordinaterna lättillgängliga:
head(hsa$geoLocation)
## longitude latitude
## 2 12.84779 56.68198
## 43 16.00268 59.50911
## 48 12.96176 57.72507
## 49 12.96176 57.72507
## 123 16.58052 59.61759
## 159 12.05070 57.79617
För exemplets skull kan vi just nu bara plocka alla gyn-enheter från VGR (utan att koppla detta till våra kvalregdata).
koordinater <- subset(hsa, countyName == "Västra Götalands län",
c("relativeDistinguishedName", "geoLocation")
)
Mna kan förstås använda olika metoder för att skapa karta men här testar jag med leaflet-paketet och det enda jag gör är att jag skriver ut namnen på de valda enheterna.
Klickar man på enheten så visas texten från kolumnen relativeDistinguishedName.
leaflet() %>%
addTiles() %>%
addMarkers(lng = koordinater$geoLocation$longitude,
lat = koordinater$geoLocation$latitude,
popup = koordinater$relativeDistinguishedName
)