找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1938

积分

0

好友

272

主题
发表于 2026-1-3 09:48:59 | 查看: 22| 回复: 0

本文主要记录 geo_plotkit 包的 data 模块所提供的数据资源及其基本使用方法。请注意,前两期关于添加包内置资源的函数语法已有调整

重要说明:geo_plotkit 是一个本地开发的绘图包,不会上传到 PyPI(即无法通过 pip install 安装),此系列文章仅作为个人学习记录。

查看当前包内置的数据资源

当前包内置资源分为几大板块,主要存储了矢量(shp)、表格(CSV)、栅格(tif)、网格(nc)等类型的数据资源。

from geo_plotkit.data import list_zones, list_rivers, list_admins, list_basins, list_lakes, list_dems, list_basemaps, list_stations, list_grids

# 列表里面显示的是 <Enum类型.成员名: 成员值>
print('分区:')
print(list_zones())
print('河流:')
print(list_rivers())
print('行政区:')
print(list_admins())
print('湖泊:')
print(list_lakes())
print('流域:')
print(list_basins())
print('DEM:')
print(list_dems())
print('底图:')
print(list_basemaps())
print('站点:')
print(list_stations())
print('网格:')
print(list_grids())

geo_plotkit内置数据资源类型枚举列表截图

查看添加内置资源的函数用法

查看添加行政区数据的函数语法

from geo_plotkit.plot import add_admin

help(add_admin)

语法介绍:

Help on function add_admin in module geo_plotkit.plot.vector:

add_admin(ax, level: 'AdminLevel' = <AdminLevel.COUNTRY: '国界'>, facecolor: 'str' = 'none', edgecolor: 'str' = 'k', linewidth: 'float' = 0.8, zorder: 'int' = 5, **plot_kwargs)
    添加行政区划边界。

    Parameters
    ----------
    level : AdminLevel
        见 `geo_plotkit.data.constants.AdminLevel`。
    **plot_kwargs
        其他样式参数,例如 alpha、linestyle。

查看添加地图数据的函数语法

from geo_plotkit.plot import add_basemap

help(add_basemap)

语法介绍:

Help on function add_basemap in module geo_plotkit.plot.raster:

add_basemap(ax, basemap: geo_plotkit.data.constants.Basemap = <Basemap.NE2: 'ne2'>, data_crs=<Projected CRS: +proj=eqc +ellps=WGS84 +a=6378137.0 +lon_0=0.0 +to ...>
Name: unknown
Axis Info [cartesian]:
- E[east]: Easting (unknown)
- N[north]: Northing (unknown)
- h[up]: Ellipsoidal height (metre)
Area of Use:
- undefined
Coordinate Operation:
- name: unknown
- method: Equidistant Cylindrical
Datum: Unknown based on WGS 84 ellipsoid
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich
, scale_factor: int | None = None, gray: bool = False, clip_bounds: list[float] | None = None) -> 'matplotlib.image.AxesImage'
    在指定坐标轴上添加内置背景底图。

    Parameters
    ----------
    ax : matplotlib.axes._axes.Axes
        绘图的 matplotlib 坐标轴。
    basemap : Basemap, default Basemap.NE2
        内置底图枚举。
    data_crs : cartopy.crs.CRS, default ccrs.PlateCarree()
        数据坐标系,用于 transform。
    scale_factor : int | None, default None
        缩放因子,将栅格数据按该因子下采样。
        scale_factor 和 clip_bounds 互斥。
    gray : bool, default False
        是否使用灰度显示底图。
    clip_bounds : list[float] | None, default None
        裁剪范围 [left, right, bottom, top]。
        scale_factor 和 clip_bounds 互斥。

    Returns
    -------
    matplotlib.image.AxesImage
        绘制的底图对象。

案例

矢量数据使用

  1. 添加河流、分区、流域、行政区等数据
  2. 定制图例、添加编号等
from geo_plotkit.plot import add_admin, add_basin, add_river, add_zone
from geo_plotkit import set_global_style,set_journal_style, bold_border, add_id
from geo_plotkit.data import Basin, River, AdminLevel, Zone
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from geo_plotkit import add_legend

set_journal_style('ieee',fontsize=12)
fig, ax = plt.subplots(figsize=(12,9),subplot_kw={'projection': ccrs.PlateCarree()})
ax.set_extent([73, 135, 18, 54], ccrs.PlateCarree())
add_basin(ax, basin=Basin.ZHUJIANG, facecolor='skyblue', edgecolor='red', linewidth=0.5)
add_river(ax, river=River.CHANGJIANG, edgecolor='skyblue', linewidth=1.5)
add_zone(ax, zone=Zone.CLIMATE, edgecolor='red', linewidth=0.8)
add_admin(ax, level=AdminLevel.COUNTRY, edgecolor='darkblue', linewidth=1.5)
bold_border(ax,width=2)
add_id(ax,0,loc=[0.05,0.95],fontsize=16)
ax.gridlines(draw_labels=True)

legend_items = [
    {'type': 'line', 'label': '河流', 'color': 'skyblue', 'linewidth': 2},
    {'type': 'patch', 'label': '气候分区', 'facecolor': 'none', 'edgecolor': 'red', 'linewidth': 1},
    {'type': 'patch', 'label': '流域', 'facecolor': 'skyblue', 'edgecolor': 'red', 'linewidth': 0.5},
    {'type': 'patch', 'label': '国界', 'facecolor': 'none', 'edgecolor': 'darkblue', 'linewidth': 1},
]

# 调用 add_legend 函数添加图例
legend = add_legend(ax, legend_items, loc='lower right')

中国地区河流、气候分区、流域与国界叠加绘制效果图

栅格数据使用

主要是底图数据的使用,通过 gp.add_basemap 函数添加,底图资源来自 data 模块。

import geo_plotkit.plot as gp
from geo_plotkit import bold_border, set_journal_style, set_map_ticks
from geo_plotkit.data import Basemap
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

set_journal_style('ieee')
fig, ax = plt.subplots(figsize=(12,9),subplot_kw={'projection': ccrs.PlateCarree()})
extent = [73.5, 135.5, 12, 53.5]
set_map_ticks(ax, extent, grid=True, display_direction=['top','left'])
im = gp.add_basemap(ax, basemap=Basemap.NE2, clip_bounds=extent)
bold_border(ax, 2)

使用NE2底图渲染的中国区域地形图

import geo_plotkit.plot as gp
from geo_plotkit import bold_border, set_journal_style, set_map_ticks
from geo_plotkit.data import Basemap, AdminLevel
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

set_journal_style('ieee')
fig, ax = plt.subplots(figsize=(12,9),subplot_kw={'projection': ccrs.PlateCarree()})
extent = [73.5, 135.5, 12, 53.5]
set_map_ticks(ax, extent, grid=True, display_direction=['top','left'])
im = gp.add_basemap(ax, basemap=Basemap.EATLAS, clip_bounds=extent)
gp.add_admin(ax, level=AdminLevel.COUNTRY, linewidth=1)
bold_border(ax, 2)

使用EATLAS底图叠加国界线的中国区域地形图

网格数据使用

目前储存的是全球地形数据(netcdf文件),后面还会加入气象网格数据。

from geo_plotkit.data import list_grids, get_grib_path
from geo_plotkit import set_map_ticks, set_journal_style
import matplotlib.pyplot as plt
import xarray as xr
import cartopy.crs as ccrs

set_journal_style('nature')

print(list_grids())
etopo = xr.open_dataset(get_grib_path('ETOPO'),engine="netcdf4")
etopo_coarse = etopo.coarsen(x=10, y=10, boundary='trim').mean() # 经纬度重采样为10个

fig, ax = plt.subplots(figsize=(16,9),subplot_kw={"projection": ccrs.PlateCarree()})
set_map_ticks(ax, extent=[-180, 180, -90, 90], display_direction=['top','left'], xticks=range(-180, 181, 30),yticks=range(-90, 91, 30))
# 绘制 ETOPO 数据
im = etopo_coarse.z.plot(
    ax=ax,
    transform=ccrs.PlateCarree(),
    cmap='terrain',
    vmin=-1500,
    vmax=8000,
    cbar_kwargs={
        'shrink': 0.75,      # colorbar 缩放比例
        'pad': 0.02,         # colorbar 与图像的间距
        'label': 'Elevation (m)'# colorbar 标签
    }
)
plt.show()

基于ETOPO数据绘制的全球地形高程图

开发建议

数据资源统一存储在包的 data 目录下,使用不同的文件夹存储不同的资源类型。可以通过同目录下的 loaders 文件定义数据处理函数,同时建议单独定义一个存储变量名称的 Python 文件(如 constants.py)来统一管理数据资源的增减,这是一种良好的代码组织实践,有助于维护清晰的 技术文档 结构。




上一篇:深入解析K8s节点:DaemonSet与CRI、CNI、CSI三大接口如何管理Pod
下一篇:NGINX 正式支持 ACME 协议,实现SSL/TLS证书自动化管理
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 09:06 , Processed in 0.204406 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表