问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么在中国地理空间数据云找梅州市行政边界

发布网友 发布时间:2022-12-28 21:45

我来回答

2个回答

热心网友 时间:2023-10-24 09:46

今天我们以高德地图为例,讲解一下如何获取全国省市区行政边界数据。

高德开放平台Web服务API

https://lbs.amap.com/

依次点击开发支持–Web服务–Web服务API,即可进入到高德开放平台Web服务API页面。

在这里插入图片描述

可以发现,官方已开放了行政区域查询的接口。

在这里插入图片描述

点击查看该接口的详细介绍:

在这里插入图片描述
其实就是先申请Key,然后构造Http请求,发送请求解析返回数据即可。

同时接口文档提到,该接口只能返回国、省、市、区的polyline(边界点集合),不支持街道级别,但已经满足我们的需求了。

首先分析下接口请求参数:

在这里插入图片描述
有4点值得关注:

keywords支持行政区名称、citycode、adcode这3种格式,行政区名称可能存在重复(尤其level是县/区时),而citycode只有level在市或市以下才有,只有adcode可以唯一指定某个行政区,所以检索的时候,我们使用adcode作为keywords传入;
subdistrict可以指定子级行政区的嵌套层数;
当最外层的districts超过20个元素时,需要配合page参数来获取全部元素;
只有extensions配置为all时,接口才会返回我们需要的区域边界数据。
想要一次性采集全国省市区行政边界数据的话,第1步肯定是先设法拿到省、市、区的列表,然后逐个遍历。

我们可以设置keywords为"中华人民共和国",然后将subdistrict设置为3,下3层(省、市、区)的子行政区信息就会返回。

这样,我们发送1次请求就可以拿到省、市、区的列表了。

接着,我们将subdistrict调整为1(减少数据冗余),依次遍历各个行政区域即可。

实现代码如下:

# -*- coding:utf-8 -*-

import requests
import time
import mongo_util #自行封装的操作mongodb的工具类

def get_district_info(key, col, time_delay, headers={}):
request_url = 'https://restapi.amap.com/v3/config/district'
country_name = '中华人民共和国'
params = {
'subdistrict':'3',
'extensions':'all',
'key':key,
'output':'json',
'keywords':country_name,
}
# 设置subdistrict为3,1次请求获取到国、省、市、区的信息
country_res = requests.get(url=request_url, headers=headers, params=params).json()
if country_res['status'] != "1":
print("调用高德地图Web API失败!")
return
country = country_res['districts'][0]
col.insert_one(country)
print(f'{country_name}数据插入成功!')
params['subdistrict'] = '1'
# 遍历省
provinces = country['districts']
for province in provinces:
province_name = province['name']
params['keywords'] = province['adcode']
prov_res = requests.get(url=request_url, headers=headers, params=params).json()
if prov_res['status'] == "0":
print(f'{country_name}-{province_name}数据获取失败!')
continue
col.insert_one(prov_res['districts'][0])
print(f'{country_name}-{province_name}数据插入成功!')
time.sleep(time_delay)
# 遍历市
cities = province['districts']
if len(cities) == 0:
continue
for city in cities:
city_name = city['name']
params['keywords'] = city['adcode']
city_res = requests.get(url=request_url, headers=headers, params=params).json()
if city_res['status'] == "0":
print(f'{country_name}-{province_name}-{city_name}数据获取失败!')
continue
col.insert_one(city_res['districts'][0])
print(f'{country_name}-{province_name}-{city_name}数据插入成功!')
time.sleep(time_delay)
# 遍历区
districts = city['districts']
if len(districts) == 0:
continue
for district in districts:
distinct_name = district['name']
params['keywords'] = district['adcode']
distinct_res = requests.get(url=request_url, headers=headers, params=params).json()
if distinct_res['status'] == "0":
print(f'{country_name}-{province_name}-{city_name}-{distinct_name}数据获取失败!')
continue
col.insert_one(distinct_res['districts'][0])
print(f'{country_name}-{province_name}-{city_name}-{distinct_name}数据插入成功!')
time.sleep(time_delay)
# 主函数
if __name__ == '__main__':
key = "******"
# 接口请求之间的间隔
time_delay = 0.01
db_name = 'web_map'
col_name = 'distinct'
# MongoDB数据库所在的服务器
host = '******'
port = 27017
# 获取mongodb的表句柄
col = mongo_util.get_col(db_name, col_name, host, port)
# 获取全国各级行政区的数据
get_district_info(key, col, time_delay)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
因为接口返回的是JSON类型的嵌套数据,所以这里选择MongoDB作为存储组件。

为了防止爬取过程中,进程宕掉导致已请求的数据丢失,可以拿到1条数据就入库1条数据。

避免数据全都在内存中,执行批量插入的过程中异常退出,又得重复请求,但每个账号的天请求次数是有*的。

同时,各个接口均有QPS阈值,所以我们通过time_delay参数来控制数据采集的频率。

但是高德开方平台Web服务API有天调用次数的*,如果想获取大量数据,可能需要多个账号或者分多天进行请求,有没有更好的方法呢?

带着这样的疑问,我又看了看高德地图其他的API版块。

JS API

浏览高德开放平台的JS API示例,里面也有个行政区边界查询的Demo。

https://lbs.amap.com/demo/jsapi-v2/example/district-search/draw-district-boundaries

在这里插入图片描述

打开浏览器的"开发者工具",我们抓包一下哪个请求是用来获取行政区域数据的。

在这里插入图片描述

在这里插入图片描述
哈哈哈,其实跟开放的Web API接口地址是一致的,而且通过分析接口请求,我们直接可以拿到key。

也就是说,不需要用自己高德账号里生成的key值了。

使用这个key构建接口请求,悲伤的发现,接口返回异常。

在这里插入图片描述
说明该接口其实还是跟开放的Web API接口还是有区别的,一般体现在请求参数和Headers上。

我们把浏览器抓取到的请求参数和Headers配置原封不动的拷贝过来,再次构建接口请求,此时接口正常返回。

但请求参数里的csid是个啥东西,而且不同行政区域请求里的csid还不同。

在这里插入图片描述
尝试着去掉该参数,然后构建接口请求,发现接口仍然可以正常返回,说明该参数是可选参数,而且不是检索字段。

按照这个思路,我们逐步尝试去掉其他请求参数和Headers里的配置。

发现该接口与开放的Web API接口相比,本质仅有2点不同:

请求参数
请求参数需要额外指定: s=rsv3

Headers
需要添加如下Headers:

在这里插入图片描述
调整原来的代码:

在params里增加s配置
params = {
'subdistrict':'3',
'extensions':'all',
'key':key,
'output':'json',
'keywords':country_name,
's':'rsv3' # 该项配置是关键配置
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
在发送请求的时候传入headers
headers = {
'Host': 'restapi.amap.com',
'Referer': 'https://lbs.amap.com/'
}
# 获取mongodb的表句柄
col = mongo_util.get_col(db_name, col_name, host, port)
# 获取全国各级行政区的数据
get_district_info(key, col, time_delay, headers)
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
该种方法的优点是绕开了第1种方法的日调用次数*(高德是否有额外的反爬策略,待验证)。

AMAP Service

其实前面headrs的Referer配置就提醒我了,是不是高德地图在https://lbs.amap.com/这个地址下也有功能相同的接口。

所以就在高德平台上随意点了点,逛了逛,还真就发现了,哈哈哈。

在这里插入图片描述
与上面两个接口不同的是,这个接口是POST请求,而且竟然不需要指定key,这也太爽了吧,哈哈哈。

接着看一下请求参数:

在这里插入图片描述
参数和开放平台Web服务API的完全一致。

最后看一下表单数据:

在这里插入图片描述

显然表单数据是用来配置请求哪个接口的,这里的config/district代表的就是行政区域查询。

代码调整起来也不难:

# 调整请求的url
request_url = 'https://lbs.amap.com/service/api/restapi'
# 将所有的请求调整为POST,并传入表单数据,例如:
body = {
"type": "config/district",
"version": "v3"
}
country_res = requests.post(url=request_url, params=params, data=body).json()
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
该接口跟第2种接口相比,更近一步,连key值都省略了。

总结

本文介绍了3种基于高德地图获取全国省市区行政

热心网友 时间:2023-10-24 09:47

中国地理空间数据云是一个提供全国范围内地理空间数据的平台,您可以在该平台上找到梅州市的行政边界数据。以下是一般的操作步骤:1. 打开中国地理空间数据云的官网(www.gscloud.cn)。2. 在搜索框中输入"梅州市行政边界",点击搜索按钮。3. 在搜索结果中找到梅州市的行政边界数据,并点击进入详情页面。4. 在详情页面中,您可以查看梅州市行政边界的相关信息,如地理坐标、边界范围等。5. 如果您需要下载该数据,可以根据平台提供的下载方式进行操作。八爪鱼采集器是一款功能强大的网页数据采集器,可以帮助您快速采集各类网页上的数据。如果您需要采集中国地理空间数据云上的数据,可以使用八爪鱼采集器来进行数据采集和处理。了解更多八爪鱼采集器的功能与合作案例,请前往官网了解更多详情。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
RDL是什么意思 报税软件是什么意思 某公司的财务报表管理软件属于 报表系统指的是什么? 怎么玩真三最好?我是新手选什么英雄最好? 真三新手玩什么英雄好? 最近玩魔兽真三,想请问一下高手,初期用什么英雄最好,新手攻略 新手玩真三选什么英雄好啊 ...离泡还有一段距离的地方好几片红,红的地方又疼又痒的,怎么办... 眼角出了好多小水疱.医生说是疱疹.怎么办 鸥姐好:请问电瓶并接超级电容的安全性,对车辆的益处及损害。 Auto CAD图纸双击修改提示增强属性编辑器如何解决? 梦见自己和喜欢的人结婚是什么意思? 咋做葱油拌面 酷狗要咋传歌到另一个手机 视频属于非语言沟通吗 老婆分开了跑去和前男朋友在一起为什么用我相片做头像? CAD怎样修改BT标注字母大小 电视可以下载抖音软件吗 电脑运行一段时间后画面会忽然变得很卡 360浏览器怎么设置不能玩网页游戏? pr2019解释素材没有色彩空间 解释素材和代理不能同时使用 pr解释素材中色彩管理为灰色 快手极速版怎么关闭语音验证码 美的空调开机只有制热不出风怎么回事? 你好,6p微信怎么能视频美颜。 我的苹果6p微信拍照快捷键使用不了是怎么回事,哪位大神可以帮帮忙 区公安分局为什么要给区里服务? 寻找客户的12种方法有哪些 面包可以放在微波炉里面加热么 面包可不可以放在微波炉里面加热 黄豆芽发了小芽能吃吗 黄豆芽发了小芽可以吃吗 qq音乐怎样换登录 天津市教育云服务平台怎么退出登录 生完孩子后是平胸可以做假体隆胸吗? 华为荣耀4C在微博中保存的照片在哪里可以找到 蒸排骨的时候放点柠檬汁有什么好处 微博如何保存原图? 我领了一个机打发票的u盘怎么弄 税控机怎么使用 发票领回来怎么使用 缩小毛孔的有效方法有哪些 婚房装饰看过来 婚房装饰品大全推荐 Sticker详细资料大全 盲盒是哪里出的 天蛾人的生物外形 奇葩怪物!揭秘人类历史上流传的30大神秘怪兽 为什么挂了登陆e站显示sad panda ? python测试Android手机应用 掌握家居饰品六大布置技巧(组图)