首页数据库中国省市区数据库 怎么把中国的省市区数据导入sqlserver数据库

中国省市区数据库 怎么把中国的省市区数据导入sqlserver数据库

编程之家2023-10-1894次浏览

大家好,感谢邀请,今天来为大家分享一下中国省市区数据库的问题,以及和怎么把中国的省市区数据导入sqlserver数据库的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

中国省市区数据库 怎么把中国的省市区数据导入sqlserver数据库

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

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

高德开放平台Web服务API

https://lbs.amap.com/

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

在这里插入图片描述

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

中国省市区数据库 怎么把中国的省市区数据导入sqlserver数据库

在这里插入图片描述

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

在这里插入图片描述

其实就是先申请Key,然后构造Http请求,发送请求解析返回数据即可。

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

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

中国省市区数据库 怎么把中国的省市区数据导入sqlserver数据库

在这里插入图片描述

有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种基于高德地图获取全国省市区行政

关于中国的旅游城市 值得去的

1.上海(万众瞩目的魔都)

万众瞩目的“魔都”,也是老弄堂与摩登大厦并存的魅力之城。外滩沿岸百年历史的欧式建筑散发着优雅的气息,城隍庙间承载着记忆的中华园林。多元的城市元素汇聚在这里,让上海独具魅力。

2.北京(贵气与地气并存的老城)北京是一座老城,是中国历史上最后五代封建王朝建都的地方。它的贵气与地气相融,皇城的大气与市井的温暖仅咫尺之遥。故宫、天坛、景山、北海,记录了古代皇家建筑的恢弘;南锣鼓巷、什刹海、前门大街,承载了新老文化的交替;胡同里面闲庭信步,描绘着老北京生活的憧憬。

3.哈尔滨(中国的莫斯科)冬季是这里最迷人的时候,北国风光,千里冰封,万里雪飘。哈尔滨的消费水平不高,住宿快捷酒店的话一般在200元之内就能解决。吃的话,随便找一家东北餐馆,都不贵而且味道正宗。除了冰雪大世界的门票稍微贵些,中央大街是免费逛的!

4.成都(乐观的巴蜀之地)这是一座古老而又神秘的都城,它承载着三千余年的历史,从未更改城名也不曾迁移城址,平静而祥和地屹立于“天府之国”的腹地,确是一座让马可波罗都惊叹不已的“锦绣之城”。城市里的每个角落,都将其悠闲、乐观、宁静、繁华又洒脱的独有特质,渲染得淋漓尽致。也许等到你要离开的时候,才会发现成都旅游宣传语——“一座来了就不想离开的城市”绝不是自恋的夸耀。

5.杭州(古意与现代的完美交织)这座自古就被人称作“人间天堂”的杭城,西湖沿岸,城市和公园并没有绝对的界限,茂盛的植被与各色小店融为一体。这正是杭州有趣的地方,到处被大自然的绿意包围,却也没有远离城市的空旷感。繁华闹市中,武林广场的现代气息和清河坊的古意盎然相互交织,给人最真实,最值得让人回味的杭州。

6.重庆(吃货的天堂)美食、夜景、美女,是重庆的三大名片。重庆是著名的美食胜地,吃货的天堂,尤其是天下闻名的火锅,麻辣鲜香,“引无数食客竞折腰”。它的山城夜色则是最为著名的一景,不论是立于南山上,还是坐长江索道从空中俯瞰,都能欣赏到有“小香港”之称的璀璨夜色,将两江风光尽收眼底。

7.三亚位于海南岛最南端,因三亚河(古名临川水)有三亚东西2河至此会合,成“丫”字形,故取名“三亚”。三亚是一个多湾的海滨城市,19个海湾就像19颗明珠串在209公里长的海岸线上。天涯海角位于三亚西南方的天涯湾,离市区20多公里。这里青山碧水、银滩巨磊、椰树红豆,浑然一体,简直是一首韵味无究的热带海滨风情诗。

怎么把中国的省市区数据导入sqlserver数据库

把本地sql server数据库导入到服务器的方法步骤(SQL 2000为例):

首先打开本地的SQL 2000的企业管理器,然后根据数据库开通信中的地址、用户名密码,建立远程SQL注册,连上远程服务器上的数据库:

然后登录到远程数据库服务器:

1、右击准备导入数据的数据库,选择“所有任务”下的“导入数据”

2、进入DTS导入/导出向导,点击“下一步”按钮继续

3、选择数据源,输入数据源所在的数据库服务器IP、用户名、密码和要复制数据的源数据库,点击“下一步”按钮

4、选择目的,输入目的数据库所在的数据库服务器名称、用户名、密码和要复制数据的目的数据库(这个信息在用户区,数据库管理中可以看到),点击“下一步”按钮

5、选择“在SQL Server数据库之间复制对象和数据”方式,点“下一步”继续

6、注意取消安全措施选项

7、设定调度方式,一般选“立即运行”就可以,然后点“下一步”继续

8、点“完成”执行

文章分享结束,中国省市区数据库和怎么把中国的省市区数据导入sqlserver数据库的答案你都知道了吗?欢迎再次光临本站哦!

python数据库编程入门 Python主要内容学的是什么数据库案例?有关数据库的小故事