繁体   English   中英

从 1600 万+ 纬度/经度获取 FIPS 块代码

[英]Getting FIPS block codes from 16million+ lat/long

这似乎是一个常见问题,没有任何易于消化/易于实施的答案。 许多人参考FCC API ,但我不知道如何使用 API 并且没有找到一个简单的解释来帮助我解决这种情况。 R 代码我可以做,Python 我可以做(如果它很简单),但似乎应该有一些相对简单的资源来获取 .csv(或类似的)和经纬度列,并取回 FIPS 代码(在块组级别,来自 2010 年人口普查)。

潜在的解决方案(以及我与他们的问题):

  • 这个 github我相信查询旧的 FCC API ,它已退役。 无论哪种方式,当我在示例上运行它时,它会抛出错误Error in fromJSON(content, handler, default.size, depth, allowComments, : invalid JSON input 。此外,我想知道如果映射超过 1600 万个坐标会怎样
  • 这个 SO 问题在几行上效果很好,我已经在我只需要几千个查询的情况下实现了它,但是我Error in curl::curl_fetch_memory(url, handle = handle) : Timeout was reached: Send failure: Connection was reset得到了错误Error in curl::curl_fetch_memory(url, handle = handle) : Timeout was reached: Send failure: Connection was reset并且Error in call_geolocator_latlon(row["GE_LATITUDE_2010"], row["GE_LONGITUDE_2010"]) : Service Unavailable (HTTP 503) ,我认为这是由于我的数据太大。
  • 该解决方案在这里似乎并不像这将是最好的第一眼给我的,因为它涉及到下载的shapefile这似乎只是效率不高,但因为我实际上只在CA的观察它应该工作,只是当我改变它给我2010 块组地理,它打破了:
    • ca <- tidycensus::get_decennial(state = "CA", geography = "block group", variables = "B00001_001", geometry = TRUE, year = 2010)

理想情况下,我想找到/编写一个函数,该函数允许我输入我的数据框的名称以及其中包含我的纬度和经度数据的列,然后添加一个带有 FIPS 代码的列(在块组级别,来自 2010 年人口普查)或者,在某个地方我可以上传 .csv 并返回 .csv 会很棒。 或者 Python 知识非常有限的人可以轻松实现的 Python 包。 等等等等等等。

示例数据框(对于 R):

testdata <- structure(list(unique_id = c(5392085L, 14789082L, 11023930L, 4005454L, 13701322L, 10821557L, 11397828L, 15709999L, 475895L, 1546307L), GE_LATITUDE_2010 = c(38.272084, 33.013099, 39.019289, 33.992753, 32.6104, 33.717793, 34.550265, 32.842897, 33.754883, 38.461337), GE_LONGITUDE_2010 = c(-122.644619, -117.05967, -121.006352, -118.26259, -117.057227, -118.044996, -117.277502, -116.890541, -116.983093, -121.389269)), row.names = c(NA, -10L), class = "data.frame")

如果我正确理解你的问题,你有纬度和经度数据,你想要与坐标相关联的 FIPS 代码。

要使用 Python 做到这一点,您可以执行以下操作:

您的示例 df:

unique_id=['5392085L', '14789082L', '11023930L', '4005454L', '13701322L', '10821557L', 
'11397828L', '15709999L', '475895L', '1546307L']
GE_LATITUDE_2010=[38.272084, 33.013099, 39.019289, 33.992753, 32.6104, 33.717793, 
34.550265, 32.842897, 33.754883, 38.461337]
GE_LONGITUDE_2010=[-122.644619, -117.05967, -121.006352, -118.26259, -117.057227, 
-118.044996, -117.277502, -116.890541, -116.983093, -121.389269]


df=pd.DataFrame(columns=['unique_id','GE_LATITUDE_2010','GE_LONGITUDE_2010'])



def get_fips_num(df):
    df_1=df[['GE_LONGITUDE_2010','GE_LATITUDE_2010','unique_id']]
    fips_lst=[]
    unique_id=[]
    for i,e,o in df_1.itertuples(index=False):
        try:
            lo=i
            la=e
            ven=o
            link="https://geo.fcc.gov/api/census/area?lat="+str(la)+"&lon="+str(lo)+"&format=json" 


            with urllib.request.urlopen(link) as url:
                data = json.loads(url.read().decode())
            fips_lst.append(data['results'][0]['block_fips'])
            unique_id.append(ven)
        except (RuntimeError, TypeError, NameError,IndexError):
            pass
    df1=pd.DataFrame(columns=['fips','unique_id'],index=range(len(fips_lst)))
    for a in range(len(fips_lst)):
        df1.loc[a].fips = fips_lst[a]
        df1.loc[a].unique_id = unique_id[a]
    df1['fips']=df1['fips'].str[:11]

    return df1

当您在 df 上运行代码时,您应该得到以下 df:

get_fips_num(df)

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM