700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python地理数据可视化

python地理数据可视化

时间:2024-01-01 00:20:10

相关推荐

python地理数据可视化

1.画一张世界地图

from mpl_toolkits.basemap import Basemapimport matplotlib.pyplot as plt# 1.简单显示一张世界地图# Basemap类,实例化map=Basemap()# drawcoastlines()方法画出海岸线,海岸线的数据已经默认包含在了库文件中map.drawcoastlines()map.drawcounties(linewidth=1)# 画国家分界线plt.show()

海岸线

画国家线(只显示了美国,并未显示其他,应该就是默认为美国)

2.画中国地图

(1)添加轮廓信息

# 2.显示中国地图from mpl_toolkits.basemap import Basemapimport matplotlib.pyplot as plt# plt.figure(figsize=(10, 6))# basemap学习网站:/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap# llcrnrlon:The lower left corner geographical longitude# llcrnrlat:The lower left corner geographical latitude# urcrnrlon: The upper right corner geographical longitude# urcrnrlat:The upper right corner geographical latitude# projection='lcc',lcc=Lambert Conformal兰伯特正形# lon_0The: longitude of the center of the map# lat_0The: latitude of the center of the map# 这个范围没看懂,中国最东端:东经135度2分30秒 黑龙江和乌苏里江交汇处;最西端:东经73度40分 帕米尔高原乌兹别里山口(乌恰县);最南端:北纬3度52分 南沙群岛曾母暗沙;最北端:北纬53度33分 漠河以北黑龙江主航道(漠河)。m = m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)m.drawcountries(linewidth=2)m.drawcoastlines()plt.show()

(2)添加省份信息

矢量文件获取在GADM数据库上(/download_country_v3.html),需要注意的是:GADM提供的中国国界数据不符合中国的领土主张(令人气氛的是:竟然把大陆和台湾省分开、并列了!!!),省界、市界、区界等数据也不一定是最新的版本。

# 3.添加省份信息import matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemap# plt.figure(figsize=(10, 6))m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)m.drawcountries(linewidth=2)m.drawcoastlines()China = "D:\ProfessionalProfile\VectorRelevant\GadmDatabase_China"# 加入中国大陆的省界m.readshapefile(China + '\\gadm36_CHN_shp\\gadm36_CHN_1', 'states', drawbounds=True)# 加入台湾的省界m.readshapefile(China + '\\gadm36_TWN_shp\\gadm36_TWN_1', 'taiwan', drawbounds=True)plt.show()

运行以后的效果:

(3)添加经纬度信息

# 4.添加经纬度信息import matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemapimport numpy as np# plt.figure(figsize=(10, 6))m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)m.drawcountries(linewidth=2.0)m.drawcoastlines()China = "D:\ProfessionalProfile\VectorRelevant\GadmDatabase_China"# 加入中国大陆的省界m.readshapefile(China + '\\gadm36_CHN_shp\\gadm36_CHN_1', 'states', drawbounds=True)# 加入台湾省的省界m.readshapefile(China + '\\gadm36_TWN_shp\\gadm36_TWN_1', 'taiwan', drawbounds=True)# 在地图上加上经纬度parallels = np.linspace(3, 55, 5) # 生成3到55之间的5个等差数列# labels = [left,right,top,bottom],左右上下顺序显示经纬度标识m.drawparallels(parallels, labels=[True, True, False, False])meridians = np.linspace(70, 140, 5) # 生成70到140之间的5个等差数列m.drawmeridians(meridians, labels=[False, False, True, True])plt.show()

(4)通过经纬度信息在地图上标注地点

# 4.通过经纬度信息标注点的信息import matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemapimport numpy as np# plt.figure(figsize=(10, 6))m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)m.drawcountries(linewidth=2.0)m.drawcoastlines()China = "D:\ProfessionalProfile\VectorRelevant\GadmDatabase_China"# 加入中国大陆的省界m.readshapefile(China + '\\gadm36_CHN_shp\\gadm36_CHN_1', 'states', drawbounds=True)# 加入台湾省的省界m.readshapefile(China + '\\gadm36_TWN_shp\\gadm36_TWN_1', 'taiwan', drawbounds=True)# 在地图上加上经纬度parallels = np.linspace(3, 55, 5) # 生成3到55之间的5个等差数列# labels = [left,right,top,bottom],左右上下顺序显示经纬度标识m.drawparallels(parallels, labels=[True, True, False, False])meridians = np.linspace(70, 140, 5) # 生成70到140之间的5个等差数列m.drawmeridians(meridians, labels=[False, False, True, True])# 选取国内部分城市的几个点(山东,北京,上海,新疆,云南)lon = [ 117.01601364, 116.41169930,121.47085058,87.63817375,102.87119717]lat = [36.66112420,39.90647577,31.26370378,43.86724567,24.92232261]lon, lat = m(lon, lat) # lon, lat为给定的经纬度,可以使单个的,也可以是列表m.scatter(lon, lat, s=50, color = "red",marker = '*') # 标注出所在的点,s为点的大小,还可以选择点的性状和颜色等属性plt.show()

运行结果:

3.应用

(1)亚洲主要城市及人口分布情况图

# 5.亚洲主要城市及人口分布情况图from mpl_toolkits.basemap import Basemapimport matplotlib.pyplot as pltimport numpy as np# /mighty13/article/details/11769?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control# rcParams是RcParams类的实例,结构类似于字典,用于处理matplotlib的默认运行时配置,它是matplotlib模块的全局变量。# 当导入matplotlib模块时,matplotlibrc文件中的所有rc 参数存储在matplotlib.rcParams中。plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号# 读取数据names = []pops = []lats = []lons = []countries = []# test_file.txt此处注意,txt文件在最后一个字符处就可以,不然会报错。file = open(r"D:\ProgramStudying\pyCharmPro\DataProcess0209\test_file.txt", encoding='utf-8').readlines()# 循环遍历每一行数据for line in file:# split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串info = line.split()names.append(info[0])pops.append(float(info[1]))lat = float(info[2][:-1]) # 读取纬度的数字部分if info[2][-1] == 'S':# 如果是南极则取负号lat = -latlats.append(lat)lon = float(info[3][:-1])if info[3][-1] == 'W':# 读取经度的数字部分lon = -lon + 360.0# 如果是西经则取负号lons.append(lon)country = info[4]countries.append(country)# plt.figure(figsize=(10, 6))# projection参数规定了投影方法。改变投影方法,绘图结果也将非常不同。# ortho:Orthographic正投影,见:/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap# lat_0=35, lon_0=120地图的投影中心map = Basemap(projection='ortho', lat_0=35, lon_0=120, resolution='l') # 实例化一个map# 画海岸线map.drawcoastlines(linewidth=0.5)# 画国家分界线map.drawcountries(linewidth=1.0)# 绘制地图投影区域的边缘(投影肢体)map.drawmapboundary(fill_color='#689CD2')# 每隔30度绘制纬度/经度网格线.map.drawmeridians(np.arange(0, 360, 30))map.drawparallels(np.arange(-90, 90, 30))# 用不同的颜色填满大陆map.fillcontinents(color='#BF9E30', lake_color='#689CD2', zorder=0)# 计算lat/lon网格的自然地图投影坐标.# 我们想要把经纬度对应图像的像素点,需要转换x, y = map(lons, lats)max_pop = max(pops)size_factor = 80.0y_offset = 15.0rotation = 30for i, j, k, name in zip(x, y, pops, names):size = size_factor*k/max_popcs = map.scatter(i, j, s=size, marker='o', color='#FF5600')plt.text(i, j+y_offset, name, rotation=rotation, fontsize=10)plt.title('亚洲主要城市与人口')plt.show()

测试文档

(2)绘制蓝色星球

# 6.绘制蓝色星球import matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemap# plt.figure(figsize=(8, 8))# 正射投影,投影原点设在西安# m = Basemap(projection='ortho', resolution='i', lat_0=34.36957249, lon_0=108.96078261)m = Basemap(projection='cyl', resolution='i', lat_0=34.36957249, lon_0=108.96078261)# https://basemaptutorial.readthedocs.io/en/latest/backgrounds.htmlm.bluemarble()plt.show()

Orthographic正投影

Cylindrical Equal Area投影

4.参考

1.知乎:/question/33783546/answer/775946401

2.GitHub上代码下载:/nancygaooo/Visualization-Practice

3.basemap学习网站:https://basemaptutorial.readthedocs.io/en/latest/basemap.html

4.主要参考CSDN用户“!一直向南走”进行测试:/qq_44205272/article/details/103100505

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。