一、数据来源

阿里云提供了数据下载接口,我们可以在下面这个网站下载到各级别行政区划geojson格式的数据,精确到县级。
地址
在这里插入图片描述

二、数据分析

由上图,我们可以看到:

地名:”武汉市“ adcode:“420100

发现这个代码其实就是行政区划代码,网上随处可见

JSON API:https://geo.datav.aliyun.com/areas_v2/bound/420100.json
JSON API( 包含子区域):https://geo.datav.aliyun.com/areas_v2/bound/420100_full.json

稍微了解”爬虫“的朋友估计已经知道怎么下载“县级行政区划数据”了。如下:
如果我们用“JSON API(包含子区域)”这个接口,我们只需要知道全国地市级的行政区划代码就可以利用python实现批量下载了。
如果找不到地市级的行政区划代码的,可以去我的这篇文章找一下。这里有高德城市编码表,把县级行政区划筛选剔除就行了(找一下规律)。像下图这样:
在这里插入图片描述

三、批量下载代码

下载还是遵循爬虫思路,非常简单。这里还需要遍历excel表格,获取”地名“和“adcode”,生成url和保存名称。具体如下:

#author 张俊杰@Nick
import json
import requests
import xlrd
import xlwt


# 获取所有数据json文件
def download_Json(url, name):
    print("-----------正在下载json文件 %s" % (url))
    try:
        # 将响应信息进行json格式化
        response = requests.get(url)
        versionInfo = response.text
        versionInfoPython = json.loads(versionInfo)


        # print(versionInfo)
        path = "E:\\python\\geojson数据\\市级geojson数据\\" + str(name) + ".json"#修改一下路径
        
        # 将json格式化的数据保存
        with open(path, 'w', encoding='utf-8') as f1:

            f1.write(json.dumps(versionInfoPython, indent=4))

        print("下载成功,文件保存位置:" + path)
    except Exception as ex:
        print("--------下载出错----")
        pass


# 获取对应数据的json文件

for i in range(353):
	workbook=xlrd.open_workbook(r'E:\\python\\geojson数据\\CITYCODE.xlsx')#修改一下路径
	sheet1=workbook.sheet_by_name('Sheet1')
	nrows=sheet1.nrows
	ncols=sheet1.ncols
	#print(nrows,ncols)
	cell_A=sheet1.cell(i,0).value
	cell_B=int(sheet1.cell(i,1).value)
	#print(cell_B)
	url = 'https://geo.datav.aliyun.com/areas_v2/bound/'+str(cell_B)+'_full.json'#输入json地址
	download_Json(url, cell_A)#第一个参数是json文件的地址,第二个参数是文件保存的名称,
	print(i+1)
a=i+1
print("中国共计333个地市级行政区,加上4个直辖市、2个特别行政区和14个省属直辖,共计数据"+str(a)+"个")

下载过程:在这里插入图片描述
下载结果(353个):在这里插入图片描述

四、批量转格式(geojson→shapefile)

下载了geojson数据后,我们需要将其转为shapefile格式,以便在arcgis中展示。
代码如下:

#coding:utf-8
import geopandas
import matplotlib.pyplot as plt


def saveShapefile(file_path, output_shapefile_name):
    try:
        data = geopandas.read_file('E:\\python\\geojson数据\\市级geojson数据\\' + str(file_path) )#修改一下路径
        #ax = data.plot()
        #plt.show() # 显示生成的地图
        localPath = 'E:\\python\\geojson数据\\市级shpfile数据\\' + str(output_shapefile_name)#修改一下路径
        data.to_file(localPath, driver='ESRI Shapefile', encoding='utf-8')
        print("--保存成功,文件存放位置:"+localPath)
    except Exception as ex:
        print("--------JSON文件不存在,请检查后重试!----")
        pass

#第一个参数是输入爬取GeoJSON的名称,
# 第二个参数是输出shapfile的名称(默认投影为wgs1984)
a=0
#获得这个数组,用到了os.walk进行遍历
array = ['七台河市.json', '三亚市.json', '三明市.json', '三沙市.json', '三门峡市.json', '上海市.json', '上饶市.json', '东莞市.json', '东营市.json', '中卫市.json', '中山市.json', '临夏回族自治州.json', '临汾市.json', '临沂市.json', '临沧市.json', '丹东市.json', '丽水市.json', '丽江市.json', '乌兰察布市.json', '乌海市.json', '乌鲁木齐市.json', '乐山市.json', '九江市.json', '云浮市.json', '五家渠市.json', '亳州市.json', '仙桃市.json', '伊春市.json', '伊犁哈萨克自治州.json', '佛山市.json', '佳木斯市.json', '保定市.json', '保山市.json', '信阳市.json', '儋州市.json', '克孜勒苏柯尔克孜自治州.json', '克拉玛依市.json', '六安市.json', '六盘水市.json', '兰州市.json', '兴安盟.json', '内江市.json', '凉山彝族自治州.json', '包头市.json', '北京市.json', '北屯市.json', '北海市.json', '十堰市.json', '南京市.json', '南充市.json', '南宁市.json', '南平市.json', '南昌市.json', '南通市.json', '南阳市.json', '博尔塔拉蒙古自治州.json', '厦门市.json', '双河市.json', '双鸭山市.json', '可克达拉市.json', '台州市.json', '合肥市.json', '吉安市.json', '吉林市.json', '吐鲁番市.json', '吕梁市.json', '吴忠市.json', '周口市.json', '呼伦贝尔市.json', '呼和浩特市.json', '和田地区.json', '咸宁市.json', '咸阳市.json', '哈密市.json', '哈尔滨市.json', '唐山市.json', '商丘市.json', '商洛市.json', '喀什地区.json', '嘉兴市.json', '嘉峪关市.json', '四平市.json', '固原市.json', '图木舒克市.json', '塔城地区.json', '大兴安岭地区.json', '大同市.json', '大庆市.json', '大理白族自治州.json', '大连市.json', '天水市.json', '天津市.json', '天门市.json', '太原市.json', '威海市.json', '娄底市.json', '孝感市.json', '宁德市.json', '宁波市.json', '安庆市.json', '安康市.json', '安阳市.json', '安顺市.json', '定西市.json', '宜宾市.json', '宜昌市.json', '宜春市.json', '宝鸡市.json', '宣城市.json', '宿州市.json', '宿迁市.json', '山南市.json', '岳阳市.json', '崇左市.json', '巴中市.json', '巴彦淖尔市.json', '巴音郭楞蒙古自治州.json', '常州市.json', '常德市.json', '平凉市.json', '平顶山市.json', '广元市.json', '广安市.json', '广州市.json', '庆阳市.json', '廊坊市.json', '延安市.json', '延边朝鲜族自治州.json', '开封市.json', '张家口市.json', '张家界市.json', '张掖市.json', '徐州市.json', '德宏傣族景颇族自治州.json', '德州市.json', '德阳市.json', '忻州市.json', '怀化市.json', '怒江傈僳族自治州.json', '恩施土家族苗族自治州.json', '惠州市.json', '成都市.json', '扬州市.json', '承德市.json', '抚州市.json', '抚顺市.json', '拉萨市.json', '揭阳市.json', '攀枝花市.json', '文山壮族苗族自治州.json', '新乡市.json', '新余市.json', '无锡市.json', '日喀则市.json', '日照市.json', '昆明市.json', '昆玉市.json', '昌吉回族自治州.json', '昌都市.json', '昭通市.json', '晋中市.json', '晋城市.json', '普洱市.json', '景德镇市.json', '曲靖市.json', '朔州市.json', '朝阳市.json', '本溪市.json', '来宾市.json', '杭州市.json', '松原市.json', '林芝市.json', '果洛藏族自治州.json', '枣庄市.json', '柳州市.json', '株洲市.json', '桂林市.json', '梅州市.json', '梧州市.json', '楚雄彝族自治州.json', '榆林市.json', '武威市.json', '武汉市.json', '毕节市.json', '永州市.json', '汉中市.json', '汕头市.json', '汕尾市.json', '江门市.json', '池州市.json', '沈阳市.json', '沧州市.json', '河池市.json', '河源市.json', '泉州市.json', '泰安市.json', '泰州市.json', '泸州市.json', '洛阳市.json', '济南市.json', '济宁市.json', '济源市.json', '海东市.json', '海北藏族自治州.json', '海南藏族自治州.json', '海口市.json', '海西蒙古族藏族自治州.json', '淄博市.json', '淮北市.json', '淮南市.json', '淮安市.json', '深圳市.json', '清远市.json', '温州市.json', '渭南市.json', '湖州市.json', '湘潭市.json', '湘西土家族苗族自治州.json', '湛江市.json', '滁州市.json', '滨州市.json', '漯河市.json', '漳州市.json', '潍坊市.json', '潜江市.json', '潮州市.json', '澳门特别行政区.json', '濮阳市.json', '烟台市.json', '焦作市.json', '牡丹江市.json', '玉林市.json', '玉树藏族自治州.json', '玉溪市.json', '珠海市.json', '甘南藏族自治州.json', '甘孜藏族自治州.json', '白城市.json', '白山市.json', '白银市.json', '百色市.json', '益阳市.json', '盐城市.json', '盘锦市.json', '眉山市.json', '石嘴山市.json', '石家庄市.json', '石河子市.json', '神农架林区.json', '福州市.json', '秦皇岛市.json', '红河哈尼族彝族自治州.json', '绍兴市.json', '绥化市.json', '绵阳市.json', '聊城市.json', '肇庆市.json', '自贡市.json', '舟山市.json', '芜湖市.json', '苏州市.json', '茂名市.json', '荆州市.json', '荆门市.json', '莆田市.json', '菏泽市.json', '萍乡市.json', '营口市.json', '葫芦岛市.json', '蚌埠市.json', '衡水市.json', '衡阳市.json', '衢州市.json', '襄阳市.json', '西双版纳傣族自治州.json', '西宁市.json', '西安市.json', '许昌市.json', '贵港市.json', '贵阳市.json', '贺州市.json', '资阳市.json', '赣州市.json', '赤峰市.json', '辽源市.json', '辽阳市.json', '达州市.json', '运城市.json', '连云港市.json', '迪庆藏族自治州.json', '通化市.json', '通辽市.json', '遂宁市.json', '遵义市.json', '邢台市.json', '那曲市.json', '邯郸市.json', '邵阳市.json', '郑州市.json', '郴州市.json', '鄂尔多斯市.json', '鄂州市.json', '酒泉市.json', '重庆市.json', '金华市.json', '金昌市.json', '钦州市.json', '铁岭市.json', '铁门关市.json', '铜仁市.json', '铜川市.json', '铜陵市.json', '银川市.json', '锡林郭勒盟.json', '锦州市.json', '镇江市.json', '长春市.json', '长沙市.json', '长治市.json', '阜新市.json', '阜阳市.json', '防城港市.json', '阳江市.json', '阳泉市.json', '阿克苏地区.json', '阿勒泰地区.json', '阿坝藏族羌族自治州.json', '阿拉善盟.json', '阿拉尔市.json', '阿里地区.json', '陇南市.json', '随州市.json', '雅安市.json', '青岛市.json', '鞍山市.json', '韶关市.json', '香港特别行政区.json', '马鞍山市.json', '驻马店市.json', '鸡西市.json', '鹤壁市.json', '鹤岗市.json', '鹰潭市.json', '黄冈市.json', '黄南藏族自治州.json', '黄山市.json', '黄石市.json', '黑河市.json', '黔东南苗族侗族自治州.json', '黔南布依族苗族自治州.json', '黔西南布依族苗族自治州.json', '齐齐哈尔市.json', '龙岩市.json']
for i in array:
    saveShapefile(i, i+'矢量')
    a+=1
print(a)

运行结果:在这里插入图片描述
在上述代码块中,出现了一个数组,这个数组的元素是353个geojson数据的名称(含扩展名),它是如何获取的呢?很明显不是一个一个敲的。具体实现途径如下:
我们把353个geojson数据放在了一个文件夹中,于是我们可以通过python的os.walk进行遍历获取这一数组,代码如下:

import os

path="E:\\python\\geojson数据\\市级geojson数据"#修改一下路径
#得到所有的子文件名称(连后缀)
for i in os.walk(path):
	print(i)

运行结果如下:在这里插入图片描述
只需要把这个数组复制下来就行了。
shapefile文件批量生成后,是这样的:
在这里插入图片描述

五、导入arcgis

这样的文件形式,很难批量导入arcgis中进行展示,所以我们需要把这些文件夹的内容提取出来,全部放在一个文件夹中:
在这个文件夹中新建一个文件夹“all”和一个批处理文件“all.bat”(新建一个txt文件,把后缀改成.bat)。
all.bat的内容如下:

for /f "delims=" %%p in ('dir /b/ad') do copy %%p\*.* E:\python\geojson数据\市级shpfile数据\all\
pause

注意:记得修改路径。
双击all.bat,所有shapefile文件就都在all文件夹了,效果如下(353X5个文件):在这里插入图片描述
导入arcgis:在这里插入图片描述
选中第一个,shift,选中最后一个,添加:在这里插入图片描述

六、后记

这篇文章主要分享了爬虫、数据格式转化和windows的一些批处理操作,很大程度上基于python的第三方库,特别是geopandas。数据的庞大和有序化,使python更加有了用武之地,我们使用python实现的批量处理操作会使工作变得越来越便捷,工作量越来越少,未来会有更多的工作内容会被这样的工具替代掉。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐