Tôi cần rasterize một shapefile thực sự đơn giản một chút như thế này http://tinyurl.com/odfbanu . Đây chỉ là một quận coutain shapefile ở Mỹ. Tôi đã thấy câu trả lời trước đây: GDAL RasterizeLayer không ghi tất cả đa giác cho Raster? nhưng tôi đã tự hỏi nếu có một cách để làm điều đó bằng cách sử dụng Geopandas hoặc fiona và có thể rasterio cho phần viết tiff.
Vì vậy, mục tiêu của tôi là rasterize nó và gán một giá trị cho mọi đa giác chia sẻ một giá trị comon, LSAD trong ví dụ.
Vì vậy, tôi đã viết phần đầu của mã được lấy cảm hứng từ shongololo trong chuỗi: Hòa tan đa giác dựa trên các thuộc tính với Python (shapely, fiona)? .
from geopandas import GeoDataFrame
name_in = 'cb_2013_us_county_20m.shp'
#Open the file with geopandas
counties = GeoDataFrame.from_file(name_in)
#Add a column to the Geodataframe containing the new value
for i in range (len(counties)):
LSAD = counties.at[i,'LSAD']
if LSAD == 00 :
counties['LSAD_NUM'] == 'A'
elif LSAD == 03 :
counties['LSAD_NUM'] == 'B'
elif LSAD == 04 :
counties['LSAD_NUM'] == 'C'
elif LSAD == 05 :
counties['LSAD_NUM'] == 'D'
elif LSAD == 06 :
counties['LSAD_NUM'] == 'E'
elif LSAD == 13 :
counties['LSAD_NUM'] == 'F'
elif LSAD == 15 :
counties['LSAD_NUM'] == 'G'
elif LSAD == 25 :
counties['LSAD_NUM'] == 'I'
else :
counties['LSAD_NUM'] == 'NA'
Công cụ thực sự dễ dàng vì vậy bây giờ tôi tự hỏi làm thế nào tôi thực sự có thể viết những hình dạng đó cho một tiff. Tôi bắt đầu làm việc với Geopandas vì tôi tin rằng đó là lựa chọn tốt nhất nhưng nếu bạn có gợi ý về fiona thì tôi cũng đồng ý.
Tôi tìm thấy một đoạn mã từ rasterio mà dường như có thể lấy một hình dạng cân đối và ghi nó vào một raster mới http://tinyurl.com/op49uek
# I guess that my goal should be to load my list of geometries under geometry to be able to pass it to rasterio later on
geometry = {'type':'Polygon','coordinates':[[(2,2),(2,4.25),(4.25,4.25),(4.25,2),(2,2)]]}
with rasterio.drivers():
result = rasterize([geometry], out_shape=(rows, cols))
with rasterio.open(
"test.tif",
'w',
driver='GTiff',
width=cols,
height=rows,
count=1,
dtype=numpy.uint8,
nodata=0,
transform=IDENTITY,
crs={'init': "EPSG:4326"}) as out:
out.write_band(1, result.astype(numpy.uint8))