如何找到每个房子最近的地铁站

时间:2017-04-12 02:27:00

标签: python r location

我在NewYorkCity有一个巨大的数据集A,每个房子/经度的纬度和经度。 还有纽约市每个地铁站/入口的纬度和经度数据集B.

对于每个房子,我想确定最近的地铁站和到那个车站的距离。 问题是我有成千上万的房子和数百个地铁站。如果我要计算每个房屋的距离,那就浪费时间了。 识别最近的一种方法的最快方法是什么? R或Python中的任何包可以帮助我快速完成吗?

3 个答案:

答案 0 :(得分:1)

如果每一行代表一个家,每列代表一个工作站,你可以简单地计算距离矩阵并找到每一行的最小值。

$array = array( array( array( 'code'=>'AA', 'name'=>'A Name', 'cost'=>'10', ), array( 'code'=>'AB', 'name'=>'B Name', 'cost'=>'15', ), ), array( array( 'code'=>'AA', 'name'=>'A Name', 'cost'=>'15', ), array( 'code'=>'AB', 'name'=>'B Name', 'cost'=>'10', ), array( 'code'=>'AC', 'name'=>'C Name', 'cost'=>'10', ), ), array( array( 'code'=>'AA', 'name'=>'A Name', 'cost'=>'5', ), array( 'code'=>'AB', 'name'=>'B Name', 'cost'=>'10', ), array( 'code'=>'AC', 'name'=>'C Name', 'cost'=>'15', ), ), ); $the_biggest_number=count($array); $new_array = array(); foreach ($array as $key => $val) { foreach ($val as $sub_key => $sub_val) { if(!isset($new_array[$sub_val['code']])){ $sub_val['count']=1; $new_array[$sub_val['code']]=$sub_val; } else{ $new_array[$sub_val['code']]['cost'] += $sub_val['cost']; $new_array[$sub_val['code']]['count'] += 1; } } } $result=array(); foreach ($new_array as $key => $val) { if($val['count']==$the_biggest_number){ unset($val['count']); $result[]=$val; } } $result= array($result); echo '<pre>'; print_r($result); 包在这里很有用,因为它会根据坐标计算距离

你会注意到我把经度放在第一位,距离函数geosphere就这样命令。

read about the package here。我只是按照示例的说明进行操作。

示例:

distHaversine

答案 1 :(得分:0)

我可能会尝试使用四叉树。

R和python都有实现:

  • R:SearchTrees
  • Python:pyqtree

答案 2 :(得分:0)

  

如果我要计算每个房屋的距离,那就是时间   浪费。

并不是真正的计算机用途。我无法想象在共同的桌面上花费数小时。

这是未经测试的,请考虑伪代码:

# distance between points is sqrt((x1-x2)^2 + (y1-y2)^2)

houses = [[32,54],[3,2],[15,16]]
subways = [[123,2],[54,3],[56,6],[54,32],[1,65],[43,1],[13,16],[21,6],[5,1]]

distances = []
for i in range(len(houses)):
      distances.append([])
      for j in range(len(subways)):
          delta_x = house[i][0]-subway[j][0]
          delta_y = house[i][1]-subway[j][1]
          distance = (delta_x**2 + delta_y**2)**(0.5)
          distances[i].append(distance)
      min_idx = distances.index(min(distances))

      print 'closest subway to house number %s at %s is subway number %s at %s' (
          i, house[i], min_idx, subways[min_idx])

我想要5万个房子和500个地铁,你可以在一小时内找到答案。