m45ha
m45ha

Reputation: 405

OSM Nominatum encoding for address

i am using SUNGEO package to geolocate a long list of addresses in Norway.

It says that Nominatum returns addresses in UTF-8 but I am not able to get this variable into proper format....

THis is what I am using and getting:

data_geocode_full_test<- geocode_osm_batch(test[1:100], delay=5, details=TRUE, verbose = TRUE)

The enquiry column looks "normal" but the address is in wrong encoding:

> data_geocode_full_test%>%head(20)%>%dput()
structure(list(query = c("LÖVMOVÄGEN 57, Upplands Väsby ", 
"VINTERVÄGEN 155, Upplands Väsby ", "EDS KYRKVÄG 8, Upplands Väsby ", 
"RYTTARGATAN 275, Upplands Väsby ", "KULLAVÄGEN 16, Upplands Väsby ", 
"SUNDSBORGSVÄGEN 113, Upplands Väsby ", "MARIA KRANTZONS VÄG 29, Upplands Väsby ", 
"BROMSBODAVÄGEN 17, Upplands Väsby ", "SKOGSTORPSVÄGEN 1, Upplands Väsby ", 
"SUNDSBORGSVÄGEN 3, Upplands Väsby ", "ARDENNERGATAN 1, Upplands Väsby ", 
"BJÖRNBÄRSVÄGEN 12, Upplands Väsby ", "VIRAVÄGEN 2, Upplands Väsby ", 
"SKATTBONDEVÄGEN 12, Upplands Väsby ", "SADELGATAN 258, Upplands Väsby ", 
"PRÄSTGÅRDSVÄGEN 2, Upplands Väsby ", "RYTTARGATAN 275, Upplands Väsby ", 
"RYTTARGATAN 278, Upplands Väsby ", "HAVREGATAN 9, Upplands Väsby ", 
"RINGBLOMSVÄGEN 11, Upplands Väsby "), osm_id = c("16425688", 
"19116665", "380231557", "6269910286", "126259490", "138200460", 
"575078941", "141851191", "129695763", "137241803", "27640787", 
"16316489", "542508430", "28312101", "126704094", "129556526", 
"6269910286", "550674304", "533260253", "1006514946"), osm_type = c("way", 
"way", "way", "node", "way", "way", "way", "way", "way", "way", 
"way", "way", "way", "way", "way", "way", "node", "way", "way", 
"way"), importance = c(0.40001, 0.40001, 0.50001, 0.4101, 0.4101, 
0.41001, 0.60001, 0.4, 0.50001, 0.41001, 0.5, 0.40001, 0.40001, 
0.4, 0.4101, 0.40001, 0.4101, 0.4, 0.5, 0.40001), address = c("Lövmovägen, Sköldnora, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige", 
"Vintervägen, Sjukyrkoberg, Bredden, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige", 
"Eds kyrkväg, Ed, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 47, Sverige", 
"275, Ryttargatan, Smedby, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 71, Sverige", 
"16, Kullavägen, Vilunda, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 34, Sverige", 
"113, Sundsborgsvägen, Sanda, Fresta, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 53, Sverige", 
"Maria Krantzons väg, Odenslunda, Vilunda, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 56, Sverige", 
"Bromsbodavägen, Runby, Skomakarhagen, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 42, Sverige", 
"Skogstorpsvägen, Sanda, Fresta, Ekeby, Upplands Väsby kommun, Stockholms län, 194 53, Sverige", 
"3, Sundsborgsvägen, Sanda, Fresta, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 53, Sverige", 
"Ardennergatan, Odenslunda, Ekebo, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 73, Sverige", 
"Björnbärsvägen, Bredden, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige", 
"Viravägen, Brunnby-Vik, Vik, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 51, Sverige", 
"Skattbondevägen, Fresta, Ekeby, Upplands Väsby kommun, Stockholms län, 194 53, Sverige", 
"258, Sadelgatan, Ekebo, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 72, Sverige", 
"Prästgårdsvägen, Njursta, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 04, Sverige", 
"275, Ryttargatan, Smedby, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 71, Sverige", 
"Ryttargatan, Bredden Väst, Smedby, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 72, Sverige", 
"Havregatan, Njursta, Prästtorp, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 47, Sverige", 
"Ringblomsvägen, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige"
), longitude = c(17.9459441, 17.9418005, 17.866557, 17.9074389, 
17.9058786449197, 17.94493335, 17.9316469, 17.8876315, 17.9637304, 
17.9459249936174, 17.9177647, 17.93975, 17.9375491, 17.9596357, 
17.9140665488689, 17.8861489, 17.9074389, 17.9129237, 17.8801615, 
17.9535741), latitude = c(59.4952058, 59.5007792, 59.508017, 
59.5076954, 59.51737895, 59.5158072, 59.519685, 59.5247165, 59.5151962, 
59.5128517, 59.5139806, 59.4953153, 59.5339032, 59.518428, 59.50805465, 
59.5136555, 59.5076954, 59.5057079, 59.5151941, 59.5007244), 
    bbox_ymin = c(59.4951003, 59.5006129, 59.5078865, 59.5076454, 
    59.5171918, 59.5157424, 59.5196826, 59.5231604, 59.51496, 
    59.5126555, 59.511177, 59.4946063, 59.5336987, 59.5183616, 
    59.5079014, 59.5125137, 59.5076454, 59.5049557, 59.5143229, 
    59.5007244), bbox_ymax = c(59.4952363, 59.5007792, 59.5081383, 
    59.5077454, 59.5175781, 59.515872, 59.5196877, 59.5269884, 
    59.515843, 59.5131436, 59.5140046, 59.4962885, 59.5344431, 
    59.5192497, 59.5083146, 59.5147537, 59.5077454, 59.5067477, 
    59.5160863, 59.5007715), bbox_xmin = c(17.9456666, 17.9418005, 
    17.8664143, 17.9073889, 17.9054212, 17.9448142, 17.9299932, 
    17.8852799, 17.9633726, 17.9456178, 17.914354, 17.9389514, 
    17.9367699, 17.9579108, 17.9138134, 17.8857297, 17.9073889, 
    17.9102479, 17.8796081, 17.9534576), bbox_xmax = c(17.9460489, 
    17.9418603, 17.8667449, 17.9074889, 17.9063531, 17.9450525, 
    17.9331563, 17.8881643, 17.9641165, 17.9462435, 17.9196486, 
    17.9406962, 17.9380534, 17.960939, 17.9144792, 17.8861489, 
    17.9074889, 17.9152162, 17.8810689, 17.9535741)), row.names = c(NA, 
20L), class = "data.frame")

I tried with no luck from past questions: How to fix this?

data_geocode_full_test$address <-as.character(data_geocode_full_test$address) Encoding(data_geocode_full_test$address) <- 'UTF-8'

enter image description here

Upvotes: 0

Views: 102

Answers (1)

margusl
margusl

Reputation: 17754

dput() output does not carry encoding details, so this is kind of a guesswork, but if those results were somehow stored in a wrong encoding, perhaps iconv from utf8 helps to fix this:

# before:
head(data_geocode_full_test$address)
#> [1] "Lövmovägen, Sköldnora, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige"                
#> [2] "Vintervägen, Sjukyrkoberg, Bredden, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige"     
#> [3] "Eds kyrkväg, Ed, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 47, Sverige"                    
#> [4] "275, Ryttargatan, Smedby, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 71, Sverige"            
#> [5] "16, Kullavägen, Vilunda, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 34, Sverige"            
#> [6] "113, Sundsborgsvägen, Sanda, Fresta, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 53, Sverige"

data_geocode_full_test$address <- iconv(data_geocode_full_test$address, from = "UTF-8", to = "latin1") |> `Encoding<-`("UTF-8")
# or:
# data_geocode_full_test$address <- iconv(data_geocode_full_test$address, from = "UTF-8", to = "Windows-1252") |> `Encoding<-`("UTF-8")

# after: 
head(data_geocode_full_test$address)
#> [1] "Lövmovägen, Sköldnora, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige"                  
#> [2] "Vintervägen, Sjukyrkoberg, Bredden, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige"     
#> [3] "Eds kyrkväg, Ed, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 47, Sverige"                    
#> [4] "275, Ryttargatan, Smedby, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 71, Sverige"           
#> [5] "16, Kullavägen, Vilunda, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 34, Sverige"            
#> [6] "113, Sundsborgsvägen, Sanda, Fresta, Upplands Väsby, Upplands Väsby kommun, Stockholms län, 194 53, Sverige"

Trying to replicate it with an actual request, reading UTF-8 response as latin1 and then fixing the result:

library(httr)
resp_latin1 <- httr::GET("https://nominatim.openstreetmap.org/?addressdetails=1&q=LÖVMOVÄGEN+57,Upplands+Väsby&format=json&limit=1") |>
  content(as = "text", encoding = "latin1") |>
  jsonlite::fromJSON()
resp_latin1$display_name
#> [1] "Lövmovägen, Sköldnora, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige"
Encoding(resp_latin1$display_name)
#> [1] "UTF-8"

iconv(resp_latin1$display_name, from = "UTF-8", to = "latin1") |> `Encoding<-`("UTF-8")
#> [1] "Lövmovägen, Sköldnora, Bollstanäs, Upplands Väsby kommun, Stockholms län, 194 64, Sverige"

If it doesn't have to be SUNGEO, there are also other libraries for querying OSM Nominatum service, e.g. nominatimlite:

library(nominatimlite)
address <- c("LÖVMOVÄGEN 57, Upplands Väsby ", "VINTERVÄGEN 155, Upplands Väsby ", 
             "EDS KYRKVÄG 8, Upplands Väsby ", "RYTTARGATAN 275, Upplands Väsby ", 
             "KULLAVÄGEN 16, Upplands Väsby ")
nominatimlite::geo_lite(address)
#> # A tibble: 5 × 4
#>   query                                lat   lon address                        
#>   <chr>                              <dbl> <dbl> <chr>                          
#> 1 "LÖVMOVÄGEN 57, Upplands Väsby "    59.5  17.9 Lövmovägen, Sköldnora, Bollsta…
#> 2 "VINTERVÄGEN 155, Upplands Väsby "  59.5  17.9 Vintervägen, Sjukyrkoberg, Bre…
#> 3 "EDS KYRKVÄG 8, Upplands Väsby "    59.5  17.9 Eds kyrkväg, Ed, Upplands Väsb…
#> 4 "RYTTARGATAN 275, Upplands Väsby "  59.5  17.9 Upplands Väsbyn ruotsinsuomala…
#> 5 "KULLAVÄGEN 16, Upplands Väsby "    59.5  17.9 16, Kullavägen, Vilunda, Uppla…

Created on 2023-06-06 with reprex v2.0.2

Upvotes: 0

Related Questions