您现在的位置是:首页 >技术教程 >gma 1.1.5 (2023.04.13) 更新日志网站首页技术教程
gma 1.1.5 (2023.04.13) 更新日志
优化
1、LogLogistic 分布
优化标准化气候指数 LogLogistic 分布内部拟合/变换算法,提高拟合结果的精度 。
2、【栅格处理】
将进度条回调函数外置——包括 CallBack 和 CallBackData(已测试可以配合 PyQT 实现进图条界面(如果这个回调函数基于 gdal 原生方法))。
3、Layer
重构了 Layer 类(移除了 95% ogr.Layer 的内容,因为其可能导致 Python 内核崩溃,但整体用法和功能不变)。
- 现在,gma 打开的矢量数据 Layer 和 Feature 已经完全不同于 ogr。
- 如果希望将 gma.~.Feature 转为 ogr.Feature,请探索 gma.algorithm.core.gcreate._GMAFeatureToOGR 函数!
4、内置数据
a、内置栅格数据格式由.tif改为 .jp2 和 .webp ,使文件大小减小最多75%。
b、除 DEM 数据之外,其他数据更换为 Natural Earth(1:50M)数据。
新增
1、io 模块
将 gma 内部输入输出相关函数入口调整至 io 模块,开放使用。主要包括(功能同名称):
- CreateFeatureFromPoints:从点创建要素(Feature)。
- CreateLayerFromFeature:从点创建图层(Layer)。
- Open:打开文件。同 gma.Open
- RasterOpen:打开栅格文件。
- VectorOpen:打开矢量文件。
- ReadArrayAsDataSet:将 Numpy 数组读取为数据集(DataSet)。
- SaveArrayToRaster:将 Numpy 数组保存到栅格文件。
- TranslateFeatureToDataSet:将要素(Feature)转换为数据集(DataSet)。
- TranslateLayerToDataSet:将图层(Layer)转换为数据集(DataSet)。
已开放但不在 io模块的同功能函数将在未来的某个版本移除(例如:rasp.WriteRaster 与 SaveArrayToRaster 功能完全一致)。
2、inres 模块
为 map 增加 inres模块,用以提供内置资源(世界陆地、大型河流、大型湖泊、自然地球等数据)。原有方法依旧可用,但会发出弃用警告。
3、plot 模块
a、增加【GetPreDefinedCMaps】。列出并绘制 matplotlib 所有默认色带。
b、增加【CreatePlotFeature】。将坐标点转换为绘图要素。与 io.CreateFeatureFromPoints 不同,此方法生成的线、面要素会在点之间插值形成一系列的连续点,以保证更换投影时绘制线的位置不会发生改变并且是空间连续的。
修复
1、SetFrame
修复了一个因显示区域过小进而导致配置经度或纬度刻度总是忽略不显示(即 ShowXXX 总是= False)的问题。
2、ET0.Hargreaves
修复了 ET0.Hargreaves 函数在 2 维气温数据条件下,不支持对应 1 维纬度数据的问题。(感谢反馈:su*****77)
3、MultiSDSToTif
由于重构了 Open 函数导致此方法异常。因此,基于 gma 当前版本的整体逻辑对此方法进行简化重构。(感谢反馈:a2*****20)
简单示例
示例数据下载:
链接:https://pan.baidu.com/s/1VMsDxzogCvN8Fj0Unb8LCg?pwd=4gij
提取码:4gij
from gma import io
from gma.smc import Interpolate
from gma.map import rcs, plot, inres
import pandas as pd
# 步骤一:读取数据
## 0.若为 Excel 数据
Data = pd.read_excel("Interpolate.xlsx")
Points = Data.loc[:, ['经度','纬度']].values
Values = Data.loc[:, ['值']].values
##可选################### 从矢量文件读取坐标点(经度、维度)和值
## 1.若为矢量文件
DataSource = io.Open("Interpolate.shp")
Layer = DataSource.GetLayer(0)
### 1.1 如果属性表包含经度、维度和值
Data = Layer.GetAttributeTable()
Points = Data.loc[:, ['经度','纬度']].values
Values = Data.loc[:, ['值']].values
### 1.2 如果属性表仅包含值,可读取每个点要素的坐标及其对应的值
Points = [Layer.GetFeature(i).Points[:2] for i in range(Layer.FeatureCount)]
Values = [Layer.GetFeature(i).Fields['值'] for i in range(Layer.FeatureCount)]
##可选###################
# 步骤二:克里金插值,并将插值结果转换为 gma 数据集(DataSet)
KGD = Interpolate.Kriging(Points, Values, Resolution = 0.01, InProjection = 'WGS84')
KGDataSet = io.ReadArrayAsDataSet(KGD.Data, Projection = 'WGS84', Transform = KGD.Transform)
# 步骤三:绘图
# 0.使用 gma 定义一个中心经线为 125°E ,两条标准纬线为 40°N, 52°N 的 Albers 等面积投影
Proj = rcs.AlbersEqualArea(CentralLongitude = 125, StandardParallels = (40, 52))
# 1.初始化一个地图框,并配置视图范围
MapF = plot.MapFrame(Axes = None, BaseMapProj = Proj, Extent = [112, 38, 138, 54])
# 2.将内置的世界矢量图层(国界和海洋)添加到地图框
MapL1 = MapF.AddLayer(inres.WorldLayer.Country, FaceColor = 'none', LineWidth = 0.2, EdgeColor = 'black', Zorder = 2)
MapL2 = MapF.AddLayer(inres.WorldLayer.Ocean, FaceColor = '#BEE8FF', EdgeColor = 'none')
# 3.添加插值结果数据集
MapD1 = MapF.AddDataSetClassify(KGDataSet,
CMap = 'jet',
Remap = [[-25, 0], [-20, 1], [-15, 2], [-10, 3],[-5, 4], [100, 5]],
Method = 'Range',
Labels = ['<= -25', '-25 ~ -20', '-20 ~ -15','-15 ~ -10','-10 ~ -5',' > -5'],
Zorder = 1
)
# 4.地图整饰要素
## 4.1 经纬网
GridLines = MapF.AddGridLines(LONRange = (100, 150, 5), LATRange = (30, 60, 5))
## 4.2 指北针
AddCompass = MapF.AddCompass(LOC = (0.1, 0.8), Color = 'black')
## 4.3 比例尺
ScaleBar = MapF.AddScaleBar(LOC = (0.1, 0.02), Width = 0.3, Color = 'black', FontSize = 7)
## 4.4 图例
Legend = MapF.AddLegend(LegendName = '气温(℃)', TitleAlignment = 'left', PlotID = [2], LOC = (0.75, 0.5), TitleFont = 'SimSun')
# 5.设置地图框边框
Frame = MapF.SetFrame()