Соответствующие пин-коды с широтой и долготой (Индия) - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь получить соответствующие широты и долготы для определенного пин-кода для Индии.

Для пин-кода у меня есть следующий файл.

https://data.gov.in/sites/default/files/all_india_PO_list_without_APS_offices_ver2_lat_long.csv

Данные имеют 15 столбцов. Я просто показываю его часть, чтобы вы могли видеть, как выглядят эти данные.

                   officename pincode officeType Deliverystatus divisionname   regionname
 1:             Achalapur B.O  504273        B.O       Delivery     Adilabad    Hyderabad
 2:                   Ada B.O  504293        B.O       Delivery     Adilabad    Hyderabad
 3:               Adegaon B.O  504307        B.O       Delivery     Adilabad    Hyderabad
 4: Adilabad Collectorate S.O  504001        S.O   Non-Delivery     Adilabad    Hyderabad
 5:              Adilabad H.O  504001        H.O       Delivery     Adilabad    Hyderabad

Этот файл имеет несколько широтных значений, привязанных к одному пин-коду.

Для моего использования мне нужно иметь один широта для определенного пин-кода (у меня есть два адреса X и Y), а затем я использую Haversine для вычисления расстояния между X и Y

Возможные варианты для меня

  1. Возьмите среднее значение lat-long для пин-кодов, затем сопоставьте их. Рассчитайте расстояние Хаверсайна между X и Y.
  2. Попытался использовать геокод.

Я получаю эту ошибку в основном потому, что я нахожусь за офисным брандмауэром

Error in curl::curl_fetch_memory(url, handle = handle) : 
  Timeout was reached: [maps.googleapis.com] Connection timed out after 10000 milliseconds
Любой другой источник на net или любой другой способ получить отображение 1: 1 между пин-кодом и широтно-длинным

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 07 января 2020

Вот то, что я пытался для вас. Ваши данные здесь называются mydf. Сначала получите строки, которые имеют значения в longitude и latitude. Для каждой группы, определенной statename и pincode, найдите средние значения для longitude и latitude. Это создает out.

library(dplyr)
library(tidyr)
library(purrr)

filter(mydf, complete.cases(latitude) & complete.cases(longitude)) %>% 
group_by(statename, pincode) %>% 
summarize(ave_long = mean(longitude),
          ave_lat = mean(latitude)) -> foo

Следующим шагом было упорядочить foo таким образом, чтобы мы могли вычислить расстояние Хаверсайна. Я нашел хороший способ упорядочить эти данные. Смотрите ссылку ниже. Здесь мы создаем все возможные комбинации точек данных.

# Arrange this data in a way that we can calculate Haversine.
# We basically create all possible combinations of rows.
# This post gave me a hand: https://community.rstudio.com/t/create-all-possible-combinations-of-a-data-frame/26848/4

myrows <- foo %>%
          group_by_all() %>%
          group_split()

out <- t(combn(x = 1:nrow(foo), m = 2)) %>%
       as_tibble() %>%
       mutate_all(~ map(., ~ pluck(myrows, .x))) %>% 
       unnest() %>% 
       setNames(nm = c("start_state", "start_pincode",
                       "start_long", "start_lat",
                       "dest_state", "dest_pincode",
                       "dest_long", "dest_lat"))

Мы можем использовать distHaversine () или distGeo (). Но давайте попробуем что-то новое. SymbolixAU написал еще одну функцию. Спасибо, SymbolixAU!

# https://stackoverflow.com/questions/36817423/how-to-efficiently-calculate-distance-between-pair-of-coordinates-using-data-tab/42014364#42014364

dt.haversine <- function(lat_from, lon_from, lat_to, lon_to, r = 6378137){
                    radians <- pi/180
                    lat_to <- lat_to * radians
                    lat_from <- lat_from * radians
                    lon_to <- lon_to * radians
                    lon_from <- lon_from * radians
                    dLat <- (lat_to - lat_from)
                    dLon <- (lon_to - lon_from)
                    a <- (sin(dLat/2)^2) + (cos(lat_from) * cos(lat_to)) * (sin(dLon/2)^2)
                    return(2 * atan2(sqrt(a), sqrt(1 - a)) * r)
                  }

Последний шаг - расчет расстояний.

mutate(out,
       distance = dt.haversine(lon_from = start_long, lat_from = start_lat,
                               lon_to = dest_long, lat_to = dest_lat)) -> result

 # A tibble: 6,105 x 9
#   start_state start_pincode start_long start_lat dest_state dest_pincode dest_long dest_lat distance
#   <chr>               <int>      <dbl>     <dbl> <chr>             <int>     <dbl>    <dbl>    <dbl>
# 1 KARNATAKA          560001       77.6      13.0 KARNATAKA        560003      77.6     13.0    3544.
# 2 KARNATAKA          560001       77.6      13.0 KARNATAKA        560004      77.6     12.9    4554.
# 3 KARNATAKA          560001       77.6      13.0 KARNATAKA        560005      77.6     13.0    3178.
# 4 KARNATAKA          560001       77.6      13.0 KARNATAKA        560008      77.6     13.0    4844.
# 5 KARNATAKA          560001       77.6      13.0 KARNATAKA        560010      77.6     13.0    4618.
# 6 KARNATAKA          560001       77.6      13.0 KARNATAKA        560011      77.6     12.9    5510.
# 7 KARNATAKA          560001       77.6      13.0 KARNATAKA        560013      77.6     13.1    9491.
# 8 KARNATAKA          560001       77.6      13.0 KARNATAKA        560014      77.5     13.1   12047.
# 9 KARNATAKA          560001       77.6      13.0 KARNATAKA        560017      77.7     13.0    6831.
#10 KARNATAKA          560001       77.6      13.0 KARNATAKA        560021      77.6     13.0    5148.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...