批量下載全國縣級行政區劃geojson格式數據,將下載的geojson數據批量轉爲shapefile格式,在arcgis中可視化

一、數據來源

阿里雲提供了數據下載接口,我們可以在下面這個網站下載到各級別行政區劃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實現的批量處理操作會使工作變得越來越便捷,工作量越來越少,未來會有更多的工作內容會被這樣的工具替代掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章