Python的地形三维可视化Matplotlib和gdal使用实例


Posted in Python onDecember 09, 2017

我是以Python开门的,我还是觉得Python也可以进行地形三维可视化,当然这里需要借助第三方库,so,我就来介绍:Python一个很重要可视化插件,Matplotlib。

Matplotlib是Python最著名的绘图库,它提供了一整套友好的命令,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。你会发现Matplotlib和matlab相似,但是你知道matlab强大是很强大,但是安装包就有7G,一下就让我失去玩弄他的兴趣。

Matplotlib的二维图形非常成熟,可以做各种各样的报表,比如:

Python的地形三维可视化Matplotlib和gdal使用实例

好吧,额,....... Matplotlib当然也可以做3维数据。首先准备了一份样例,珠穆朗姆峰周围地势的dem数据,我在arcsense进行拉伸显示,初步看看效果:

Python的地形三维可视化Matplotlib和gdal使用实例

讲这份数据,输入编写好的相关路径,然后经过简单的三维渲染:

Python的地形三维可视化Matplotlib和gdal使用实例

Matplotlib只是一个可视化包,不能直接识别栅格数据,所以这边还用到另外一个包---gdal,开源栅格空间数据转换库,他的本体竟然还是c++,也开放了一个Python框架,这算是向Python投诚嘛?

好吧,开源一下用Matplotlib和gdal包进行地形三维可视化的小脚本:

# -*- coding: gbk -*-
from mpl_toolkits.mplot3d import Axes3D
from Matplotlib import cbook
from Matplotlib import cm
from Matplotlib.colors import LightSource
import Matplotlib.pyplot as plt
import numpy as np
from osgeo import gdal
gdal.AllRegister()

filePath = u"E:\桌面\dem实验/Himalaya.tif" #输入你的dem数据
dataset = gdal.Open(filePath)
adfGeoTransform = dataset.GetGeoTransform()
band = dataset.GetRasterBand(1)  #用gdal去读写你的数据,当然dem只有一个波段
nrows = dataset.RasterXSize 
ncols  = dataset.RasterYSize  #这两个行就是读取数据的行列数
Xmin = adfGeoTransform[0] #你的数据的平面四至
Ymin = adfGeoTransform[3]
Xmax = adfGeoTransform[0] + nrows * adfGeoTransform[1] + ncols * adfGeoTransform[2]
Ymax = adfGeoTransform[3] + nrows * adfGeoTransform[4] + ncols * adfGeoTransform[5]
x = np.linspace(Xmin,Xmax, ncols)
y = np.linspace(Ymin,Ymax, nrows)
X,Y = np.meshgrid(x, y)
Z = band.ReadAsArray(0, 0,nrows, ncols) #这一段就是讲数据的x,y,z化作numpy矩阵
region = np.s_[10:400,10:400]
X, Y, Z = X[region], Y[region],Z[region]
fig, ax = plt.subplots(subplot_kw=dict(projection='3d'), figsize=(12,10))
ls = LightSource(270, 20)  #设置你可视化数据的色带
rgb = ls.shade(Z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode='soft')
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=rgb,
            linewidth=0, antialiased=False, shade=False)
plt.show() #最后渲染出你好看的三维图吧

Python的地形三维可视化Matplotlib和gdal使用实例

Python的地形三维可视化Matplotlib和gdal使用实例

最后是虾神的话:GDAL在python里面的安装,属于灰常纠结的事情,运气好(人品好)可能一下就成功,运气不好,可能死活就装不上……如果遇上死活装不上的,可以考虑用MinGW自己进行编译。

如果不想用gdal来实现以上效果,可以考虑用arcpy的RasterToNumpy来把tif文件读成矩阵,也可以实现。

总结

以上就是本文关于Python的地形三维可视化Matplotlib和gdal使用实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
遗传算法python版
Mar 19 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
pandas 时间格式转换的实现
Jul 06 Python
python获取Pandas列名的几种方法
Aug 07 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
Aug 09 Python
基于python连接oracle导并出数据文件
Apr 28 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
Python torch.flatten()函数案例详解
Aug 30 Python
python和anaconda的区别
May 06 Python
python登录并爬取淘宝信息代码示例
Dec 09 #Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 #Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 #Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 #Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 #Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 #Python
python爬取亚马逊书籍信息代码分享
Dec 09 #Python
You might like
PHP初学者头疼问题总结
2006/07/08 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php 强制下载文件实现代码
2013/10/28 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
PHP生成器简单实例
2015/05/13 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
简单JS代码压缩器
2006/10/12 Javascript
关于js datetime的那点事
2011/11/15 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
理解javascript异步编程
2016/01/27 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
python实现随机梯度下降法
2020/03/24 Python
python实现大文件分割与合并
2019/07/22 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
计算机科学与技术应届生求职信
2013/11/07 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
食品安全主题班会
2015/08/13 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
小学英语新课改心得体会
2016/01/22 职场文书