当前位置: 首页 > 知识库问答 >
问题:

将shapefile对齐到光栅并将值分配给覆盖,然后作为数组返回?

墨宜人
2023-03-14

我的目标是将shapefile与光栅底图对齐,将1指定给重叠的单元格,将0指定给不重叠的单元格,最终返回一个包含lat、lon、time和二进制变量(1/0)的数组。

计划如下:1)从阵列创建区域光栅,2)光栅化多边形形状文件,3)将光栅化形状文件与基础光栅对齐,4)重叠的像素将被指定为1,不重叠的像素将被指定为0,5)将光栅转换为阵列。

我已经完成了第一步

你可以在这里找到这些文件:https://www.dropbox.com/sh/pecptfepac18s2y/AADbxFkKWlLqMdiHh-ICt4UYa?dl=0

下面是我用来创建BC平面网格作为底图的代码

import gdal, osr
import numpy as np

#define parameters
#units = km
grid_size = 5
BC_width  = 700
BC_length = 1800

def array2raster(newRasterfn,rasterOrigin,pixelWidth,pixelHeight,array):
    
    cols = array.shape[1]
    rows = array.shape[0]
    originX = rasterOrigin[0]
    originY = rasterOrigin[1]
    
    driver = gdal.GetDriverByName('GTiff')
    outRaster = driver.Create(newRasterfn, cols, rows, 1, gdal.GDT_Byte)
    outRaster.SetGeoTransform((originX, pixelWidth, 0, originY, 0, pixelHeight))
    outband = outRaster.GetRasterBand(1)
    outband.WriteArray(array)
    outRasterSRS = osr.SpatialReference()
    outRasterSRS.ImportFromEPSG(4326)
    outRaster.SetProjection(outRasterSRS.ExportToWkt())
    outband.FlushCache()



def main(newRasterfn,rasterOrigin,pixelWidth,pixelHeight,array):
    reversed_arr = array[::-1] # reverse array so the tif looks like the array
    array2raster(newRasterfn,rasterOrigin,pixelWidth,pixelHeight,reversed_arr) # convert array to raster



if __name__ == "__main__":
    array = np.zeros([int(BC_length/grid_size),int(BC_width/grid_size)])  #140x360
    for i in range(1,100):
        array[i] = 100
    rasterOrigin = (-139.72938, 47.655534) #lower left corner of raster
    newRasterfn = '/temp/test.tif'
    cols = array.shape[1] #shape of an array (aka # of elements in each dimension)
    rows = array.shape[0]
    originX = rasterOrigin[0]
    originY = rasterOrigin[1]
    pixelWidth = 5
    pixelHeight = 5

下面是我用来栅格化多边形形状文件的代码

import ogr, gdal, osr

output_raster = '/testdata/poly.tif'

shapefile = "/testdata/20180808.shp"

def main(shapefile):

    #making the shapefile as an object.
    input_shp = ogr.Open(shapefile)
    
    #getting layer information of shapefile.
    shp_layer = input_shp.GetLayer()
    
    #pixel_size determines the size of the new raster.
    #pixel_size is proportional to size of shapefile.
    pixel_size = 0.1
    
    #get extent values to set size of output raster.
    x_min, x_max, y_min, y_max = shp_layer.GetExtent()
    
    #calculate size/resolution of the raster.
    x_res = int((x_max - x_min) / pixel_size)
    y_res = int((y_max - y_min) / pixel_size)
    
    #get GeoTiff driver by 
    image_type = 'GTiff'
    driver = gdal.GetDriverByName(image_type)
    #passing the filename, x and y direction resolution, no. of bands, new raster.
    new_raster = driver.Create(output_raster, x_res, y_res, 1, gdal.GDT_Byte)
    
    #transforms between pixel raster space to projection coordinate space.
    new_raster.SetGeoTransform((x_min, pixel_size, 0, y_min, 0, pixel_size))
    
    #get required raster band.
    band = new_raster.GetRasterBand(1)
    
    #assign no data value to empty cells.
    no_data_value = -9999
    band.SetNoDataValue(no_data_value)
    band.FlushCache()
    
    #main conversion method
    gdal.RasterizeLayer(new_raster, [1], shp_layer, burn_values=[255])
    
    #adding a spatial reference
    new_rasterSRS = osr.SpatialReference()
    new_rasterSRS.ImportFromEPSG(4326)
    new_raster.SetProjection(new_rasterSRS.ExportToWkt())
    return output_raster

我正在用Python做所有事情,因为我没有访问或资助付费GIS软件。我对地理空间数据处理完全陌生...不确定我是否采取了正确的方法。任何帮助都将是惊人的。

共有1个答案

长孙骏
2023-03-14

结帐光栅。面具来自rasterio图书馆的“面具”。我想这会有帮助的。

 类似资料:
  • 我想将光栅数据聚合到自定义形状文件中的每个多边形。 在这种情况下,我想获得撒哈拉以南非洲次国家区域城市化的平均程度。 我的sf如下所示: 或绘制: 另一方面,光栅数据采用以下形式: 这些比整个星球所需的要细得多。为了加速计算,我首先聚合光栅,然后将其转换为shapefile,剩余的每个光栅像素都转换为shapefile中的点几何形状。然后,这个shapefile可以聚合到我的区域边界。诚然,这不是

  • 空心我有一些问题和小问题我有3个输入字段我需要在单击时从中获取值将它们分配给对象并将该对象推入数组有人可以帮助我说在哪里查找信息我正在MDN上搜索,但我找不到正确的主题,示例1)将值输入到对象,然后将该对象推入数组 使用html和javascript链接到JSFIDLE

  • 问题内容: 在Go中,如何将函数调用返回的值分配给指针? 考虑下面的示例,注意返回一个值(不是指针): 这些都失败了: 是否确实需要局部变量?那不会招致不必要的复制吗? 问题答案: 根据规范,必须使用局部变量。 要获取值的地址,调用函数必须将返回值复制到可寻址的内存中。有副本,但这不是多余的。 Go程序通常使用值。 有时在应用程序想要区分无值和其他时间值的情况下使用A。在SQL NULL和有效时间

  • 问题内容: 这给出了预期的结果 这有效 但是如果我们将其更改为 我收到“ TypeError:无法将复数转换为浮点数”。 如果现在我们省略显式的,我将得到“ ValueError:设置具有序列的数组元素”。 有人可以解释发生了什么,以及如何做到无误吗?我迷路了。 问题答案: 要插入complex或in ,您显然需要将其视为数组,因此可以将其索引或分配给的一个切片: 看来NumPy无法正确处理这种情

  • 问题内容: 我正在寻找将Java char数组转换为字节数组 而不创建中间体的方法,因为char数组包含密码。我查看了几种方法,但是它们似乎都失败了: 断言总是失败的(并且,至关重要的是,当在生产中使用该代码时,密码将被拒绝),但是print语句会打印出三次密码。为什么与和有所不同,却显得相同?我是否错过了空终止符之类的东西?我怎样做才能使转换和未转换工作? 问题答案: 问题是您使用构造函数,该构

  • 问题内容: 我以前从未做过,也找不到答案。这可能不是用于此目的的正确数据类型,但是我只想分配一个int,然后将另一个没有in循环的int分配到2D数组中,值实际上是从另一个函数返回的,但是为了简单起见,只是使用in i和k,这就是我以为您会这样做的方式,但事实并非如此: TIA-如果我误选了错误的树,请随时向我指出一个更好的数据结构的方向。 问题答案: 最好的方法可能是一次声明并分配所有值。如图所