找到两列之间欧几里德距离最小的纬度对

时间:2018-04-12 20:05:45

标签: r location euclidean-distance

我正在尝试找到最有效的方式来解决R 中的以下难题,而必须使用嵌套 for循环(嵌套for循环将永远占用):

我们假设我们有2个数据框d_zone2stops。他们的列中有三个:latlongzone,,用于描述地图上某些点的位置,这些点分为不同的多边形。 zone中的d_zone2列全部初始化为NA。现在,我想通过规则为zone d_zone2列中的每个元素分配正确的值:对于d_zone2中的每对lat-lon,我分配{{1 zone中的元素如果lat-lon对与stops中的zone元素对应,则stops中的lat-lon对的欧几里德距离最小。

我想到的初始解决方案是根据d_zone2stops为基础,以递增顺序排列数据框lat,然后long。然后,对于lat-lon中的每对d_zone2,我可以使用嵌套 for循环遍历所有连续的lat-lon对以确定我lat-lon中的d_zone2是。{代码如下:

for(i in 1:nrow(d_zone2)){
   for(j in 1:nrow(stops)){
     if(d_zone2$Lat[i] >= stops$Lat[j] && d_zone2$Long[i] >= stops$Lat[j] && d_zone2$Lat[i]<= stops$Lat[j+1] && d_zone2$Long[i] <= stops$Lat[j+1]){
           d_zone2$X8[i] = stops$X8[j];
    }  
  }
}

但是,我意识到这是非常正确,因为d_zone2$X8[i]可能属于stops$X8[j+1](因为lat-lon可能更接近< / strong>与stops$X8[j+1]相比stops$X8[j])。因此,我认为唯一有效的方法是lat-lon中找到哪个 stops对提供最小欧几里德距离d_zone2中的一对纬度。但我不知道如何在R中执行此操作而不使用嵌套 for()循环。

第二种方法:另一种方法是利用下面zone.csv文件中存储的多边形列表。现在,解决方案是选择lat-lond_zone2中的一对stops落入的存储桶,然后只为stops$X8分配区域编号特定lat-lond_zone2中的元素。

问题:有人可以使用上面演示的 Euclidean 2nd 方法帮助我解决这个难题吗?我想使用dplyr::select(dplyr::left_join(x = d_zone2, y = stops%>% select("Lat", "Long", X8), by = ...),但我不确定如何填写by=??的真实条件

.RData file containing both data frames d_zone2 and stops. Warning: Quite large files!

Geo-polygon coordinates

1 个答案:

答案 0 :(得分:2)

这需要大约15秒,因为我们首先过滤掉重复的点。这为embedding_layer1 = Embedding(len(word_index) + 1, EMBEDDING_DIM, weights=[embedding_matrix_1], input_length=MAX_SEQUENCE_LENGTH, trainable=False) embedding_layer2 = Embedding(len(word_index) + 1, EMBEDDING_DIM, weights=[embedding_matrix_2], input_length=MAX_SEQUENCE_LENGTH, trainable=False) model.add(embedding_layer1) model.add(embedding_layer2) 留下了5457个独特点。对于它们中的每一个,我们计算到所有停靠点的距离并获得具有最小距离的停靠点的索引。之后,您可以通过停止ID将区域与所有19228939点匹配。

d_zone2