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



这似乎是一个常见的问题,没有任何易于消化/易于实现的答案。许多人引用了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 resetError 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()

df['unique_id'] = unique_id
df['GE_LATITUDE_2010'] = GE_LATITUDE_2010
df['GE_LONGITUDE_2010'] = GE_LONGITUDE_2010
df

import urllib, json, requests
import pandas as pd
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={0}&lon={1}&format=json'.format(la,lo)
reponse_1 = requests.get(link).json()
x=reponse_1['results'][0]['block_fips']
#print(x)
if len(x) != 0:
fips_lst.append(x)
unique_id.append(o)
except Exception as error:
print("error type: /" +str(error))
df_result = pd.DataFrame()
df_result['unique_id'] =unique_id
df_result['fips'] = fips_lst 
return df_result

df_1=df[['GE_LONGITUDE_2010','GE_LATITUDE_2010','unique_id']]
when you run the code on your df you should get the below df:
get_fips_num(df)
[enter image description here][1]

[1]: https://i.stack.imgur.com/dERnA.png

最新更新