使用纬度和经度匹配密码(印度)

Posted

技术标签:

【中文标题】使用纬度和经度匹配密码(印度)【英文标题】:Matching pincodes with latitude and longitude (India) 【发布时间】:2020-04-23 20:17:11 【问题描述】:

我正在尝试获取印度特定密码的相应纬度和经度。

对于密码,我有以下文件。

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

此文件有多个经纬度映射到一个密码。

对于我的使用,我需要为特定的 pincode 设置一个 lat-long(我有两个地址 X 和 Y),然后我使用 Haversine 来计算 X 和 Y 之间的距离

对我来说可能的选择

    对 pincode 取 lat-long 的平均值,然后映射它们。计算 X 和 Y 之间的半正弦距离。 尝试使用地理编码。

我收到这个错误主要是因为我在办公室防火墙后面

Error in curl::curl_fetch_memory(url, handle = handle) : 
  Timeout was reached: [maps.googleapis.com] Connection timed out after 10000 milliseconds
    网络上的任何其他来源或任何其他方式在 pincode 和 lat-long 之间获得 1:1 映射

感谢任何帮助!

【问题讨论】:

我很难理解您想要达到的目标。据我所知,pincode 207001 有 61 个数据点。有些密码只有一个数据点。还有一件事,我在数据中看不到任何经度和纬度值。如果是这种情况,我们如何才能得到每个密码的平均长度和纬度?你能解释更多吗? 如果您对其进行过滤,某些州的值会出现。所以基本上我的问题是我有一个数据集,其中有两个地址(或两个密码,没有把样本放在这里)。我必须计算它们之间的距离。我认为最好的方法是获取这些 pincode 中的 lat 和 long ,然后在其上加上 hasrsine 距离公式。这个问题现在有意义吗? 如果您询问平均纬度是否适用于此,那应该取决于您所考虑的具体用例。你想对这些距离做什么?你对准确性的容忍度是多少? 【参考方案1】:

这是我为您尝试过的。您的数据在此处称为mydf。首先,获取在longitudelatitude 中具有值的行。对于由statenamepincode 定义的每个组,找到longitudelatitude 的平均值。这将创建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

下一步是以我们可以计算Haversine距离的方式排列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://***.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.

【讨论】:

谢谢!我想知道取平均纬度和经度是否有意义,还是有其他聚合方法? @Ravi 我不是这方面的专家。所以我没有头绪。我认为,根据您的研究问题,您想决定这是否是正确的方法。 对于我的使用,我依赖于计算距离的准确性。约 2-5 公里的距离差异是巨大的。与谷歌地图相比,距离变化很大,认为平均可以解决问题,但显然不是 @Ravi 我唯一能想到的就是使用另一个函数来计算距离。否则我不知道,我害怕。 我的问题是我没有得到准确的 lat 和 long 的 pincode。如果我明白了,haversine distance 就完美了。【参考方案2】:

基于纬度/经度的距离永远不会与谷歌距离匹配,因为后者计算路径距离,而纬度/经度值之间的任何数学公式都将是一条直线(如鸟儿飞翔)。

【讨论】:

以上是关于使用纬度和经度匹配密码(印度)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用密码作为输入查找纬度和经度列表

将经度和纬度与 R 中的国家/地区匹配

R空间:具有相同CRS的2个shapefile之间的纬度/经度不匹配

将距离(海里)转换为度(纬度/经度)

如何在Android App中检测最近的可用纬度和经度

给定两个位置,如何从谷歌地图获取所有纬度和经度