3 min read

Ändra projektion för punktkoordinater

Om man får punktkoordinater är de ganska ofta i koordinatsystemet WGS84, vilket är det koordinatsystem som Google Map och många GPS:er använder. Samtidig ska punkterna ofta läggas ut på en karta som är i den svenska standardprojektionen SWEREF99. Man måste alltså ändra projektion för punkterna så att de också anges i SWEREF99.

Koordinater anges med hjälp av en CRS-sträng eller en CRS-kod. Info om vilken CRS-sträng som motsvarar en viss projektion kan man hitta på bland annat http://spatialreference.org/. WGS84 motsvaras till exempel av CRS-strängen “+proj=longlat +datum=WGS84”.

Så här kan man göra för att översätta punktkoordinater till olika koordinatsystem:

library(spatial)
library(srgdal)
library(tidyverse)


# Läs in koordinater i WGS84-format (det format som t.ex. används av Google-maps)

dfadresser <- tibble::tribble(
  ~lat,       ~lon,
  59.8051214,  17.6896049,
  59.7270467,  17.8089790,
  59.9013531,  17.0176058,
  59.9398745,  17.8720678,
  60.0347762,  17.3069286,
  59.9651196,  17.7671378,
  59.8408899,  17.6307211,
  59.5692486,  17.5310160,
  59.5402218,  17.4972200,
  59.7264353,  17.8079230
)


# Projection string for SWEREF99
SWEREF99TM <- "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"

# Skapa data frame med koordinater i  SWEREF99
coordinates(dfadresser) = c("lon", "lat")
proj4string(dfadresser) = CRS("+proj=longlat +datum=WGS84")
koordSWEREF <- spTransform(dfadresser, CRS(SWEREF99TM))
dfadressSWEREF <- as_data_frame(koordSWEREF)

head(dfadressSWEREF)

# Nu är koordinaterna ändrade från WGS84 till SWEREF99

# A tibble: 6 x 2
#       lon      lat
#     <dbl>    <dbl>
# 1 650874. 6632770.
# 2 657936. 6624358.
# 3 612861. 6642145.
# 4 660454. 6648197.
# 5 628523. 6657526.
# 6 654477. 6650757.

Nästa steg kan vara att koppla koordinaterna till vilket län, kommun och tätort de tillhör. Det kan göras med “extract”-funktionen från “raster”-paketet (tack Björn Schulte-Herbrüggen från Region Uppsala för koden!):

# Vill man lägga på information från shape-filen om vilken kommun,
# tätort och län varje punkt ligger i kan man använda raster-paketets
# extract()-funktion. Koden, inkl. fria shape-filer från Lantmäteriet
# kan laddas hem från https://github.com/christianlindell/demokoordinat


path <- getwd()

kommun <- readOGR(paste0(path, "/", "karta"),"ak_riks")
tatort <- readOGR(paste0(path, "/", "karta"), "mb_riks")

# extract data
dfdata_kommun <- data.frame(coordinates(dfadressSWEREF),
                          raster::extract(kommun, dfadressSWEREF))

dfdata_tatort <- data.frame(coordinates(dfadressSWEREF),
                          raster::extract(tatort, dfadressSWEREF))

# merge dfs

dfdata_kommun1 <- dfdata_kommun %>% 
  select(lon, lat, LANSNAMN, KOMMUNNAMN) %>% 
  mutate(concat = paste(lat,lon,sep="_")) %>% 
  distinct()

dfdata_tatort1 <- dfdata_tatort %>% 
  select(lon, lat, KATEGORI, NAMN1) %>% 
  mutate(concat = paste(lat,lon,sep="_")) %>%
  distinct()

dffinal <- merge(x=dfdata_tatort1[,c("concat","KATEGORI", "NAMN1")], y=dfdata_kommun1, by="concat")
dffinal <- dffinal %>% select(lon, lat, kommun=KOMMUNNAMN, lan=LANSNAMN, tatort=KATEGORI, tatort.namn=NAMN1)

head(dffinal)

#        lon     lat  kommun         lan tatort tatort.namn
# 1 641195.6 6602861    Håbo Uppsala län Tätort        Råby
# 2 642982.7 6606165    Håbo Uppsala län Tätort      Bålsta
# 3 657879.6 6624288 Knivsta Uppsala län Tätort     Knivsta
# 4 657936.1 6624358 Knivsta Uppsala län Tätort     Knivsta
# 5 650874.0 6632770 Uppsala Uppsala län Tätort       Sävja
# 6 647413.9 6636619 Uppsala Uppsala län Tätort     Uppsala

Koden och shapefilerna (fria filer från Lantmäteriet) kan laddas ned från GitHub