爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 74115|回复: 50

[经验总结] 利用Python画中国地图外加站点分布

  [复制链接]

新浪微博达人勋

发表于 2017-3-21 14:39:09 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 xiuyuanyang 于 2017-3-21 15:21 编辑

最近在学习Python,通过上网搜集资料,最近利用Python简单画了一幅中国地图外加站点分布,程序很简单,把一些看到的好的材料分享给大家,希望能帮助一些人!
Matplotlib—basemap绘制中国地图
Basemap - plot on mapprojections (with coastlines and political boundaries) using matplotlib.
但是basemap并不是matplotlib默认安装的一部分。
Basemap<= =Matplotlib +python 2.5 (or later) + numpy + Geos (3.1.1 or later)
1、下载basemap
猎豹截图20170320111405.png
2、安装相关模块
2.1 我使用的是Anaconda,安装Anaconda后已集成了matplotlibPythonnumpy,所以可以直接在Anacondaprompt 中安装geosbasemap
指令很简单:conda install +package name(貌似无需第一步下载,Anaconda会自行下载获取安装包!?)

2.1.1 conda install geos
检查是否安装成功:
Conda list ,显示如下:
2.1.2 conda list basemap(时间较长)
2.2 如果没有安装Anaconda,可以执行第一步,下载basemap包,按照里面的readme文件,执行安装,依然先安装basemap所需的相关库(GEO包里也包含readme文件)
可以参考:
Windows下安装basemap
Linux下安装basemap


3、绘制地图
参考:
http://blog.csdn.net/zm714981790/article/details/51224650
matplotlib--basemap 官网

所需地理数据(.shp文件),下载地址:
https://www.statsilk.com/maps/download-free-shapefile-maps(里面包含下面的这个数据)


分享一个网上搜到的文章,写的很好,里面有我自己加的理解内容,因为初学Python,很多用于不专业,若有问题,请各位朋友指出!
代码如下:
import urllib
import numpy as np
import matplotlib
matplotlib.rcParams['toolbar'] ='None'
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.animation import FuncAnimation
import pandas as pd
import seaborn as sns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#posi=pd.read_csv("D:\\Files\\datasets\\CitiesLatLon_China.csv")
读取中国地理信息数据,格式为.shp/.csv
posi=pd.read_excel("D:\\Files\\datasets\\2015Cities-CHINA.xlsx")
读取中国人口和GDP信息数据(换成所需标出的站点数据,保存为txt格式)

lat = np.array(posi["lat"][0:120])               获取纬度值
lon = np.array(posi["lon"][0:120])              获取经度值
pop = np.array(posi["pop"][0:120],dtype=float)
获取人口数,转化为numpy浮点型
#gdp = np.array(posi["GDP"][0:120],dtype=float)
获取GDP,转化为numpy浮点型

size=(pop/np.max(pop))*100   
绘制散点图时图形的大小,如果之前pop不转换为浮点型,会没有大小不一的效果

#size=(gdp/np.max(gdp))*100   
绘制散点图时图形的大小,如果之前pop不转换为浮点型,会没有大小不一的效果
以上部分是读取设置标注在地图中的人口或是相关信息的操作,在此可以换做标注站点!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
以下部分绘制背景地图
map = Basemap(projection='stere', lat_0=35, lon_0=110, llcrnrlon=82.33,llcrnrlat=3.01, urcrnrlon=138.16, urcrnrlat=53.123, resolution='l', area_thresh=10000,rsphere=6371200.)
basemap参数介绍:
projection - themap projection. stere代表球面投影
llcrnrlat -latitude of lower left hand corner of the desired map domain (degrees).
urcrnrlat -latitude of upper right hand corner of the desired map domain (degrees).
llcrnrlon -longitude of lower left hand corner of the desired map domain (degrees).
urcrnrlon-longitude of upper right hand corner of the desired map domain (degrees).
resulution-resolutionof boundary database to use, c (crude), l (low), i (intermediate), h (high), f(full) or None.
map.drawcoastlines()  #画海岸线
map.drawcountries()  #画国界线
map.drawcounties()         #画县界限
map.readshapefile("D:\\GoogleDownload\\CHN_adm_shp\\CHN_adm1",'states',drawbounds=True)
# Read in shape file, optionally draw boundaries on map,注意:虽然程序里表明.shp文件,但是其他的.shx\.dbf等文件也要在同一文件夹下,否则shape文件读取报错!
map.drawmapboundary() #画中国内部区域,即省界线

parallels = np.arange(0.,90,10.) 创建纬线数组
map.drawparallels(parallels,labels=[1,0,0,0],fontsize=10)# 绘制纬线

meridians = np.arange(80.,140.,10.) 创建经线数组
map.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10)# 绘制经线
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
以下部分在背景地图上绘制表示各省市人口数的点
x,y = map(lon,lat) #现将各省市经纬度转换为投影坐标
注意:此处经纬度的位置,先经度,后纬度,不然程序不会报错,但是图上不会显示人口数的点!!
#map.scatter(x,y,edgecolors='r',facecolors='r',marker='*',s=320)

map.scatter(x,y,s=size)

plt.title("Population Distribution in China")
plt.show()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
最后,是我自己根据上面的内容写的绘制中国地图以及站点分布图,程序很简单,仅供参考,如有更好的方法或是关于图片问题,请指出,我们交流分享!
结果:
猎豹截图20170321142720.png
station_map.py (1.55 KB, 下载次数: 50, 售价: 3 贡献)

评分

参与人数 2金钱 +24 贡献 +8 收起 理由
Swallow + 10 很给力!
kongfeng0824 + 14 + 8 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-21 20:09:56 | 显示全部楼层
O(∩_∩)O谢谢!        
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-22 15:50:30 | 显示全部楼层
为何边界有粗有细?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-22 20:10:28 | 显示全部楼层
多谢楼主分享{:5_213:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-3-22 20:13:31 | 显示全部楼层
朝曦dawn 发表于 2017-3-22 15:50
为何边界有粗有细?

我觉得可能是画海岸线或是河流的线条设置问题,因为这个是直接用的map.drawcoastlines() 语句,我没改里面的参数设置。
我也是刚刚接触Python,这只是我个人的理解,如有不对请指出,共同学习,谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-23 15:13:32 | 显示全部楼层
xiuyuanyang 发表于 2017-3-22 20:13
我觉得可能是画海岸线或是河流的线条设置问题,因为这个是直接用的map.drawcoastlines() 语句,我没改里 ...

嗯,我最近也在学习,还在摸索这个粗细问题。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-26 08:29:29 | 显示全部楼层
一起学习,多多指教
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-27 16:05:37 | 显示全部楼层
不错。
但是basemap的国界底图是不对的,中国这块,少了藏南,还是要用咱们自己的shp文件。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-27 16:08:45 | 显示全部楼层
朝曦dawn 发表于 2017-3-23 15:13
嗯,我最近也在学习,还在摸索这个粗细问题。

粗细用linewidth控制就好啦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-27 16:34:33 | 显示全部楼层
谢谢楼主这么详细的分享
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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