我该如何进行地理定位1,100,000行坐标信息?

时间:2016-08-08 00:48:30

标签: python pandas geolocation google-geocoder

好的,所以我试图为此设想一个解决方案。我有一个包含超过一百万行的数据库,其中包括美国的城市名称和该城市的一组坐标。问题在于,有多个同名的城市:斯普林菲尔德,新泽西州和斯普林菲尔德,马萨诸塞州。所以我需要获取州信息。

数据中也有重复项。只有大约6500套独特的坐标,可以想象,我可以找到它们然后将它们分配给数据库中的其他条目。这是一个可行的计划吗?我该怎么做呢?

以下是此数据库中哪些条目的示例:

Y

我使用geocoder包进行地理定位。以下是我编写的一些可以处理的代码:

2015-09-01 00:00:00,Buffalo,"42.9405299,-78.8697906",10.1016/s0894-7317(12)00840-1,42.9405299,-78.8697906,43.0,-79.0
2015-09-01 00:00:00,New York,"40.7830603,-73.9712488",10.1016/j.jmv.2014.04.008,40.783060299999995,-73.9712488,41.0,-74.0
2015-09-01 00:00:04,Scottsdale,"33.4941704,-111.9260519",10.1016/j.euroneuro.2014.05.008,33.494170399999994,-111.9260519,33.0,-112.0
2015-09-01 00:00:09,Provo,"40.2338438,-111.6585337",10.1016/j.toxac.2014.07.002,40.233843799999995,-111.6585337,40.0,-112.0
2015-09-01 00:00:13,New York,"40.7830603,-73.9712488",10.1016/j.drugalcdep.2014.09.015,40.783060299999995,-73.9712488,41.0,-74.0
2015-09-01 00:00:16,Fremont,"37.5482697,-121.9885719",10.1016/j.ajic.2012.04.160,37.548269700000006,-121.98857190000001,38.0,-122.0
2015-09-01 00:00:24,Provo,"40.2338438,-111.6585337",10.1016/j.chroma.2015.01.036,40.233843799999995,-111.6585337,40.0,-112.0

我不知道该怎么做。结果发现地理编码相当昂贵,因此使用重复数据可能是最好的方法。有关如何实现这一目标的任何建议吗?

3 个答案:

答案 0 :(得分:3)

几乎可以肯定,避免做额外工作的最佳方法是使用哈希表来检查是否有某些映射:

processed_coords = {}
def convert_to_state(lati, long):
    lat, lon = float(lati), float(long)
    if (lat, lon) not in processed_coords:
        g = geocoder.google([lat, lon], method='reverse')
        state_long, state_short = g.state_long, g.state
        processed_coords[(lat,lon)] = (state_long, state_short)
        return state_long, state_short
    else:
        return processed_coords[(lat,lon)]

通过这种方式,您可以进行简单的O(1)检查,看看您是否已经拥有数据,根本不需要额外的计算,如果您确实已经完成了计算,那么您就不会重做工作做完了。

如果你是对的,那里只有6500套独特的坐标,你应该在这种技术的内存使用方面做得很好,但如果你错了,还有更多独特的坐标如果有更多的东西是独一无二的,你可能会遇到一些记忆问题。

答案 1 :(得分:2)

我喜欢哈希表的想法,但这里有一个使用一些熊猫的替代方法:

1)获得(lat,lon)坐标的唯一列表

downVote(eve){

      this.totalVote = this.totalVote - 1;
      if(this.ristricted === this.totalVote){
              this.totalVote = this.totalVote - 1;
      }else {

       }
  }

2)循环通过唯一的坐标并设置所有等效线的状态

df['latlon'] = [(x,y) for x,y in zip(df['lati'].tolist(),df['long'].tolist())]
unique_ll = df['latlon'].unique()

答案 2 :(得分:1)

有一个地理信息服务SmartyStreets,它有一个列表工具,可以处理搜索列表并返回一堆信息(可以上传电子表格或复制和粘贴)。他们专注于地址验证,因此他们希望搜索词是地址,但是,它只能匹配邮政编码到城市和州。你有权访问这些信息吗?

这里是link to the demo