[英]Getting FIPS block codes from 16million+ lat/long
这似乎是一个常见问题,没有任何易于消化/易于实施的答案。 许多人参考FCC API ,但我不知道如何使用 API 并且没有找到一个简单的解释来帮助我解决这种情况。 R 代码我可以做,Python 我可以做(如果它很简单),但似乎应该有一些相对简单的资源来获取 .csv(或类似的)和经纬度列,并取回 FIPS 代码(在块组级别,来自 2010 年人口普查)。
潜在的解决方案(以及我与他们的问题):
Error in fromJSON(content, handler, default.size, depth, allowComments, : invalid JSON input
。此外,我想知道如果映射超过 1600 万个坐标会怎样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)
,我认为这是由于我的数据太大。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.