首页 > 其他分享 >栅格数据

栅格数据

时间:2024-02-23 16:14:24浏览次数:22  
标签:10 plt 栅格数据 flatten 90 np import

      “栅格”还起源于电视技术,一种扫描模式(如阴极射线管中的电子束),其中从上到下成行从一侧到另一侧扫描一个区域。

从栅格这个词的来源,我们可以看出耕地和电视扫描,都是在进行一种网格化的过程。

这种网格化的结果:

产生了由像素(微小的彩色方块)网格构建的图像,这种图像就是栅格图像。

 

     Google 地球等工具中查看过照片或图像,那么您之前就已经查看过并使用过栅格。

但是,栅格数据与照片不同,因为它们是空间参考的。每个像素代表地面上的一块土地。

地理空间栅格与数码照片的唯一不同之处在于它将数据连接到特定位置的空间信息。

 创建两个ndarray对象,一个X跨越 [-90°,90°] 经度,并Y覆盖 [-90°,90°] 纬度。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')

x = np.linspace(-90, 90, 6)
y = np.linspace(90, -90, 6)
X, Y = np.meshgrid(x, y)

plt.figure(figsize=(6, 4))

# 散点图表示网格坐标
plt.scatter(X, Y)

# 绘制垂直线
for i in range(len(x)):
    plt.vlines(x[i], ymin=min(Y.flatten()), ymax=max(Y.flatten()), colors='r', linestyles='-.', linewidth=0.5)

# 绘制水平线
for i in range(len(y)):
    plt.hlines(y[i], xmin=min(X.flatten()), xmax=max(X.flatten()), colors='g', linestyles='-.', linewidth=0.5)

plt.show()
View Code

 生成温度栅格数据:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.use('TkAgg')
x = np.linspace(-90, 90, 6)
y = np.linspace(90, -90, 6)
X, Y = np.meshgrid(x, y)

Z1 = np.abs(((X- 10) ** 2 + (Y - 10) ** 2) / 1 ** 2)
Z2 = np.abs(((X+ 10) ** 2 + (Y + 10) ** 2) / 2.5 ** 2)
Z = (Z1 - Z2)

plt.imshow(Z)
plt.title("Temperature")
for i in range(len(x)):
    plt.vlines(x[i], ymin=min(Y.flatten()), ymax=max(Y.flatten()), colors='r', linestyles='-.', linewidth=0.5)

# 绘制水平线
for i in range(len(y)):
    plt.hlines(y[i], xmin=min(X.flatten()), xmax=max(X.flatten()), colors='g', linestyles='-.', linewidth=0.5)

plt.show()
View Code

 

生成了z数组,它具有6行、6列。

当我们不对这组数据做任何处理,可以看出,这组数据处于网格的中心位置,Z不包含有关其位置的数据

它目前的位置是它本身的行列号,比如放大上图,可以看到,它的左上角位置为(0,0)。

这与在python里查看数组z,它的行列号索引一样。

 

有了数组z,这是数据。

生成了一个网格,这个网络的一些坐标存储在(X,Y)。

需要将数据与网格建立联系:

  1. 定义左上角的坐标,比如我们可以定义数据的左上角坐标为(90°,90°),就像下面程序:Affine.translation(x[0], y[0])
  2. 定义单元分辨率,也就是数据的1格和网络上的1格之间的比例关系,比如我们定义数据的1格就是1°,那么我们就可以继续写程序,Affine.translation(x[0], y[0]) * Affine.scale(1, 1)
  3. 实现数据和网络的关联,通过rasterio库创建一个栅格数据,把它的transform设置为我们定义好的左上角坐标和单元分辨率。
    • rio.open() 函数打开或创建一个 Rasterio 数据集。在这里,它创建一个新的 GeoTIFF 文件用于写入数据。
    • driver="GTiff":指定输出文件类型为 GeoTIFF。
    • height=Z.shape[0] 和 width=Z.shape[1]:指定输出栅格数据的高度和宽度,即数组 Z 的形状。
    • count=1:指定数据集中的波段数量,这里是一个单波段数据。
    • dtype=Z.dtype:指定输出数据的数据类型,与数组 Z 的数据类型相同。
    • crs="+proj=latlong":指定输出数据的坐标参考系统(Coordinate Reference System,CRS),这里是经纬度投影。
    • transform=transform1:定义输出栅格数据的空间参考,包括位置和分辨率。
      from rasterio.transform import Affine
      import rasterio as rio
      import numpy as np
      x = np.linspace(-90, 90, 6)
      y = np.linspace(90, -90, 6)
      X, Y = np.meshgrid(x, y)
      Z1 =np.abs(((X - 10) ** 2 + (Y - 10) ** 2) / 1 ** 2)
      Z2 =np.abs(((X + 10) ** 2 + (Y + 10) ** 2) / 2.5 ** 2)
      Z =(Z1 - Z2)
      res = (x[-1] - x[0]) / 240.0
      res=10
      transform = Affine.translation(x[0] - res / 2, y[0] - res / 2) * Affine.scale(res, res)
      transform1 = Affine.translation(x[0], y[0]) * Affine.scale(1, 1)
      # open in 'write' mode, unpack profile info to dst
      from pathlib import Path
      
      folder_path = Path('D:/modis/')
      file_name = 'new_raster.tif'
      full_path = folder_path / file_name
      
      # 检查路径是否存在
      if not folder_path.exists():
          folder_path.mkdir(parents=True)  # 如果文件夹不存在,创建文件夹
      
      with rio.open(
          "D:/python/modis/new_raster3.tif",
          "w",
          driver="GTiff",         # output file type
          height=Z.shape[0],      # shape of array
          width=Z.shape[1],
          count=1,                # number of bands
          dtype=Z.dtype,          # output datatype
          crs="+proj=latlong",    # CRS
          transform=transform1,    # location and resolution of upper left cell
      ) as dst:
          # check for number of bands
          if dst.count == 1:
              # write single band
              dst.write(Z, 1)
          else:
              # write each band individually
              for band in range(len(Z)):
                  # write data, band # (starting from 1)
                  dst.write(Z[band], band + 1)
      View Code

       

标签:10,plt,栅格数据,flatten,90,np,import
From: https://www.cnblogs.com/shiningleo007/p/18029792

相关文章

  • python处理栅格数据
    字节序列:ReadRaster([xoff],[yoff],[xsize],[ysize],[buf_xsize],[buf_ysize],[buf_type],[band_list],[buf_pixel_space],[buf_line_space],[buf_band_space])xoff是列读取起点,默认值为0。yoff是行读取起点,默认值为0。xsize是读取的列数,默认为全部读取。ysize是读取的......
  • 【Python&RS】栅格数据/图片位深度(bit)转换
    ​    关于栅格数据/图片的位深度(eg.8bit、16bit、32bit)转换之前我就发过一篇文章,【Python&RS】基于GDAL栅格数据/图片位深度(bit)转换。但是最近在使用的时候发现好像效果不行,有时候转换不成功,所以自己又研究了一下原理重新写了一份代码。今天就和大家分享一下如何使用Py......
  • 【Python&RS】基于Python对栅格数据进行归一化(统一量纲至0~1)
            有段时间没有更新Python处理栅格、矢量数据了,一部分是因为之前基本上已经把如何使用Python处理地理数据的方法覆盖完了,另一部分是因为最近有其他方面的知识需要学习和巩固。也是赶巧,最近有个项目需要构建模型对影像进行反演需要用到归一化,所以就编了一段代码,今......
  • 【Python&RS】基于Python批量镶嵌拼接遥感影像/栅格数据
    ​    我之前分享过【Python&RS】基于GDAL镶嵌拼接遥感影像,但是没有加入批量处理的代码。最近正好有这个需求,所以就对原来的代码进行了优化加入了批量拼接的代码。现在只需输入一个文件夹即可将其中的影像全部镶嵌起来。 一、导入GDAL库fromosgeoimportgdal二......
  • 【Python&RS】基于GDAL栅格数据/图片位深度(bit)转换
    ​    最近在用OpenCv库处理图片时发现cv库无法读取64位的tif影像,所有想通过Python将64位的图片转换成8位的。今天就跟大家分享一下如何利用Python的GDAL库,实现栅格数据/图片的位深度转换。        在数字图像处理中,我们常常会听到不同的位数术语,比如64位、16......
  • 【Python&RS】基于GDAL修改栅格数据的DN值
    ​    遥感工作者离不开栅格数据,有时候我们可能需要修改栅格数据的值,但ENVI和ArcGIS中并没有直接修改DN值的工具,只有栅格计算器、Bandmath这些工具去计算整个波段的值,或者EditClassificationImage工具可以修改ENVI分类后的像元值,但这个工具只对分类格式有效,博主整不......
  • 【854】通过polygon切取tif栅格数据
    参考:CuttingapolygonfromTIFFwithPython[closed]importrasterioimportrasterio.maskimportgeopandasasgpddataset=rasterio.open("wc2.1_10m_elev.tif")gdf_africa=gpd.read_file("africa1_map.gpkg")poly=gdf_africa.loc[0,&......
  • Cesium中显示栅格数据查询结果
    Cesium通过wms或者wmts服务加载发布的矢量数据,点选数据时会有一个属性框,如图:而对于栅格数据则不会出现这个框,为了解决这个问题,需要创建一个空的Entity,当点击时就会出现这个框了。像这样: 实现方法参考了geoserver里面基于openlayer的图层预览:url=url+......
  • Python批量读取HDF多波段栅格数据并绘制像元直方图
      本文介绍基于Python语言gdal模块,实现多波段HDF栅格图像文件的读取、处理与像元值可视化(直方图绘制)等操作。  另外,基于gdal等模块读取.tif格式栅格图层文件的方法可......
  • 遥感数据机器学习的准备工作:python将栅格数据提取至EXCEL
    大部分我们处理的降水、气温等栅格数据的格式是nc形式,需要我们将他转换成栅格数据并导入至Arcgis中,进行下一步操作。之后我们根据自己的研究区进行裁剪【SpatialAnalyst......