什么!?现在连这个地理学术可视化工具还不知道?!速度学!!

2022-10-25 10:14:13 浏览数 (1)

最近很多小伙伴私信小编关于地理空间可视化相关数据可视化的绘制。怎么说呢?小编本身对地理空间可视化了解的还蛮多的。但是,要让大家实现对地理相关的数据进行处理、可视化等操作还是蛮难的~~ 所以小编今天就推荐一个超赞的绘图工具-「gma」 绝对的地理相关同学的福音!,下面小编就简单介绍一下,内容如下:

  • Python-gma基本介绍
  • Python-gma 可视化案例

Python-gma基本介绍

  • gma库作为以Python语言为基础开发的第三方优质拓展包,其语法简单且使用API(用户指南)清晰明了;
  • gma库是一个开放共享的库,包括指数运算数学运算系统交互空间杂项栅格处理栅格分析矢量数据处理等方向近百个功能函数,绝对的空间数据处理王者级别的。
  • gma库也是一个持续更新的库,小伙伴们在阅读完本期之后记得多使用该工具,多多提问题哈
  • gma库目前只支持Window系统,暂不支持 Linux、MacOS 和其他平台。
  • gma库可通过如下语法直接安装:
代码语言:javascript复制
pip install gma

其他所需的依赖库,可参考:gma库安装依赖[1]

Python-gma 可视化案例

gma库拥有多个计算地理相关指标的计算函数,详细内容,大家可参考:gma相关计算函数介绍[2]

这里小编还是列举几个可视化绘制的样例,后期如果大家感兴趣,私信小编,也可以进行视频内容的制作的~~

代码语言:javascript复制
import cartopy.crs as ccrs
import cartopy.feature as cft
import matplotlib.pyplot as plt
import matplotlib.colors as cor
import numpy as np
import gma

## 以下模块为尝鲜模块。在 gma 1.0.9 中作为非必要的扩展模块合入!!
import gma.extend.mapplottools as mpt
import gma.extend.arrayenhancement as aec

PAR = {'font.sans-serif': 'Times New Roman',
       'axes.unicode_minus': False,
      }
plt.rcParams.update(PAR)

# 需要绘制的两个文件
InFiles = ["TMAX_China_ANUSPLIN_20201215.tif", "PMET0_China_ANUSPLIN_20201215.tif"]

DataTypeNames = ['最高气温', '作物参考蒸散量']
LegendLable = ['TMax(℃)', 'ET0(mm)']
fig = plt.figure(figsize = (10, 10), dpi = 300)

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

for i in range(len(InFiles)):
    ax = plt.subplot(1, 2, i   1, projection = Alberts_China) 
    
    DataSet = gma.Open(InFiles[i])
    DrawData = DataSet.ToArray()
    DrawData[DrawData == DataSet.NoData] = np.nan
    # 由于数据有过大过小值,这里做一个百分比截断拉伸
    STRE = aec.Stretch(DrawData, MaxLabel = np.nanpercentile(DrawData, 95), MinLabel = np.nanpercentile(DrawData, 5))
    DrawData = STRE.Percentage()
    ############################################ 配置范围
    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.1,-0.1,0.1, 0.01  # 左右、下上边界的扩展比例
    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]    
    
    WKTCRS = DataSet.Projection
    
    # 0.控制数据显示范围
    DataCRS = mpt.GetCRS(WKTCRS)
    ax.set_extent(ExtentPLT, crs = DataCRS)

    # 1.绘制底图图层
    ## 1.1 添加行政边界
    mpt.AddGeometries(ax, r"RegionVTD_PG_Province_China.shp", EdgeColor = 'Gray', LineWidth = 0.1)
    mpt.AddGeometries(ax, r"RegionVTD_PG_China.shp", EdgeColor = 'black', LineWidth = 0.2)
    mpt.AddGeometries(ax, r"Region南海诸岛九段线.shp", EdgeColor = 'black', LineWidth = 0.3)
    ## 1.2 添加国家 / 海洋背景 / 大型湖泊
    mpt.AddGeometries(ax, r"WorldVTD_PG_World_Country.shp", EdgeColor = 'gray', LineWidth = 0.1, 
                      FaceColor = 'white', Zorder = 0)
    ax.set_facecolor('#BEE8FF')
    ax.add_feature(cft.LAKES.with_scale('110m'), color = '#BEE8FF')
    
    # 2.绘制数据图层
    im = ax.imshow(DrawData, transform = DataCRS, cmap = plt.get_cmap('jet'), extent = ExtentData, zorder = 1,
                   interpolation = 'none')        
         
    # 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
        
    ax.set_title(DataTypeNames[i], fontsize = 10, y = 0.92, fontdict = {'family':'SimSun'})
    
    # n.其他优化设置
    ## n.1 添加指北针
    mpt.AddCompass(ax, LOC = (0.15, 0.9), SCA = 0.04, FontSize = 10)
    ## n.2 添加比例尺
    mpt.AddScaleBar(ax, LOC = (0.4, 0.08), SCA = 0.12, FontSize = 6, UnitPad = 0.2, BarWidth = 0.6)
    ## n.3 添加并修饰图例
    leg = fig.colorbar(im, 
                       location = 'right', # 位置
                       orientation = 'vertical', # 图例方向
                       pad = -0.3, # 边距
                       ticks = [np.nanmin(DrawData), 0, np.nanmax(DrawData)],
                       shrink = 0.06, # 大小缩放
                       aspect = 2, # 长宽比
                       anchor = (-8, 0.38), # 位置
                      )
    leg.outline.set(edgecolor = 'black',linewidth = 0.1)
    leg.ax.set_title(LegendLable[i], fontsize = 8, loc = 'left')
    leg.ax.tick_params(which = 'major', direction = 'out', labelsize = 6, length = 3, color = 'black', width = 0.1)

plt.show()

Example Of tiff data in gma

可以看出,gma库绘制的可视化结果能够完美绘制指北针比例尺,即分别使用AddCompass() 函数添加指北针;使用AddScaleBar() 函数添加比例尺。

更多关于Python-gma库的内容,感兴趣的小伙伴可参考:Python-gma库官网[3]

总结

今天小编介绍的gma库可谓是地理科学小伙伴们的福音,可能在部分细节使用上,还存在不理解的部分,小编也会专门使用该库进行常见地理可视化图表的绘制~~赶快学习起来吧!!

参考资料

[1]

gma库安装依赖: https://gma.luosgeo.com/Install.html。

[2]

gma相关计算函数介绍: https://gma.luosgeo.com/UserGuide/#功能统计。

[3]

Python-gma库官网: https://gma.luosgeo.com/。

0 人点赞