如何使用 matplotlib 通过 gdal 打开栅格图
How a plot a raster opened through gdal using matplotlib
我有一个 .tif 文件,我尝试(我没有收到错误代码......但我不确定它是否有效)使用以下代码使用 gdal geotransform 函数进行地理配准:
raster = gdal.Open("drive/My Drive/raster.tif")
geotransform = raster.GetGeoTransform()
gt = list(geotransform)
gt[0] = -71.9002
gt[3] = 41.8738
gt[2] = 0
gt[4] = 0
gt[1] = 50
gt[5] =-50
然后我尝试绘制它:
fig, ax = plt.subplots(figsize = (10,10))
rasterio.plot.show(raster, ax=ax)
plt.show()
但得到以下内容:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-70-d9daf3e89a18> in <module>()
1 minx, miny, maxx, maxy = ri.geometry.total_bounds
2 fig, ax = plt.subplots(figsize = (10,10))
----> 3 rasterio.plot.show(raster, ax=ax)
4 plt.show()
5 frames
/usr/local/lib/python3.7/dist-packages/matplotlib/image.py in set_data(self, A)
692 not np.can_cast(self._A.dtype, float, "same_kind")):
693 raise TypeError("Image data of dtype {} cannot be converted to "
--> 694 "float".format(self._A.dtype))
695
696 if not (self._A.ndim == 2
TypeError: Image data of dtype object cannot be converted to float
谁能帮我弄清楚我是否正确地进行了地理变换以及如何绘制它?
原始文件是一个名为“Bathymetry(以米为单位的深度)”的 .e00 文件(可用here),我必须使用 arcmap 将其转换为 .tif。
Matplotlib 需要一个 Numpy 数组,而不是一个 GDAL 数据集对象。因此,您需要先从数据集中读取数据(使用 .ReadAsArray()
),然后再使用 Matplotlib 对其进行绘图。
infile = r'/vsizip/C:\Temp\bathygridm.zip/bathygridm.e00'
ds = gdal.OpenEx(infile)
gt = ds.GetGeoTransform()
nodata = ds.GetRasterBand(1).GetNoDataValue()
data = ds.ReadAsArray()
ds = None
屏蔽无数据值:
data = np.ma.masked_values(data, nodata)
计算范围:
ys, xs = data.shape
ulx, xres, _, uly, _, yres = gt
extent = [ulx, ulx+xres*xs, uly, uly+yres*ys]
并绘制结果:
fig, ax = plt.subplots(figsize=(5,6), constrained_layout=True, facecolor='w', dpi=86)
cmap = mpl.cm.get_cmap("viridis").copy() # cmap = plt.cm.viridis
cmap.set_bad('#dddddd')
im = ax.imshow(data, extent=extent, cmap=cmap)
cb = fig.colorbar(im, shrink=.5)
cb.set_label('Bathymetry [m]')
我有一个 .tif 文件,我尝试(我没有收到错误代码......但我不确定它是否有效)使用以下代码使用 gdal geotransform 函数进行地理配准:
raster = gdal.Open("drive/My Drive/raster.tif")
geotransform = raster.GetGeoTransform()
gt = list(geotransform)
gt[0] = -71.9002
gt[3] = 41.8738
gt[2] = 0
gt[4] = 0
gt[1] = 50
gt[5] =-50
然后我尝试绘制它:
fig, ax = plt.subplots(figsize = (10,10))
rasterio.plot.show(raster, ax=ax)
plt.show()
但得到以下内容:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-70-d9daf3e89a18> in <module>()
1 minx, miny, maxx, maxy = ri.geometry.total_bounds
2 fig, ax = plt.subplots(figsize = (10,10))
----> 3 rasterio.plot.show(raster, ax=ax)
4 plt.show()
5 frames
/usr/local/lib/python3.7/dist-packages/matplotlib/image.py in set_data(self, A)
692 not np.can_cast(self._A.dtype, float, "same_kind")):
693 raise TypeError("Image data of dtype {} cannot be converted to "
--> 694 "float".format(self._A.dtype))
695
696 if not (self._A.ndim == 2
TypeError: Image data of dtype object cannot be converted to float
谁能帮我弄清楚我是否正确地进行了地理变换以及如何绘制它?
原始文件是一个名为“Bathymetry(以米为单位的深度)”的 .e00 文件(可用here),我必须使用 arcmap 将其转换为 .tif。
Matplotlib 需要一个 Numpy 数组,而不是一个 GDAL 数据集对象。因此,您需要先从数据集中读取数据(使用 .ReadAsArray()
),然后再使用 Matplotlib 对其进行绘图。
infile = r'/vsizip/C:\Temp\bathygridm.zip/bathygridm.e00'
ds = gdal.OpenEx(infile)
gt = ds.GetGeoTransform()
nodata = ds.GetRasterBand(1).GetNoDataValue()
data = ds.ReadAsArray()
ds = None
屏蔽无数据值:
data = np.ma.masked_values(data, nodata)
计算范围:
ys, xs = data.shape
ulx, xres, _, uly, _, yres = gt
extent = [ulx, ulx+xres*xs, uly, uly+yres*ys]
并绘制结果:
fig, ax = plt.subplots(figsize=(5,6), constrained_layout=True, facecolor='w', dpi=86)
cmap = mpl.cm.get_cmap("viridis").copy() # cmap = plt.cm.viridis
cmap.set_bad('#dddddd')
im = ax.imshow(data, extent=extent, cmap=cmap)
cb = fig.colorbar(im, shrink=.5)
cb.set_label('Bathymetry [m]')