├── code └── shp_cut_raster02.py └── data └── FalseColor.zip /code/shp_cut_raster02.py: -------------------------------------------------------------------------------- 1 | # _*_ coding: utf-8 _*_ 2 | __author__ = 'xbr' 3 | __date__ = '2019/1/2 18:06' 4 | 5 | import operator 6 | from osgeo import gdal, gdal_array, osr 7 | import shapefile 8 | 9 | try: 10 | import Image 11 | import ImageDraw 12 | except: 13 | from PIL import Image, ImageDraw 14 | 15 | # 用于裁剪的栅格数据 16 | raster = r'D:\FalseColor.tif' 17 | # 用于裁剪的多边形shp文件 18 | shp = r'D:\hancock' 19 | # 裁剪后的栅格数据 20 | output = r'D:\clip' 21 | 22 | 23 | def image2Array(i): 24 | """ 25 | 将一个Python图像库的数组转换为一个gdal_array图片 26 | """ 27 | a = gdal_array.numpy.fromstring(i.tobytes(), 'b') 28 | a.shape = i.im.size[1], i.im.size[0] 29 | return a 30 | 31 | 32 | def world2Pixel(geoMatrix, x, y): 33 | """ 34 | 使用GDAL库的geomatrix对象((gdal.GetGeoTransform()))计算地理坐标的像素位置 35 | """ 36 | ulx = geoMatrix[0] 37 | uly = geoMatrix[3] 38 | xDist = geoMatrix[1] 39 | yDist = geoMatrix[5] 40 | rtnX = geoMatrix[2] 41 | rtnY = geoMatrix[4] 42 | pixel = int((x - ulx) / xDist) 43 | line = int((uly - y) / abs(yDist)) 44 | return (pixel, line) 45 | 46 | # 将数据源作为gdal_array载入 47 | srcArray = gdal_array.LoadFile(raster) 48 | # 同时载入gdal库的图片从而获取geotransform 49 | srcImage = gdal.Open(raster) 50 | geoTrans = srcImage.GetGeoTransform() 51 | # 使用PyShp库打开shp文件 52 | r = shapefile.Reader("{}.shp".format(shp)) 53 | # 将图层扩展转换为图片像素坐标 54 | minX, minY, maxX, maxY = r.bbox 55 | ulX, ulY = world2Pixel(geoTrans, minX, maxY) 56 | lrX, lrY = world2Pixel(geoTrans, maxX, minY) 57 | # 计算新图片的尺寸 58 | pxWidth = int(lrX - ulX) 59 | pxHeight = int(lrY - ulY) 60 | clip = srcArray[:, ulY:lrY, ulX:lrX] 61 | # 为图片创建一个新的geomatrix对象以便附加地理参照数据 62 | geoTrans = list(geoTrans) 63 | geoTrans[0] = minX 64 | geoTrans[3] = maxY 65 | # 在一个空白的8字节黑白掩膜图片上把点映射为像元绘制市县 66 | # 边界线 67 | pixels = [] 68 | for p in r.shape(0).points: 69 | pixels.append(world2Pixel(geoTrans, p[0], p[1])) 70 | rasterPoly = Image.new("L", (pxWidth, pxHeight), 1) 71 | # 使用PIL创建一个空白图片用于绘制多边形 72 | rasterize = ImageDraw.Draw(rasterPoly) 73 | rasterize.polygon(pixels, 0) 74 | # 使用PIL图片转换为Numpy掩膜数组 75 | mask = image2Array(rasterPoly) 76 | # 根据掩膜图层对图像进行裁剪 77 | clip = gdal_array.numpy.choose(mask, (clip, 0)).astype(gdal_array.numpy.uint8) 78 | print clip.max() 79 | # 将NDVI保存为tiff文件 80 | gdal_array.SaveArray(clip, "{}.tif".format(output), 81 | format="GTiff", prototype=raster) 82 | -------------------------------------------------------------------------------- /data/FalseColor.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xbr2017/PyGdal_vector_clip_raster/e5e95a9bec6439875e15cbfd5afb146fd5abcd70/data/FalseColor.zip --------------------------------------------------------------------------------