R: Как правильно подготовить международный адрес для ggmap geocode / Google Geocode API? - PullRequest
0 голосов
/ 30 апреля 2018

Я обнаружил, что

loc <- "Dradenaustraße 33, 21129 Hamburg"
library(ggmap)
geocode(loc, source = "google", force = TRUE, messaging = TRUE, output = "more")

возвращает либо NA, ошибку «400, Bad Request», либо, если кто-то пытается подготовить адрес, как показано ниже, он даже возвращает лат / лон где-то в Канзасе.

Я нашел это,

loc <- "Dradenaustraße 33, 21129 Hamburg"
Encoding(loc) <- "UTF-8"
loc <- URLencode(loc, reserved = TRUE)

возвращает

Warning message:
In strsplit(URL, "") : input string 1 is invalid UTF-8

и loc будет NA позже.

Btw. следующее работает нормально с геокодом, то есть он возвращает правильный адрес и широту / долготу:

loc <- "Dradenaustrasse 33, 21129 Hamburg" #manually reformatted
loc <- "Dradenaustraee 33, 21129 Hamburg" #misspelled

Следующий адрес с ошибкой имеет те же проблемы, что и первоначальное нормальное написание:

loc <- "Dradenaustraée 33, 21129 Hamburg" #misspelled

Я вызываю API геокодирования со многими тысячами адресов, таких как приведенный выше, и не хочу их переформатировать (т. Е. Заменить «ß» на «ss», если это не является абсолютно необходимым. В этом случае я бы делать предположения о многих других международных адресах, содержащих также акценты (`, ´ и т. д.).

Есть идеи?

Большое спасибо! :)

Отредактировано, чтобы указать, что я ищу решение, которое произвольно работает для международных адресов и не требует специфического знания домена и ручного переформатирования адресов.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Это проблема кодирования, которая очень сложная. Ваш оригинальный текст не в UTF-8, и это то, что ищет Google. Установка кодировки только пытается прикрепить метаданные к строке. Это:

Encoding(loc) <- "UTF-8"

говорит R, что строка "UTF-8", а R говорит, что это не так. Ваши немецкие слова, вероятно, в кодировке " Latin9 ", которую функция R Encoding() не имеет ни малейшего представления, что это такое .

Что вы можете сделать, это перевести кодировку в UTF-8 перед отправкой в ​​Google. Вы можете сделать это внутри диапазона перед каждым вызовом, например:

loc <- "Dradenaustraße 33, 21129 Hamburg"
utf_encoded <- //some translation algorithm
geocode(utf_encoded, source = "google", force = TRUE, messaging = TRUE, output = "more")

Или вы можете попытаться создать второе хранилище данных (файлы, таблицы базы данных и т. Д.), Которое создается путем приема текста на немецком языке с помощью чтения файла или базы данных, его запуска по всему алгоритму и вывода эквивалентного текста, закодированного как UTF-8 посредством записи в файл или базу данных.

В любом случае, есть пакет преобразования / перевода строки , найденный здесь . Соответствующая часть этой страницы выглядит так:

stri_trans_general ("groß", "upper")

## "GROSS"

0 голосов
/ 30 апреля 2018

Вам не нужно беспокоиться об отправке вашего ввода определенным образом в API.

Для меня все варианты вашего ввода работают на Geocode.xyz:

  1. https://geocode.xyz/Dradenaustra%C3%9Fe%2033,%2021129%20Hamburg (с ß)

    • Германия x, y z: 53,52480,9,90007 | ??
    • 33 DRADENAUSTRASSE, Гамбург, Германия Доверие: 0,90
  2. https://geocode.xyz/Dradenaustrasse%2033,%2021129%20Hamburg (без ß)

    • Германия x, y z: 53,52480,9,90007 | ??
    • 33 DRADENAUSTRASSE, Гамбург, Германия Доверие: 0,90
  3. https://geocode.xyz/Dradenaustra%2033,%2021129%20Hamburg (с ошибками)

    • Германия x, y z: 53,5248,9,90007 | ??
    • 33 DRADENAUSTRAßE, Гамбург, Германия Доверие: 0,5

Единственное, что делает орфографическая ошибка, это изменение показателя доверия.

0 голосов
/ 30 апреля 2018

С французским ноутбуком мне пришлось:

  • используйте французский эквивалент Гамбурга: Гамбург ;
  • заменить eszett ( ß ) на ss ;
  • и отделить название улицы от штрассе: loc <- "Dradenau strasse 33, 21129 Hambourg"

После этих изменений звонит geocode(loc, source = "google", force = TRUE, messaging = TRUE, output = "more") вернул желаемые результаты (lon = 9.89992, lat = 53.52478 и т. д.)

Надеюсь, это поможет!

...