Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件

Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件

前段时间从公众号麻辣gis的推文上看到「GIS数据」下载全国的GeoJSON格式数据(精确到县级)的文章,吸引了我的注意,点进去的确干货满满,可以下载到全国GeoJSON格式数据。我就在在想能不能不用gis桌面软件,把GeoJSON数据直接转换为shapefile。首先我想到了用js,以前也做过类似的demo,但是这货不太给力,弃了。然后就想到了Python,了解一番后发现了geopandas库。

GeoPandas是一个开源项目,Pandas是Python的一个结构化数据分析的利器,GeoPandas扩展了pandas使用的数据类型,允许对几何类型进行空间操作,其DataFrame结构相当于GIS数据中的一张属性表,使得可以直接操作矢量数据属性表,其目标是使得在python中操作地理数据更方便

  • 最终成果
Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件_第1张图片
  • 实现方式
  1. 安装安装 GeoPandas库
    我是利用Anaconda3集成环境,所以就直接在cmd命令窗口执行conda install -c conda-forge geopandas。这句话会下载geopandas依赖的一些库,安装时间较长耐心等待就好。 ( 可以从清华大学镜像下载Miniconda。地址是 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/),其他方式都比较复杂一点,网上也很全面,可以自行百度下载,不在细说。

  2. GeoJSON基础数据获取

  • 数据获取

将阿里云上GeoJSON的数据利用Python保存到本地磁盘上。

http://datav.aliyun.com/tools/atlas/#&lat=33.521903996156105
&lng=104.29849999999999&zoom=4

Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件_第2张图片
  • 效果预览
Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件_第3张图片
  • 实现代码
# -*- coding: utf-8 -*-

"""
@File    : JsonCrawlerLocal.py
@Author  : [email protected]
@Time    : 2020/2/10 18:41
@notice  : 将数据GeoJSON文件保存到本地
"""
# 数据下载地址
import json
import requests


# 获取所有数据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 = "./data/" + 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


# 数据下载地址
# http://datav.aliyun.com/tools/atlas/#&lat=33.521903996156105&lng=104.29849999999999&zoom=4
# 地名:中国|adcode:100000
# https://geo.datav.aliyun.com/areas/bound/100000.json
# 地名:河南省|adcode:410000
# https://geo.datav.aliyun.com/areas/bound/410000.json
# 地名:河南省+子区域|adcode:410000
# https://geo.datav.aliyun.com/areas/bound/410000_full.json
# 地名:江苏省|adcode:320000
# https://geo.datav.aliyun.com/areas/bound/320000.json
# 地名:山东省|adcode:370000
# 地名:江苏省|adcode:340000
# 地名:北京市ad|code:110000

# 获取对应数据的json文件
url = 'https://geo.datav.aliyun.com/areas/bound/110000.json'#输入json地址
download_Json(url, "北京")#第一个参数是json文件的地址,第二个参数是文件保存的名称,

  1. GeoJSON数据展示
    利用GeoPandas读取GeoJSON数据,并利用matplotlib展示出来。
  • 实现代码
# -*- coding: utf-8 -*-

"""
@File    : MapDisplay.py
@Author  : [email protected]
@Time    : 2020/02/26 15:41
@notice  : 展示geojson生成的数据,并进行投影
"""

import geopandas
from shapely import geometry
import matplotlib.pyplot as plt

#保存在本地的geoJson数据
data = geopandas.read_file('./data/dataChina.json')
# data = geopandas.read_file('./data/河南.json')
# data = geopandas.read_file('./data/江苏.json')
cq = geopandas.GeoSeries([geometry.Point([116.0, 39.0])],crs='EPSG:4326')#默认wgs1984坐标系
#生成图表
#EPSG 坐标系名称 小 经度最小 大 经度最大  中央经线
#4524 CGCS2000 / 3-degree Gauss-Kruger zone 36 106.5 109.5 108
#2381 Xian_1980_3_Degree_GK_CM_108E 106.5 109.5 108
fig, ax = plt.subplots()
data.to_crs(crs='EPSG:4524').plot(ax=ax, color="#4C92C3",alpha=0.8)
cq.to_crs(crs='EPSG:4524').plot(ax=ax, color='orange', markersize=100, marker='*')
plt.xticks(rotation=20)
plt.savefig("./images/MapDisplayAndprojection.png")
plt.show()

-效果预览2

Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件_第4张图片
  • 实现代码
# -*- coding: utf-8 -*-

"""
@File    : MapDisplay.py
@Author  : [email protected]
@Time    : 2020/02/26 15:41
@notice  : 展示geojson生成的数据,并进行投影
"""

import geopandas
from shapely import geometry
import matplotlib.pyplot as plt

#保存在本地的geoJson数据
data1 = geopandas.read_file('./data/河南.json')
data2 = geopandas.read_file('./data/江苏.json')
data3 = geopandas.read_file('./data/山东.json')
data4 = geopandas.read_file('./data/安徽.json')

fig, ax = plt.subplots()
data1.plot(ax=ax, color="#FDECD2",alpha=1)#透明样式alpha=0.8
data2.plot(ax=ax, color="#FADCE8",alpha=0.8)
data3.plot(ax=ax, color="#DFE2F3",alpha=0.9)
data4.plot(ax=ax, color="#E0ECDF",alpha=0.7)
# 绘制bbox框示意,进行重点标记(可以进行注释)
ax = geopandas.GeoSeries([geometry.box(minx=115,  #红框经度(小)
                                       maxx=118,  # 红框经度(大)
                                       miny=34,  #红框纬度(小)
                                       maxy=36)##红框纬度(大)
                         .boundary]).plot(ax=ax, color='red')
plt.savefig("./images/MapDisplayMoreProvince.png")#保存图片到项目images路径下
plt.show()
  1. 保存 GeoJSON数据为shapefile到本地
  • 效果预览
Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件_第5张图片
Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件_第6张图片
Python-GeoPandas获取全国GeoJSON格式数据,展示并生成shapefile文件_第7张图片
  • 实现代码
# -*- coding: utf-8 -*-

"""
@File    : MapDisplay.py
@Author  : [email protected]
@Time    : 2020/02/26 15:41
@notice  : 将json生成的数据保存到本地
"""

import geopandas
import matplotlib.pyplot as plt


def saveShapefile(file_path, output_shapefile_name):
    try:
        data = geopandas.read_file('./data/' + str(file_path) + '.json')
        ax = data.plot()
        plt.show()  # 显示生成的地图
        localPath = 'output/' + 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)
saveShapefile('河南', '河岸省矢量')

  1. 总结
    当然geopandas还可以干更多事,比如说读取本地shapefile文件、处理栅格图像、它还自带世界地区底图、世界主要城市底图,可以分解到各个国家进行制图,还可以连接excel、csv文件等进行制图,生成图例与指北针等等。下一期将为大家讲述如何读取本地shapefile,利用geopandas自带的地图连接csv表格进行制图等…
    喜欢的朋友们可以点个关注,后续将持续更新,精彩无限^ - ^

你可能感兴趣的:(Python,爬虫)