Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)

admin 2024年1月29日17:30:13评论260 views字数 3555阅读11分51秒阅读模式

点击下方公众号,回复资料,收获惊喜

前言

气象、海洋、地球科学相关的分析必然少不了地图的可视化。
Python中我常用的绘制地图和空间信息分析的库是Cartopy。
Cartopy有一个非常严重的问题,那就是自带的中国国界数据有问题,这也是很多国外开源库的普遍问题。
在做中国区域的分析时,由于九段线的位置很偏南,因此最标准的做法是同时绘制南海区域的子图。
在做一些站点展示的时候,如果只单独画上几个站点总觉得很丑,可以加上一些地形背景。

综上,今天想要用一个小例子解决这3个问题:

  1. 正确的中国国界线及九段线绘制
  2. 南海小地图绘制
  3. 全球地形图添加

准备工作

  1. 获取正确的中国矢量文件:公众号后台留言“中国行政区划”
    (这个矢量文件来自资源环境平台,并和权威机构的标准地图做了比对,吻合一致。)
  2. 获取全球地形图像:公众号后台留言“全球地形”
    (提供的是全球50m分辨率的tif图,如果对分辨率要求不高可以直接使用stock_img())

代码

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import cartopy
import cartopy.crs as ccrs
import cartopy.feature as cfeat
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from cartopy.io.shapereader import Reader, natural_earth
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from matplotlib.image import imread


def create_map():
    shp_path = './cn_shp/Province_9/'
    # --创建画图空间
    proj = ccrs.PlateCarree()  # 创建坐标系
    fig = plt.figure(figsize=(68), dpi=400)  # 创建页面
    ax = fig.subplots(11, subplot_kw={'projection': proj})  

    # --设置地图属性
    provinces = cfeat.ShapelyFeature(
        Reader(shp_path + 'Province_9.shp').geometries(),
        proj, edgecolor='k',
        facecolor='none'
    )
    # 加载省界线
    ax.add_feature(provinces, linewidth=0.6, zorder=2)
    # 加载分辨率为50的海岸线
    ax.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=10)
    # 加载分辨率为50的河流~
    ax.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=10)
     # 加载分辨率为50的湖泊
    ax.add_feature(cfeat.LAKES.with_scale('50m'), zorder=10)
    ax.set_extent([1051331545])
    # ax.stock_img()
    ax.imshow(
        imread('./NE1_50M_SR_W.tif'),
        origin='upper',
        transform=proj,
        extent=[-180180-9090]
    )
    # --设置网格点属性
    gl = ax.gridlines(
        crs=ccrs.PlateCarree(),
        draw_labels=True,
        linewidth=1.2,
        color='k',
        alpha=0.5,
        linestyle='--'
    )
    gl.xlabels_top = False  # 关闭顶端的经纬度标签
    gl.ylabels_right = False  # 关闭右侧的经纬度标签
    gl.xformatter = LONGITUDE_FORMATTER  # x轴设为经度的格式
    gl.yformatter = LATITUDE_FORMATTER  # y轴设为纬度的格式
    gl.xlocator = mticker.FixedLocator(np.arange(95145 + 55))
    gl.ylocator = mticker.FixedLocator(np.arange(-545 + 55))

    # --设置小地图
    left, bottom, width, height = 0.670.150.230.27
    ax2 = fig.add_axes(
        [left, bottom, width, height], 
        projection=proj
    )
    ax2.add_feature(provinces, linewidth=0.6, zorder=2)
    ax2.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=10)
    ax2.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=10)
    ax2.add_feature(cfeat.LAKES.with_scale('50m'), zorder=10)
    ax2.set_extent([105125025])
    # ax2.stock_img()
    ax2.imshow(
        imread('./NE1_50M_SR_W.tif'),
        origin='upper',
        transform=proj,
        extent=[-180180-9090]
    )
    return ax

def main():
    ax = create_map()
    title = f'distribution of station around China'
    ax.set_title(title, fontsize=18)

    df = pd.read_csv('buyo_position.csv')
    df['lon'] = df['lon'].astype(np.float64)
    df['lat'] = df['lat'].astype(np.float64)
    ax.scatter(
        df['lon'].values,
        df['lat'].values,
        marker='o',
        s=10 ,
        color ="blue"
    )
    for i, j, k in list(zip(df['lon'].values, df['lat'].values, df['name'].values)):
        ax.text(i - 0.8, j + 0.2, k, fontsize=6)
    plt.savefig('station_distribute_map.png')

if __name__ == '__main__':
    main()
Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)

资源获取

如果想获得本文全部代码及资源请后台发送“cartopy教程”

往期回顾

Python基础绘图教程(一)

Python基础绘图教程(二)

python绘图 | 国家气象局开源预报检验库(多图预警)

Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)


数据处理·机器学习·可视化

行业资讯·学习资料

Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)


Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)

分享

Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)

收藏

Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)

点赞

Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)

在看


原文始发于微信公众号(Clarmy吱声):Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月29日17:30:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python可视化 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少)http://cn-sec.com/archives/2441602.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息