python怎么绘制中国地图
这篇文章主要讲解了“python怎么绘制中国地图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python怎么绘制中国地图”吧!
成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的泌阳网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
前言
气象、海洋、地球科学相关的分析必然少不了地图的可视化。
Python中我常用的绘制地图和空间信息分析的库是Cartopy。
Cartopy有一个非常严重的问题,那就是自带的中国国界数据有问题,这也是很多国外开源库的普遍问题。
在做中国区域的分析时,由于九段线的位置很偏南,因此最标准的做法是同时绘制南海区域的子图。
在做一些站点展示的时候,如果只单独画上几个站点总觉得很丑,可以加上一些地形背景。
综上,今天想要用一个小例子解决这3个问题:
正确的中国国界线及九段线绘制 南海小地图绘制 全球地形图添加
准备工作
获取正确的中国矢量文件:公众号后台留言“中国行政区划”
(这个矢量文件来自资源环境平台,并和权威机构的标准地图做了比对,吻合一致。)获取全球地形图像:公众号后台留言“全球地形”
(提供的是全球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=(6, 8), dpi=400) # 创建页面
ax = fig.subplots(1, 1, 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([105, 133, 15, 45])
# ax.stock_img()
ax.imshow(
imread('./NE1_50M_SR_W.tif'),
origin='upper',
transform=proj,
extent=[-180, 180, -90, 90]
)
# --设置网格点属性
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(95, 145 + 5, 5))
gl.ylocator = mticker.FixedLocator(np.arange(-5, 45 + 5, 5))
# --设置小地图
left, bottom, width, height = 0.67, 0.15, 0.23, 0.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([105, 125, 0, 25])
# ax2.stock_img()
ax2.imshow(
imread('./NE1_50M_SR_W.tif'),
origin='upper',
transform=proj,
extent=[-180, 180, -90, 90]
)
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怎么绘制中国地图”的内容了,经过本文的学习后,相信大家对python怎么绘制中国地图这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
本文标题:python怎么绘制中国地图
网站网址:http://scyanting.com/article/pjdcdi.html