首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ArcGIS要素图层保存数据

从ArcGIS要素图层保存数据
EN

Stack Overflow用户
提问于 2020-07-24 00:13:54
回答 1查看 533关注 0票数 0

我一直在分析每天从ArcGIS地图(链接如下)中的要素图层手动收集的数据。我想自动化这个过程,并一直在寻找使用RESTful应用程序接口(或其他东西)来收集此信息的方法。

任务是将这个表(下面的屏幕截图)保存为我可以操作的python数据帧。

我尝试使用GET语句和id键的组合,但我不熟悉API和web抓取。

这项任务可行吗?它的实现是否相当简单?对于Python中级但不熟悉web抓取的人来说,应该从哪里开始呢?

谢谢!

链接:http://erieny.maps.arcgis.com/apps/opsdashboard/index.html#/dd7f1c0c352e4192ab162a1dfadc58e1

screenshot of website with desired information in yellow square

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-24 01:37:32

这个网站几乎完全是用javascript创建的。也就是说,可以获得您想要的信息,因为它使用HTTP请求从API生成数据。找到API并发出它所需的特定请求,您就可以从中获取信息。

为此,我们需要使用chrome tools的网络选项卡。然后搜索一些我们知道应该在数据中的东西。我尝试了'14001‘,因为我知道它必须在数据范围内。

所以你可以在这里看到我们已经搜索了正确的数据。向下滚动网络工具的XHR部分,您可以看到请求URL和所有参数。

现在,为了方便起见,您应该将请求复制为卷曲(BASH)。您可以将其复制到curl.trillworks.com,这将使用requests库将该请求转换为python。

也就是说,现在使用头部和正确的参数来获取正确的数据非常容易。

代码示例

代码语言:javascript
复制
import requests
import pandas as pd

headers = {
    'Referer': 'http://erieny.maps.arcgis.com/apps/opsdashboard/index.html',
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36',
}

params = (
    ('f', 'json'),
    ('where', '1=1'),
    ('returnGeometry', 'false'),
    ('spatialRel', 'esriSpatialRelIntersects'),
    ('outFields', '*'),
    ('orderByFields', 'ZIP_CODE asc'),
    ('resultOffset', '0'),
    ('resultRecordCount', '80'),
    ('resultType', 'standard'),
    ('cacheHint', 'true'),
)

response = requests.get('https://services1.arcgis.com/CgOSc11uky3egK6O/arcgis/rest/services/erie_zip_codes_confirmed_counts/FeatureServer/0/query', headers=headers, params=params)


data = response.json()['features']
lists = []
for a in data:
    zipcode = a['attributes']['ZIP_CODE']
    confirmed =a['attributes']['CONFIRMED']
    lists.append((zipcode,confirmed))

df = pd.DataFrame(lists,columns=['Zip Code','Confirmed Cases'])

列表的输出

代码语言:javascript
复制
[('14001', 39),
 ('14004', 70),
 ('14006', 30),
 ('14013', 0),
 ('14025', 11),
 ('14026', 4),
 ('14030', 2),
 ('14031', 84),
 ('14032', 48),
 ('14033', 3),
 ('14034', 1),....]

DataFrame的输出

代码语言:javascript
复制
    Zip Code    Confirmed Cases
0   14001            39
1   14004            70
2   14006            30
3   14013             0
4   14025            11
...  ...            ...

61  14225           257
62  14226           187
63  14227           260
64  14228           128
65  14260            0

解释

我们正在导入requests库,它可以轻松地处理HTTP请求。

requests.get()方法处理我们提供的网址,并返回响应。在本例中,响应是JSON对象格式。在参数中,我们可以指定我们想要发出请求的头和参数。

因此,我们使用正确的参数和头来发出请求,事实证明,给出头和参数是绝对必要的。您可以对此进行测试,实际上,我经常只发出一个简单的GET HTTP请求,而没有任何数据,以查看它是否易于模仿。在这种情况下,您需要同时使用params和header。

response.json()方法将JSON对象转换为python字典。

现在需要一点时间才能得到你想要的信息,所以我鼓励你尝试一下。

事实证明,所需的信息都在response.json()['features']中。这里面有一个字典列表。所以我们必须循环遍历这个。所以a指的是恰好是一个字典的每个列表项。然后我们去寻找特定的键,这些键可以让我们找到值。在这种情况下,在属性键中,然后在邮政编码键中,我们可以获得邮政编码,属性键中也有确认键,我们可以访问确认值。我再次强烈建议您使用json对象转换字典来体验一下这一点。

在这里,我将变量zipcode和confirmed添加到一个列表的元组中。然后,您可以在熊猫中使用它,如上图所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63058671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档