如何使用python在特定区域(lat / lon)中绘制地理数据

时间:2017-08-14 14:51:44

标签: python gdal matplotlib-basemap

我有一个带有高程数据init的geotiff栅格数据集,我想在特定区域绘制它,例如60°E - 70°E,70°S - 80°E。

我有一些来自here的代码,但pcolormesh似乎无法绘制我的geotif.it全部为红色。 picture。该图片由imshow显示为really picture

当我尝试使用以下代码制作情节时:

path = "F:\\Mosaic_h1112v28_ps.tif"
dataset = gdal.Open(path)
data = dataset.ReadAsArray()
x0, dx, dxdy, y0, dydx, dy = dataset.GetGeoTransform()
nrows, ncols = data.shape
londata = np.linspace(x0, x0+dx*ncols)
latdata = np.linspace(y0, y0+dy*nrows)
lons, lats = np.meshgrid(lonarray, latarray)  
fig = plt.figure(figsize=(8, 8))
m = Basemap(projection='lcc', lon_0=67.5, lat_0=-68.5, height=950000,
            width=580000, resolution='h') 
m.drawcoastlines() 
x, y = m(lons, lats) 

然后我不知道如何继续它。我只想使用imshow,但imshow不要指定区域(纬度/经度)。

我将非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

这是我的解决方案。

1。导入GEOTIF文件并将其转换为二维数组数据

from osgeo import gdal
pathToRaster = r'./xxxx.tif'
raster = gdal.Open(pathToRaster,  gdal.GA_ReadOnly)
data = raster.GetRasterBand(1).ReadAsArray()
data = data[::-1]  

2。使用Pcolormesh

绘制它
kk = plt.pcolormesh(data,cmap = plt.cm.Reds,alpha = 0.45, zorder =2)

答案 1 :(得分:0)

这是一个很好的问题,这是我的解决方案。

必需的软件包: georaster 及其依赖项(gdal等) 可从http://dwtkns.com/srtm/

下载用于演示目的的数据
import georaster
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

fig = plt.figure(figsize=(8,8))

# full path to the geotiff file
fpath = r"C:\\path_to_your\geotiff_file\srtm_57_10.tif"  # Thailand east

# read extent of image without loading
# good for values in degrees lat/long
# geotiff may use other coordinates and projection
my_image = georaster.SingleBandRaster(fpath, load_data=False)

# grab limits of image's extent
minx, maxx, miny, maxy = my_image.extent

# set Basemap with slightly larger extents
# set resolution at intermediate level "i"
m = Basemap( projection='cyl', \
            llcrnrlon=minx-2, \
            llcrnrlat=miny-2, \
            urcrnrlon=maxx+2, \
            urcrnrlat=maxy+2, \
            resolution='i')

m.drawcoastlines(color="gray")
m.fillcontinents(color='beige')

# load the geotiff image, assign it a variable
image = georaster.SingleBandRaster( fpath, \
                        load_data=(minx, maxx, miny, maxy), \
                        latlon=True)

# plot the image on matplotlib active axes
# set zorder to put the image on top of coastlines and continent areas
# set alpha to let the hidden graphics show through
plt.imshow(image.r, extent=(minx, maxx, miny, maxy), zorder=10, alpha=0.6)

plt.show()

结果图:

enter image description here

<强> EDIT1

我的原始答案侧重于如何使用Basemap在最基本的投影上绘制简单的地理图像。如果没有访问所有必需的资源(即geotiff文件),就无法获得更好的答案。

我试着改善我的答案。

我已从全球geotiff文件中删除了一小部分内容。然后将其重新投影(扭曲)为由Basemap()定义的LCC投影规范以供使用。所有过程均使用GDAL软件完成。生成的文件名为“lcc_2.tiff”。使用此geotiff文件,可以使用以下代码完成图像的绘制。

最重要的部分是geotiff文件必须与Basemap使用的投影具有相同的坐标系(相同的投影)。

import georaster
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

fig = plt.figure(figsize=(8,8))

m = Basemap(projection='lcc', lon_0=67.5, lat_0=-68.5, \
            height=950000, width=580000, resolution='h')

m.drawcoastlines()
m.fillcontinents(color='beige')

image = georaster.SingleBandRaster( "lcc_2.tiff", latlon=False)
plt.imshow(image.r, extent=image.extent, zorder=10, alpha=0.6)

plt.show()

输出图:

enter image description here