python gdal 裁剪_用Python实现矢量对栅格数据的裁剪

原标题:用Python实现矢量对栅格数据的裁剪

欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习、问答、求职,一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。

矢量对栅格数据的裁剪在GIS软件中是基本功能,本文使用Python来实现该功能。其中,矢量数据是面(Polygon)类型,且矢量数据和栅格数据的坐标系一致。在这里,用到的矢量数据为geojson格式,栅格数据为tif格式。 数据读取 import geopandas as gpd from osgeo import gdal, gdalnumeric ht = gdal.Open(raster

_file_path) data

_df = gpd.read_file(vector

_file_path) poly = data_df.ix[

0][

'geometry']

接下来,将根据poly这一面状要素,对栅格数据中相应范围进行裁剪。 地理坐标转像素坐标

利用GDAL中的GeoTransform参数来实现。

defgeoToPixel(record,GeoTransform):

""" http://www.gdal.org/gdal_tutorial.html GeoTransform[0] /* top left x */ GeoTransform[1] /* w-e pixel resolution */ GeoTransform[2] /* 0 */ GeoTransform[3] /* top left y */ GeoTransform[4] /* 0 */ """ uper_left_x = float(GeoTransform[

0]) uper_left_y = float(GeoTransform[

3]) pixel_width = float(GeoTransform[

1]) pixel_height = float(GeoTransform[

5]) (mx,my) =(record[

0],record[

1]) px = int((mx - uper_left_x) / pixel_width)

#x pixel py = int((my - uper_left_y) / pixel_height)

#y pixel

return (px,py)

然后,获取面的外接矩形 minX,maxX = min(poly.envelope.exterior.coords.xy[

0]),max(poly.envelope.exterior.coords.xy[

0]) minY,maxY = min(poly.envelope.exterior.coords.xy[

1]),max(poly.envelope.exterior.coords.xy[

1]) uper_left_X, uper_left_Y = geoToPixel((minX,maxY),gt) lower_right_X, lower_right_Y = geoToPixel((maxX,minY),gt) uper_left_X, uper_left_Y,lower_right_X, lower_right_Y

输出类似 (18450, 5358, 18645, 5466) 根据外接矩形裁剪 pxWidth =

int(lower_right_X - uper_left_X) pxHeight =

int(lower_right_Y - uper_left_Y) clip = ht.ReadAsArray(

int(uper_left_X),

int(uper_left_Y),

int(pxWidth),

int(pxHeight)) plt.imshow(clip[

0])

现在只是得到了规则矩形裁剪的结果,面状要素往往是不规则的,接下来用掩模处理。

掩模Mask生成

## 计算当前裁剪后栅格的GeoTransform gt2 =

list(gt) gt2[

0] = minX gt2[

3] = maxY

利用opencv的fillPoly实现掩模效果 import opencv ext_pix = np.array([geoToPixel(points,gt2) for points in poly.exterior.coords]) ext_pix = np.expand_dims(ext_pix,axis=

0)mask = np.ones([pxHeight,pxWidth], np.uint8)mask = cv2.fillPoly(mask,ext_pix, 0)plt.imshow(mask)

最终结果 clip = gdalnumeric.choose(mask, (clip, -

9999)) plt.imshow(clip[

0])

转载请保留以下内容:

本文来源自天善社区时空Drei老师的博客(公众号)。

原文链接: https://ask.hellobi.com/blog/stdrei/8439返回搜狐,查看更多

责任编辑:

你可能感兴趣的:(python,gdal,裁剪)