根据数据使用arcGIS画分级图
根據數據使用arcGIS畫分級圖
- 需求
- 分析
- 準備
- 需求實現
- 數據處理
- 成品
- 相關文件下載
- 百度網盤鏈接
- 阿里云盤鏈接
- 參考
需求
需求:受一位朋友所托,需要畫一張圖:底層是中國地圖,在其上按照不同年份填充不同顏色的城市,示例如下圖所示。
年份信息如下表所示:
分析
看到這個需求我的第一反應是用echarts畫圖。echarts是一款基于JavaScript的數據可視化圖表庫,提供直觀,生動,可交互,可個性化定制的數據可視化圖表。它的長處在展示和交互,但是僅有有限的定制模式,無法滿足定制化的需求。所以,這條路不行。
Excel也有強大的畫圖能力,但是“你所在的位置不支持地圖圖標”,所以這條路也不行。
經過搜索,我發現ArcGIS,它具有強大的地圖制作、空間數據管理、空間分析、空間信息整合、發布與共享的能力。所以在定制化需求方面,絕對是滿足要求的。缺點也很明顯,這是一款專業的軟件,有它自己的規則和學習門檻,對于外行并不友好。由于沒有更好的辦法,只能硬著頭皮上。
準備
在查看相關博客之后,確定了接下來推進路線。接下來需要一個實驗環境。我用VMware創建了一個Windows10虛擬機,并用網上下載的ArgGIS10.2安裝包安裝ArgGIS環境。接下來,搜索基礎的地圖庫。
找數據:國家基礎地理信息中心、百度網盤鏈接、地圖選擇器。這是很重要的一步,我們不可能從零畫地圖,因此需要使用現成的數據。
1、國家基礎地理信息中心是官方數據源,但是全是數字,作為新手很難上手處理,pass。
2、我從百度網盤鏈接找到了所需要的基礎數據,包括省、地級市行政區劃。
3、地圖選擇器。這里使用的是阿里云的DataV.GeoAtlas。如下圖所示,默認顯示中國地圖,當鼠標放在某個省份(或自治區、直轄市)之上時對應區域會變色,點擊則會選中對應區域。點擊右側“其他類型”下第一行下載按鈕將下載該區域對應的json數據。
以河南省為例,我們大概瀏覽一下json數據內容。如下圖所示,每一個省級單位主要數據內容在features里,共18項,對應18個地級市。每一個feature里,properties里的name字段表示地級市名稱。
需求實現
按照需求,需要將滿足某條件的地級市按照年份分類并著色。那么如何從數據的角度按照這個標準對地級市分類呢?
可能方法1:將地級市分類,使用arcGIS分級著色。
可能方法2:將每一類(對應需求的每一年度)地級市數據匯總,arcGIS每一個圖層上色都不一樣,自動完成需求。
理論上來說兩種方法都可行。限于手頭數據,首先嘗試了可能方法2。前面提到的河南省地圖數據json文件,里面包含了每一個地級市對應的地圖信息。通過代碼實現可以將全國的地級市匯總到一個總文件里。然后按照不同分類,從總文件里篩選對應的地級市地圖數據并生成分類json文件(每一年度地級市json文件)。這些json格式上和原始的河南省地圖數據json文件一致,因此也能生成Shapefile文件。
在ArcGIS軟件里,導入省級行政區劃Shapefile,在此上導入地級市行政區劃,效果如下圖所示。
數據處理
有了json數據,但是ArcGIS并不能直接使用,這里借助mapshaper這個網站生成Shapefile文件,最后得到一個zip壓縮包。我們把它解壓縮,就可以添加到ArcGIS里用啦。
現在我們有個各個省份的json數據。接下來需要完成兩步數據處理。這里選擇Python代碼完成數據處理任務。
數據處理1:將全國各個省級行政單位的地級市數據匯總并保存到一個文件里。代碼如下:
import json import os# 所有省級行政單位地圖json數據保存在代碼同級目錄下的data文件夾里 path = './data/'all_city_array = []# 遍歷data文件夾下所有省級單位地圖json文件 for file_name in os.listdir(path):# 拼接生成單個json文件全路徑名full_path = path + file_name# 打開單個json文件with open(full_path, 'r', encoding='utf-8') as fp:data = json.load(fp)current_city_array = data['features']# 讀取地級市數據并保存到列表中for i in range(len(current_city_array)):all_city_array.append(current_city_array[i])all_data_json = {} # 參照原始json文件內容 all_data_json["type"] = "FeatureCollection" all_data_json["features"] = all_city_array# 用于保存所有地級市地圖數據的文件 all_data_filename = 'all_data_filename.json'with open(all_data_filename, 'w') as file_obj:json.dump(all_data_json, file_obj)print('finish')數據處理2:將每一類地級市分別匯總到一個json文件中。代碼如下:
import json import os# 我們可以用excel打開需求里的表格,然后分年份選定對應的城市,并分別保存到不同的txt文件里。 # 后續根據txt文件分別篩選并保存對應地級市地圖數據json文件。map_data_path = './all_data_filename.json' # 保存2012年對應所有地級市名的txt文件 year_2012_city_name_file = './2012.txt'# 用來存儲2012年對應的城市 _2012_city_names = []# 讀取2012年地級市名 city_name_file = open(year_2012_city_name_file, 'r', encoding='utf-8') city_names = city_name_file.readlines() for city in city_names:city_name = city.strip()_2012_city_names.append(city_name)# 用來存儲2012年對應的地圖數據 year_2012_city_data_array = []# 打開保存有所有地級市地圖數據的json文件,并進行篩選 with open(map_data_path, 'r', encoding='utf-8') as all_map_data_file_fp:all_map_data_json = json.load(all_map_data_file_fp)all_map_data_city_array = all_map_data_json['features']for i in range(len(all_map_data_city_array)):# 從json里讀取城市名字city_name = all_map_data_city_array[i]['properties']['name']print(city_name)if city_name in _2012_city_names:# 符合條件,收集城市地圖數據print('yes ' + city_name)year_2012_city_data_array.append(all_map_data_city_array[i])_2012_all_data_json = {} _2012_all_data_json["type"] = "FeatureCollection" _2012_all_data_json["features"] = year_2012_city_data_array_2012_all_data_filename = '_2012_all_data_filename.json'# 將包含2012年對應地級市地圖數據的json保存到指定json文件中 with open(_2012_all_data_filename, 'w') as file_obj:json.dump(_2012_all_data_json, file_obj)成品
按照需求我們只需要在ArcGIS里導入省級行政區劃Shapefile和每一類地級市Shapefile。最終效果如下圖所示:
相關文件下載
這里提供相關文件,包括ArcGIS安裝包,以及基礎數據文件。
百度網盤鏈接
鏈接: https://pan.baidu.com/s/1LSQCKtssnBUR0-qUO4TGig?pwd=s7rb 提取碼: s7rb
阿里云盤鏈接
todo
參考
[1] https://baike.baidu.com/item/ArcGIS/8738161?fr=aladdin
[2] https://zhuanlan.zhihu.com/p/510140163
[3] https://www.bilibili.com/video/BV1X34y1B7K2/?spm_id_from=333.337.search-card.all.click&vd_source=e8eac17c5eae3017e98083900605d39f
[4] https://www.bilibili.com/video/BV1Nb4y1e7EQ/?spm_id_from=333.337.search-card.all.click&vd_source=e8eac17c5eae3017e98083900605d39f
[5] https://www.bilibili.com/video/BV1Mh411J7AS/?spm_id_from=333.337.search-card.all.click&vd_source=e8eac17c5eae3017e98083900605d39f
[6] https://www.bilibili.com/read/cv4868685
總結
以上是生活随笔為你收集整理的根据数据使用arcGIS画分级图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 顺丰下单后处理接收到的xml
- 下一篇: 汇编语言开头写C清零是为啥,这个汇编语言