创建用1填充的的数组python_Python:在数组中填充多边形区域

这篇博客探讨了如何在Python中使用GDAL和Numpy库创建一个数组,其中多边形内部的元素值为1,外部为0。作者通过光栅图像的地理坐标信息和Shapefile数据,计算像素位置并填充数组。
摘要由CSDN通过智能技术生成

我有一个光栅图像(Tiff格式)和一个多边形区域,在数组中转换为shapefile格式。我希望找到一种优雅的方法来创建一个数组,其中多边形边界内的所有元素都有1个值,而多边形外部的所有元素都有0个值。我的最终目标是用从shapefile派生的数组屏蔽从图像派生的数组。

我有以下问题,谢谢你的帮助:

在使用np.zeros((ds.RasterYSize,ds.RasterXSize))和多边形边界地理空间坐标的像素位置创建空数组之后,用1填充数组中的多边形的最佳解决方案是什么?from osgeo import gdal, gdalnumeric, ogr, osr

import osgeo.gdal

import math

import numpy

import numpy as np

def world2Pixel(geoMatrix, x, y):

"""

Uses a gdal geomatrix (gdal.GetGeoTransform()) to calculate

the pixel location of a geospatial coordinate

(source http://www2.geog.ucl.ac.uk/~plewis/geogg122/vectorMask.html)

geoMatrix

[0] = top left x (x Origin)

[1] = w-e pixel resolution (pixel Width)

[2] = rotation, 0 if image is "north up"

[3] = top left y (y Origin)

[4] = rotation, 0 if image is "north up"

[5] = n-s pixel resolution (pixel Height)

"""

ulX = geoMatrix[0]

ulY = geoMatrix[3]

xDist = geoMatrix[1]

yDist = geoMatrix[5]

rtnX = geoMatrix[2]

rtnY = geoMatrix[4]

pixel = np.round((x - ulX) / xDist).astype(np.int)

line = np.round((ulY - y) / xDist).astype(np.int)

return (pixel, line)

# Open the image as a read only image

ds = osgeo.gdal.Open(inFile,gdal.GA_ReadOnly)

# Get image georeferencing information.

geoMatrix = ds.GetGeoTransform()

ulX = geoMatrix[0] # top left x (x Origin)

ulY = geoMatrix[3] # top left y (y Origin)

xDist = geoMatrix[1] # w-e pixel resolution (pixel Width)

yDist = geoMatrix[5] # n-s pixel resolution (pixel Height)

rtnX = geoMatrix[2] # rotation, 0 if image is "north up"

rtnY = geoMatrix[4] #rotation, 0 if image is "north up"

# open shapefile (= border of are of interest)

shp = osgeo.ogr.Open(poly)

source_shp = ogr.GetDriverByName("Memory").CopyDataSource(shp, "")

# get the coordinates of the points from the boundary of the shapefile

source_layer = source_shp.GetLayer(0)

feature = source_layer.GetNextFeature()

geometry = feature.GetGeometryRef()

pts = geometry.GetGeometryRef(0)

points = []

for p in range(pts.GetPointCount()):

points.append((pts.GetX(p), pts.GetY(p)))

pnts = np.array(points).transpose()

print pnts

pnts

array([[ 558470.28969598, 559495.31976318, 559548.50931402,

559362.85560495, 559493.99688721, 558958.22572622,

558529.58862305, 558575.0174293 , 558470.28969598],

[ 6362598.63707171, 6362629.15167236, 6362295.16466266,

6362022.63453845, 6361763.96246338, 6361635.8559779 ,

6361707.07684326, 6362279.69352024, 6362598.63707171]])

# calculate the pixel location of a geospatial coordinate (= define the border of my polygon)

pixels, line = world2Pixel(geoMatrix,pnts[0],pnts[1])

pixels

array([17963, 20013, 20119, 19748, 20010, 18939, 18081, 18172, 17963])

line

array([35796, 35734, 36402, 36948, 37465, 37721, 37579, 36433, 35796])

#create an empty array with value zero using

data = np.zeros((ds.RasterYSize, ds.RasterXSize))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Python中的matplotlib库来实现。具体的步骤如下: 1. 画出多边形,并确定多边形的顶点坐标。 2. 创建一个矩形,将其大小设置为画布的大小。 3. 使用多边形的顶点坐标创建一个多边形路径。 4. 将多边形路径添加到矩形路径中,并设置为反转路径。 5. 使用matplotlib库的patches模块创建两个Patch对象,一个用于表示多边形,另一个表示矩形。 6. 将多边形Patch对象设置为填充颜色,矩形Patch对象设置为白色。 7. 使用matplotlib库的pyplot模块将两个Patch对象添加到画布中,并显示画布。 下面是一个示例代码: ```python import matplotlib.pyplot as plt import matplotlib.patches as patches # 创建多边形的顶点坐标 verts = [(0, 0), (0, 1), (1, 1), (1, 0.5), (0.5, 0)] # 创建一个矩形 fig = plt.figure() ax = fig.add_subplot(111) rect = patches.Rectangle((0, 0), 1, 1, linewidth=0, facecolor='white') ax.add_patch(rect) # 创建多边形路径 path = patches.Polygon(verts, closed=True) # 将多边形路径添加到矩形路径中,并设置为反转路径 clip_path = path.get_path().transformed(ax.transData.inverted()) clip_path = patches.PathPatch(clip_path, facecolor='none', edgecolor='none', alpha=0.5) rect.add_patch(clip_path) # 设置多边形填充颜色 poly = patches.Polygon(verts, facecolor='blue', alpha=0.5) ax.add_patch(poly) # 显示画布 plt.show() ``` 这段代码会画出一个蓝色的多边形,以及多边形以外的区域填充了白色。你可以根据需要修改多边形的顶点坐标和填充颜色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值