地址的 OSM 名义编码

问题描述 投票:0回答:1

我正在使用 SUNGEO 软件包来定位挪威的一长串地址。

它说 Nominatum 返回 UTF-8 格式的地址,但我无法将此变量转换为正确的格式....

这就是我正在使用和得到的:

数据地理编码_完整测试<- geocode_osm_batch(test[1:100], delay=5, details=TRUE, verbose = TRUE)

查询栏看起来“正常”,但地址编码错误:

> 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")

我尝试了过去的问题,但没有成功:如何解决这个问题?

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

r encoding openstreetmap nominatim
1个回答
0
投票

dput()
输出不携带编码详细信息,因此这是一种猜测,但如果这些结果以某种方式存储在错误的编码中,也许
iconv
fromutf8有助于解决此问题:

# 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"

尝试使用实际请求复制它,将 UTF-8 响应读取为 latin1,然后修复结果:

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"

如果不必是

SUNGEO
,还有其他库用于查询OSM Nominatum服务,例如
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…

创建于 2023-06-06,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.