Python绘制中国地图

这篇具有很好参考价值的文章主要介绍了Python绘制中国地图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 1. 导入库
import cartopy
import numpy as np
import pandas as pd
import proplot as pplt
import geopandas as gpd
import matplotlib.pyplot as plt
from proplot import rc
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.path as mpath
import cmaps
seis = cmaps.GMT_seis

# 导出指北针的库
import gma
import gma.extend.mapplottools as mpt
import gma.extend.arrayenhancement as aec

# 导入自定义色带
from colormaps import parula

rc["font.family"] = "TeX Gyre Schola"
rc['tick.labelsize'] = 10
rc["axes.labelsize"] = 12
rc["axes.labelweight"] = "light"
rc["tick.labelweight"] = "light"

2. 导入数据

# 加载数据
import geopandas as gpd
file = r".\China map\中国省级地图GS(2019)1719号.geojson"
nine = r".\China map\九段线GS(2019)1719号.geojson"
china_main = gpd.read_file(file)
china_nine = gpd.read_file(nine)
china_main.head()

china_shp = "./nc data/Data_ipynb/country1"

from netCDF4 import Dataset 
import xarray as xr
nc_file = r".\nc data\EC-Interim_monthly_2018.nc" 
ds = xr.open_dataset(nc_file) 
lat = ds.latitude 
lon = ds.longitude 
data = (ds['t2m'][0,::-1,:] - 273.15) # 把温度转换为℃

3. 南海九段线部分数据预处理

开始绘图之前需进行数据选择,即中国区域的数据,特别是绘制南海小地图的更需要,可避免一些问题(小地图上方出现完整地图)

#中国整体范围
lon_range1=lon[(lon>=70)&(lon<=138)]
lat_range1=lat[(lat>=3)&(lat<=55)]
#南海九段线范围
lon_range2=lon[(lon>=104)&(lon<=125)]
lat_range2=lat[(lat>=0)&(lat<=27)]

china_full = data.sel(longitude=lon_range1,latitude=lat_range1)
china_sub = data.sel(longitude=lon_range2,latitude=lat_range2)


china_full_lon = china_full.longitude.values
china_full_lat = china_full.latitude.values
china_full_data = china_full.values

china_sub_lon = china_sub.longitude.values
china_sub_lat = china_sub.latitude.values
china_sub_data = china_sub.values

levels = np.arange(-25, 25 + 1, 1)  
4. 定义掩膜方法,从全球的nc数据中,裁出中国地图部分的数据(根据shp文件裁剪nc数据)
def maskout_areas(originfig, ax, shp_path, proj=None):
    import shapefile
    import cartopy.crs as ccrs
    from matplotlib.path import Path
    #from cartopy.mpl.clip_path
    from matplotlib.patches import PathPatch
    #sf = shapefile.Reader(shp_path)
    sf = shapefile.Reader(shp_path,encoding='gbk')
    vertices = []
    codes = []
    for shape_rec in sf.shapeRecords():
        if shape_rec.record[2] == 'China':
            pts = shape_rec.shape.points
            prt = list(shape_rec.shape.parts) + [len(pts)]
            for i in range(len(prt) - 1):
                for j in range(prt[i], prt[i + 1]):
                    if proj:
                        vertices.append(proj.transform_point(pts[j][0], pts[j][1], ccrs.Geodetic()))
                    else:
                        vertices.append((pts[j][0], pts[j][1]))
                codes += [Path.MOVETO]
                codes += [Path.LINETO] * (prt[i + 1] - prt[i] - 2)
                codes += [Path.CLOSEPOLY]
            clip = Path(vertices, codes)
            clip = PathPatch(clip, transform=ax.transData)
    for contour in originfig.collections:
        contour.set_clip_path(clip)
5. 绘制填色地图
levels = np.arange(-25, 25 + 1, 1)  

projn = ccrs.LambertConformal(central_longitude=107.5, 
                              central_latitude=36,
                              standard_parallels=(25.0, 47.0)
                            )
fig = plt.figure(figsize=(4,3.5),dpi=120,facecolor="w")
ax = fig.add_subplot(projection=projn)
# cs = data.plot.contourf(ax=ax,levels=levels,cbar_kwargs=cbar_kwargs,
#                         cmap=parula,transform=ccrs.PlateCarree(),
#                        )
#自定义colorbar 参数
cs = china_full.plot.contourf(ax=ax,levels=levels,add_colorbar=False,
                        cmap=parula,transform=ccrs.PlateCarree(),
                       )
# #basemask(ax=ax, cs=cs,shp=china_shp)
maskout_areas(originfig=cs,ax=ax,shp_path=china_shp,proj=projn)

ax.set_facecolor('#BEE8FF')
ax.spines['geo'].set_linewidth(0.5)
#ax.stock_img()
ax.set_extent([80, 130, 16, 52.5], crs=ccrs.PlateCarree())
ax.coastlines(linewidth=0.3,zorder=20)
ax.add_feature(cfeature.LAND, facecolor='white')
ax.add_feature(cfeature.LAKES.with_scale('110m'), facecolor='#BEE8FF')
#添加geopandas 读取的地理文件
ax.add_geometries(china_main["geometry"],crs=ccrs.PlateCarree(),
                  fc="None",ec="k",linewidth=.2)
ax.add_geometries(china_nine["geometry"],crs=ccrs.PlateCarree(),
                  fc="None",ec="black",linewidth=.3)
#设置标题
ax.set_title("Example Of China Lambert Projection")
gls = ax.gridlines(draw_labels=True, crs=ccrs.PlateCarree(), 
                   color='gray', linestyle='dashed', linewidth=0.2, 
                   y_inline=False, x_inline=False,
                   rotate_labels=0,xpadding=5,
                   xlocs=range(-180,180,10), ylocs=range(-90,90,5),
                   xlabel_style={"size":8,"weight":"bold"},
                   ylabel_style={"size":8,"weight":"bold"}
                  )
gls.top_labels= False                      
gls.right_labels=False

#添加南海小地图
# 定位南海子图的位置,四个数字需要调整
# 四个数字分别是(left, bottom, width, height):
# 子图左下角水平方向相对位置,左下角垂直方向相对位置,子图宽,子图高
ax2 = fig.add_axes([0.74, 0.24, 0.1, 0.25], projection = projn)
ax2.set_extent([104.5, 124, 0, 26],crs=ccrs.PlateCarree())
#ax2.set(xlim=(104.5, 125),ylim=(0, 26))
ax2.set_facecolor('#BEE8FF')
ax2.spines['geo'].set_linewidth(0.4)

cs2 = china_sub.plot.contourf(ax=ax2,levels=levels,add_colorbar=False,
                        cmap=parula,transform=ccrs.PlateCarree(),
                       )
#basemask(ax=ax2, cs=cs2,shp=china_shp)
maskout_areas(originfig=cs2,ax=ax2,shp_path=china_shp,proj=projn)
ax2.set_title("")

# 设置网格点
lb=ax2.gridlines(draw_labels=False,x_inline=False, y_inline=False,
                 linewidth=0.1, color='gray', alpha=0.8, 
                 linestyle='--' )
ax2.add_geometries(china_main["geometry"],crs=ccrs.PlateCarree(),
                  fc="None",ec="k",linewidth=.3)
ax2.add_geometries(china_nine["geometry"],crs=ccrs.PlateCarree(),
                  fc="None",ec="black",linewidth=.5)
ax2.add_feature(cfeature.LAND, facecolor='w')

## n.1 添加指北针
mpt.AddCompass(ax, LOC = (0.07, 0.86), SCA = 0.04, FontSize = 8)
## n.2 添加比例尺
mpt.AddScaleBar(ax, LOC = (0.2, 0.05), SCA = 0.12, FontSize = 6, 
                UnitPad = 0.2, BarWidth = 0.6)

cbar = fig.colorbar(cs,ax=ax,orientation='horizontal',
                    shrink=0.65,aspect=25,pad=.08)
cbar.ax.tick_params(labelsize=7.5,direction="in")
cbar.ax.tick_params(which="minor",direction="in")
#cbar.ax.xaxis.set_ticks_position('top')
cbar.set_label("Temperature (℃)",fontsize=9)
#cbar.ax.set_title("Sea Surface Temperature(m)",fontsize=9)
cbar.outline.set_linewidth(.4)
#plt.tight_layout()

python绘制中国地图,python,开发语言

 文章来源地址https://www.toymoban.com/news/detail-736346.html

到了这里,关于Python绘制中国地图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android Framework系列】第13章 SVG矢量图形自定义组件(绘制中国地图)

    本章节我们来了解下什么是 SVG 矢量图形,怎么通过 SVG 实现图形的绘制,通过 SVG 实现不规则的自定义控件,项目实现一个中国地图,实现每个省都能够点击,项目地址在文末请自取。 SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的基于矢量的图形 SVG 使用

    2024年02月10日
    浏览(63)
  • 手把手教 Vue3.2+Vite+Echarts 5 绘制3D线条效果中国地图

    本篇文章介绍 Vue3.2+Vite 项目内使用 Echarts 5 绘制中国地图,标记分布点!之前没有接触过 Echarts 的,可以先去官方示例看看,里面图形特别齐全。但是官方文档看着费劲的,太多了根本记不住,所以自己做个总结,下次就可以直接使用了,不用做重复无用功。 1、下载并引入

    2024年02月04日
    浏览(53)
  • Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图,Android面试中常问的MMAP到底是啥东东

    iv.setImageDrawable(animatedVectorDrawable) val animatable = iv.drawable as Animatable animatable.start() } } 输入搜索动画 利用在线绘制 SVG 图标网站 制作搜索图标 可以自己随意捣鼓绘制,绘制好了之后点击视图-源代码,将 SVG 代码复制出来保存成 search_svg.xml 在线转换 svg2vector 点击空白或者直接将

    2024年04月25日
    浏览(50)
  • html Antv L7 + mapbox 实现3D地图 3D中国地图 不限于中国地图

    echarts的3D地图实在太丑了,还一堆bug 使用阿里的Antv可视化库L7,实现3D地图,底图是mapbox 参考示例:https://l7.antv.antgroup.com/zh/examples/polygon/3d#floatMap 如果不需要底图样式,可把Scene的style设置为blank 直接上代码了,vue的就不说了,项目是html的 mapbox依赖 L7依赖 body元素 实现

    2024年02月14日
    浏览(51)
  • Echarts中国地图与世界地图实战

    Echarts中中国地图与世界地图实战,完整代码。 其中 china.js 与 world.js 两个文件已通过CDN的方法给出,而 echarts.js 大家可以自行去官网下载。 echarts.js是百度团队推出的一款用于图表可视化的插件,用于以图表的形式展现数据,功能强大,上手简单。 版本区别: 1.完全版:ec

    2024年02月03日
    浏览(90)
  • echarts实现中国地图记录篇之2D,3D地图

    工具: 实现2D平面地图需要用到的包为:echarts 实现3D地图需要用到的包为:echarts,echarts-gl 版本 —— echarts5.0+和5.0以下版本的差异: echarts 5.0以下的版本,做中国地图,推荐使用\\\"echarts\\\": \\\"^4.9.0\\\"版本,安装、引入和使用方式,如下: Echarts官方在5+版本中移除了echarts/map/js/china.

    2023年04月08日
    浏览(37)
  • SVG实现中国地图

    1.SVG是什么? svg 是Scalable Vector Graphics的缩写,指可伸缩矢量图形,可以用于绘制复杂不规则的控件。 svg绘制原理,就是利用了Path绘制图形。 1)svg利用xml定义图形。在xml中就包晗了绘制Path所需的数据。 2)加载xml中的PathData,转换成Path对象。 3)利用Canvas,把Path绘制在屏幕

    2024年02月04日
    浏览(40)
  • 大屏echarts示例------中国地图

    最近做了几个大屏,有很多echarts图表,挑重要的记录一下: 1. 中国地图 首先要找一个json文件,包含中国地区内所有地方的经纬度和名称等,初始化地图的时候需要 这里的city就是我的json文件。在上方引入即可 这里我把它放在和大屏index同目录下了,注意引入时的路径 然后

    2024年02月03日
    浏览(52)
  • ECharts 图表简单示例,中国地图

    2024年01月25日
    浏览(53)
  • Flutter中实现中国省份地图

    效果展示(这里只展示局部,完全展示违规): 可以点击省份改变颜色,更多功能可以自行拓展。 注:非完整中国地图!!! 本文用于记录在Flutter项目中安卓端实现中国地图,因为实现过程是通过Flutter调用安卓原生代码实现,所以IOS端不可用,通过本文你还可以学会如何通过

    2024年01月25日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包