基于 Python 的地理空间绘图指南

  大部分情况下,地理绘图可使用 Arcgis 等工具实现。但正版的 Arcgis 并非所有人可以承受。本文基于 Python 的 cartopy 和 matplotlib 等库,为地理空间绘图的代码实现提供参考。
  所有所需库如下:

gma、cartopy、matplotlib、numpy

  更多内容可转到:地理与气象分析库----使用指南

0 绘图目标

  基于 Python 的地理空间绘图目标实现以下效果(包含比例尺、指北针、经纬网、图例等):
在这里插入图片描述

1 绘图思路

栅格
读取栅格数据
底图
读取矢量底图
确定绘图区域
绘制数据
绘制底图
添加指北针\比例尺\图例
输出绘图结果

2 数据处理

  本例以 ESA 2020 陆表覆盖河南省地物分类数据为例,通过gma.rasp.AddColorTable 更新色彩映射表,形成三个与原始文件不同的副本栅格(仅配色不同)。并对四个栅格进行绘制。这四个文件分别为:

“地表覆盖_河南_ESA_2020.tif”  ----原始数据
“地表覆盖_河南_ESA_2020 - 副本.tif”
“地表覆盖_河南_ESA_2020 - 副本 (2).tif”
“地表覆盖_河南_ESA_2020 - 副本 (3).tif”

  底图以我国省、地级市边界以及1-5级河流和湖泊为主。

import gma
# 1.根据定义更新——第一个副本
## 待更新的色彩映射表
ColorTable = {10:(0,112,255,255),
              20:(255,211,127,255),
              30:(76,230,0,255),
              40:(123,104,238,255),
              50:(230,230,0,255),
              60:(205,245,122,255),
              70:(156,200,121,255),
              80:(245,162,122,255),
              90:(190,210,255,255),
              95:(109,150,178,255),
              100:(223,198,142,255)}
## 将定义的色彩映射表更新到 副本
gma.rasp.AddColorTable("地表覆盖_河南_ESA_2020 - 副本.tif",
                       ColorTable = ColorTable)
# 2.根据模板栅格更新——第二个副本
## 将 副本 的色彩映射表更新到 副本(2)
gma.rasp.AddColorTable("地表覆盖_河南_ESA_2020 - 副本 (2).tif",
                       "地表覆盖_河南_ESA_2020 - 副本.tif")
# 3.根据模板栅格和定义更新——第三个副本                       
## 将 副本 以及定义的色彩映射表更新到 副本 (3)
gma.rasp.AddColorTable("地表覆盖_河南_ESA_2020 - 副本 (3).tif",
                       "地表覆盖_河南_ESA_2020 - 副本.tif",
                       ColorTable = {10:(100,100,100,255), 40:(200,200,200,255)})

3 绘制栅格

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib.colors as cor
import numpy as np
import gma.extend.mapplottools as mpt
PAR = {'font.sans-serif': 'Times New Roman',
       'axes.unicode_minus': False,
      }
plt.rcParams.update(PAR)

3.1 读取色彩映射表信息(若不包含,可自行定义色带)

InFiles = ["地表覆盖_河南_ESA_2020.tif", "地表覆盖_河南_ESA_2020 - 副本.tif", 
           "地表覆盖_河南_ESA_2020 - 副本 (2).tif", "地表覆盖_河南_ESA_2020 - 副本 (3).tif"]
#### 读取四组数据色彩信息
CMap = []
Colors = []
for InFile in InFiles:
    DataSet = gma.Open(InFile)
    Color = DataSet.GetGDALDataset().GetRasterBand(1).GetColorTable()
    ColorTable = [Color.GetColorEntry(i) for i in range(Color.GetCount())]
    # 转换 色彩映射表 为 Matplotlib 可识别的格式
    CMapV = tuple(tuple(np.array(CT) / 255) for CT in ColorTable)
    # 生成色带
    CMap.append(cor.ListedColormap(CMapV))
    Colors.append([CMapV[i] for i in range(10, 110, 10)] + [CMapV[95]])
#### 为四组数据分配名称
Method = ['原始配色', '根据定义更新', '根据模板栅格更新', '根据模板栅格和定义更新']
#### 为颜色值定义含义
ColorName = ['林地', '灌木', '草地', '耕地', '建筑', '裸地/稀疏植被区', '雪和冰', '开阔水域', 
             '草本湿地', '红树林', '苔藓和地衣']

3.2 定义数据分块——用于数据分块绘制(节约内存)

当数据过大时,直接绘制可能失败。若想精确绘制,可采用此方法(若涉及到投影,大数据耗时较久)。否则,可以缩放数据,减小分辨率(类似栅格金字塔构建规则)进行绘制。

BlockSize = 8000
Columns = DataSet.Columns
Rows = DataSet.Rows
Blocks = [(r, c) for r in range(0, Rows, BlockSize) for c in range(0, Columns, BlockSize)]

3.3 配置制图范围

GEOT = DataSet.GeoTransform
Columns = DataSet.Columns
Rows = DataSet.Rows
# 数据边界
ExtentData = [GEOT[0], GEOT[0] + GEOT[1] * Columns, GEOT[3] + GEOT[-1] * Rows, GEOT[3]]
# 绘图边界(以数据边界为基础确定)
EL, ER, EB, ET = 0.2, 0.1, 0.15, 0.05  # 左右、下上边界的扩展比例
ExtentPLT = [ExtentData[0] - (ExtentData[1] - ExtentData[0]) * EL, 
             ExtentData[1] + (ExtentData[1] - ExtentData[0]) * ER, 
             ExtentData[2] - (ExtentData[3] - ExtentData[2]) * EB, 
             ExtentData[3] + (ExtentData[3] - ExtentData[2]) * ET]

3.4 绘制数据

WKTCRS = DataSet.Projection
DataCRS = mpt.GetCRS(WKTCRS)
fig = plt.figure(figsize = (10, 10), dpi = 600)

# 定义一个标准中国区 ALBERS 投影
Alberts_China = ccrs.AlbersEqualArea(central_longitude = 105, standard_parallels = (25.0, 47.0))  

for i in range(4):
    ax = plt.subplot(2, 2, i + 1, projection = Alberts_China) 

    # 0.控制数据显示范围
    ax.set_extent(ExtentPLT, crs = DataCRS)

    # 1.绘制底图图层(应用自有高精度数据做底图)
    ## 1.1 添加行政边界
    mpt.AddGeometries(ax, r"Region\VTD_PG_PLCity_China.shp", EdgeColor = 'LightGrey', LineWidth = 0.1)
    mpt.AddGeometries(ax, r"Region\VTD_PG_Province_China.shp", EdgeColor = 'Gray', LineWidth = 0.2)
    ## 1.2 添加河流湖泊
    mpt.AddGeometries(ax, r"river\1级河流.shp", EdgeColor = 'RoyalBlue', LineWidth = 0.4)
    mpt.AddGeometries(ax, r"river\2级河流.shp", EdgeColor = 'DodgerBlue', LineWidth = 0.3)
    mpt.AddGeometries(ax, r"river\3级河流.shp", EdgeColor = 'DeepSkyBlue', LineWidth = 0.2)
    mpt.AddGeometries(ax, r"river\4级河流.shp", EdgeColor = 'SkyBlue', LineWidth = 0.15)
    mpt.AddGeometries(ax, r"river\5级河流.shp", EdgeColor = 'LightSkyBlue', LineWidth = 0.05)
    mpt.AddGeometries(ax, r"river\主要湖泊.shp", EdgeColor = 'none', LineWidth = 0, FaceColor = '#BEE8FF')

    # 2.绘制数据图层
    ## 分块绘制(节约内存)
    for Block in Blocks:
        # 数据都一样,读取一个文件的数据即可
        DrawData = DataSet.ToArray(*Block, BlockSize, BlockSize)
        ExtentBlock = [GEOT[0] + Block[1] * GEOT[1],  GEOT[0] + (DrawData.shape[1] + Block[1]) * GEOT[1], 
                       GEOT[3] - (DrawData.shape[0] + Block[0]) * GEOT[1], GEOT[3] - Block[0] * GEOT[1]]
        im = ax.imshow(DrawData, transform = DataCRS, cmap = CMap[i], extent = ExtentBlock, zorder = 2,
                       interpolation = 'none', vmin = 0, vmax = 255)

    # 3.为绘制区域增加经纬网
    gl = ax.gridlines(draw_labels = True, dms = False, x_inline = False, y_inline = False, 
                      linestyle = (0, (10, 10)), 
                      linewidth = 0.2,
                      color = 'Gray',
                      rotate_labels = False,
                      xlabel_style = {'fontsize': 8},
                      ylabel_style = {'fontsize': 8})
    ## 3.1忽略相邻轴的经纬网标签
    if i % 2 == 0:
        gl.right_labels = False
    else:
        gl.left_labels = False
    if i < 2:
        gl.bottom_labels = False
    else:
        gl.top_labels = False        
           
    ax.set_title(Method[i], fontsize = 10, y = 0.92, fontdict = {'family':'SimSun'})
    
    # n.其他优化设置
    ## n.1 添加指北针
    mpt.AddCompass(ax, LOC = (0.2, 0.85), SCA = 0.04, FontSize = 10)
    ## n.2 添加比例尺
    mpt.AddScaleBar(ax, LOC = (0.8, 0.08), SCA = 0.1, FontSize = 6, PROJType = 'PROJCS', UnitPad = 0.25, BarWidth = 0.6)
    ## n.3 添加图例并修饰
    mpt.AddLegend(ax, Colors[i], LegendName = '分类', LengedInterval = 0.4, LabelList = ColorName, 
                  LegendSize = 8, TextInterval = 0.1, LOC = (0.05, 0.32), SCA = 0.03, AspectRatio = 1.5, 
                  Columns = 2, ColumnWide = 0.15, RowInterval = 0.015, FontSize = 6, EdgeColor = 'k', EdgeWidth = 0.1)    
plt.subplots_adjust(wspace = 0.05, hspace = -0.05)
plt.show()

在这里插入图片描述

4 支持与赞助

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
### 回答1: 《Python地理空间分析指南》是一本介绍使用Python进行地理空间数据处理和分析的指南。该书详细介绍了如何使用Python编程语言进行地理空间数据的读取、处理、分析和可视化。 首先,本书从基础知识开始,介绍了地理信息系统(GIS)和空间数据的基本概念。读者可以了解到地理空间数据的类型、结构和特点,以及相关的地理数据模型和坐标系统。 然后,本书介绍了Python语言的基础知识和地理空间分析的常用工具包,如GDAL、Fiona、PySAL等。读者可以学习如何通过这些工具包读取和处理常见的地理空间数据格式,如Shapefile、GeoJSON等。 接着,本书以实例的形式介绍了一系列地理空间分析的常见任务,包括空间查询、空间缓冲区分析、空间插值、地理空间回归分析等。每个实例都给出了详细的代码和步骤,读者可以通过学习这些实例来理解如何使用Python进行地理空间分析。 此外,本书还介绍了一些高级的地理空间分析技术,如空间统计分析、网络分析、时间空间分析等。读者可以通过学习这些技术,提升自己在地理空间分析领域的能力。 最后,本书还介绍了如何使用Python进行地理空间数据可视化,包括绘制、制作动态可视化等。读者可以通过学习这些技术,将地理空间数据可视化为直观的形展示,更好地理解和分析数据。 总而言之,本书通过系统的介绍和实例演示,帮助读者掌握使用Python进行地理空间分析的基本原理和方法。无论是初学者还是有一定经验的数据分析师,都可以从本书中获得实用的知识和技巧。 ### 回答2: 《Python地理空间分析指南》是一本介绍使用Python进行地理空间分析的指南地理空间分析是指用计算机技术和地理信息系统(GIS)来处理和分析地理数据的方法和工具。该指南主要介绍了如何使用Python编程语言来读取、处理、分析和可视化地理数据。 在这本指南中,读者将学习使用Python的主要库和模块,如GDAL、Geopandas、Shapely等,来处理不同格式的地理数据,包括栅格数据和矢量数据。读者将学习如何读取地理数据文件,并进行数据的预处理、筛选和转换。 指南中还介绍了一些常见的地理空间分析方法和技术,如空间插值、空间统计分析、地理网络分析等。读者将学会如何使用Python来应用这些方法,并通过可视化工具将分析结果以地的形式展示出来。 除了基本的地理空间分析方法,指南还介绍了一些高级的主题,如空间回归分析、地理聚类分析、地理大数据处理等。这些主题将帮助读者深入理解地理空间分析的应用领域,并提供了更多应用的思路和方法。 这本指南的目标读者是对地理信息科学和计算机编程有一定了解的人士,希望通过Python来进行地理空间分析的人士。它不仅可以帮助读者掌握Python编程技巧,还可以帮助读者在GIS领域应用Python进行地理数据处理和分析,提高工作效率和数据分析的准确性。 ### 回答3: 《Python地理空间分析指南》是一本介绍如何使用Python进行地理空间分析的电子书,以PDF格式进行发布。该书主要内容涵盖了地理数据处理、空间数据可视化、空间数据挖掘等方面的知识和技巧。 这本指南对于想要利用Python进行地理空间分析的人来说是一本非常有价值的资料。通过学习该指南,读者可以了解如何使用Python来读取、处理和分析地理数据。该指南介绍了一些常用的Python库和工具,比如geopandas、shapely和pySAL等,这些工具可以帮助读者处理地理空间数据,进行地制作和空间统计分析等工作。 另外,该指南还介绍了一些地理空间分析的常用方法和技术。比如,如何计算地理空间数据之间的距离或相似性,如何进行空间插值和地理加权回归等。这些技术对于研究地理空间问题和解决实际问题都具有重要意义。 总的来说,通过学习《Python地理空间分析指南》,读者可以获得使用Python进行地理空间分析的基础知识和实用技巧。这本指南包含了丰富的实例和案例,以及相关的代码和数据,读者可以通过实践来加深对地理空间分析的理解和应用。无论是从事地理信息系统研究的专业人士,还是对地理空间分析感兴趣的初学者,都能从该指南中获益匪浅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛的地理研学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值