由SRTM数据生成等高线(1)

 

一、可能有的步骤:

一方面:

1.熟悉SRTM数据的产生原理,数据结构,寻找下载数据的方式。

2.Dem和tif文件之间的相互转换

3.读取dem或者tif文件,提取需要的数据

4.将提取到的数据转换成需要的数据类型存储起来。

5.相关打开dem,tif的地理软件使用,用来查看文件,比较结果。

另一方面:

1.对于dem,tif的文件的读写,利用osgeo模块中的gdal

2.基于python语言数据的处理,常用模块例如:numpy,SciPy, Matplotlib,Pandas,处理上一步得到的数据。

扫描二维码关注公众号,回复: 2399530 查看本文章

3.根据数据绘制等高线,利用matplotlib,mpl_toolkits等模块对得到的数据绘制等高线。

 

 

 

二、两个简单demo:

# -*- coding: utf-8 -*-

"""

Created on Mon Jul 23 17:53:49 2018

 

@author: ruofei

"""

 

 

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()

from numpy import random

 

 

filePath = "1.tif"

 

 

dataset = gdal.Open(filePath)

adfGeoTransform = dataset.GetGeoTransform()

band = dataset.GetRasterBand(1)

 

ncols = dataset.RasterXSize

nrows = 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)   #

#生成二维数组

#

#print(X)

'''doc=open('out.txt','w')

for i in range(0,182):

    print(X[i])

doc.close()'''

 

Z = band.ReadAsArray(0, 0,ncols, nrows)

#Z = random.randint(1,2,size=(182,260))

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=(15,15))

ls = LightSource(270, 30)

 

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.title("llllllllll",fontsize=20)

plt.show()

plt.savefig("dfrg.png")

 

根据网上下载的山的tif文件绘制的地形图,其中需要的部分是初始对文件的读取,和对数据的提取部分,还有相关的坐标转换公式,转换到平面地图上表示,其中绘图的部分绘制的三位图形,这些命令和相关的模块不需要涉及,

生成的效果为,

 

 

Demo2:

一个生成简单等高线的程序:

# -*- coding: utf-8 -*-

"""

Created on Mon Jul 23 13:46:33 2018

 

@author: ruofei

"""

 

 

import numpy as np

import matplotlib.pyplot as plt

 

 

x = np.linspace(-3, 3, 5)

y = np.linspace(-3, 3, 5)

 

X, Y = np.meshgrid(x, y)

 

 

Height = [[1,1,1,1,1],[1,5,5,5,1],[1,5,10,5,1],[1,5,5,5,1],[1,1,1,1,1]]

 

 

plt.contourf(X, Y, Height, 3, alpha = 0.6, cmap = plt.cm.hot)

 

C = plt.contour(X, Y, Height, 3, colors = 'black', linewidth = 0.5)

 

plt.clabel(C, inline = True, fontsize = 10)

plt.show()

 

 

假设地图网格是一个5*5的网格,其中每个格子中的数字代表这一区域的高度,将

其设置成这样,可以想象到是一个中间高,两边低的山峰。绘制的结果大概如

 

 

 

在处理中尚未对等高的数据进行输出,对处于等高且可以连线的数据进行分组输出问题并没有解决。需要对地形数据进行更深地处理。

 

三、下载strm文件的方式

1. http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp

在网站地图中选择自己要下载的区域下载。

猜你喜欢

转载自blog.csdn.net/qq_33169543/article/details/81178382