日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6. GDAL进行栅格转矢量

發(fā)布時間:2024/3/26 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6. GDAL进行栅格转矢量 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 代碼實現(xiàn)

參考下面代碼實現(xiàn)
python 使用GDAL實現(xiàn)柵格tif轉(zhuǎn)矢量shp的方式小結(jié)_python_腳本之家
https://www.jb51.net/article/219157.htm

from osgeo import gdal, ogr, osr import os import datetime import numpy as nppath = "Z_NAFP20210727.tif"if __name__ == '__main__':start_time = datetime.datetime.now()inraster = gdal.Open(path) # 讀取路徑中的柵格數(shù)據(jù)inband = inraster.GetRasterBand(1) # 這個波段就是最后想要轉(zhuǎn)為矢量的波段,如果是單波段數(shù)據(jù)的話那就都是1prj = osr.SpatialReference()prj.ImportFromWkt(inraster.GetProjection()) # 讀取柵格數(shù)據(jù)的投影信息,用來為后面生成的矢量做準(zhǔn)備outshp = path[:-4] + ".shp" # 給后面生成的矢量準(zhǔn)備一個輸出文件名,這里就是把原柵格的文件名后綴名改成shp了drv = ogr.GetDriverByName("ESRI Shapefile")if os.path.exists(outshp): # 若文件已經(jīng)存在,則刪除它繼續(xù)重新做一遍drv.DeleteDataSource(outshp)Polygon = drv.CreateDataSource(outshp) # 創(chuàng)建一個目標(biāo)文件Poly_layer = Polygon.CreateLayer(path[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon) # 對shp文件創(chuàng)建一個圖層,定義為多個面類newField = ogr.FieldDefn('value', ogr.OFTReal) # 給目標(biāo)shp文件添加一個字段,用來存儲原始柵格的pixel value,浮點型,Poly_layer.CreateField(newField)gdal.Polygonize(inband, None, Poly_layer, 0) # 核心函數(shù),執(zhí)行的就是柵格轉(zhuǎn)矢量操作# gdal.FPolygonize(inband, None, Poly_layer, 0) # 只轉(zhuǎn)矩形,不合并Polygon.SyncToDisk()Polygon = Noneend_time = datetime.datetime.now()print("Succeeded at", end_time)print("Elapsed Time:", end_time - start_time) # 輸出程序運行所需時間

2 柵格轉(zhuǎn)矢量并刪除指定屬性的要素

from osgeo import gdal, ogr, osr import os import datetime import numpy as npdef raster_shp(path):inraster = gdal.Open(path) # 讀取路徑中的柵格數(shù)據(jù)inband = inraster.GetRasterBand(1) # 這個波段就是最后想要轉(zhuǎn)為矢量的波段,如果是單波段數(shù)據(jù)的話那就都是1prj = osr.SpatialReference()prj.ImportFromWkt(inraster.GetProjection()) # 讀取柵格數(shù)據(jù)的投影信息,用來為后面生成的矢量做準(zhǔn)備outshp = path[:-4] + ".shp" # 給后面生成的矢量準(zhǔn)備一個輸出文件名,這里就是把原柵格的文件名后綴名改成shp了drv = ogr.GetDriverByName("ESRI Shapefile")if os.path.exists(outshp): # 若文件已經(jīng)存在,則刪除它繼續(xù)重新做一遍drv.DeleteDataSource(outshp)Polygon = drv.CreateDataSource(outshp) # 創(chuàng)建一個目標(biāo)文件Poly_layer = Polygon.CreateLayer(path[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon) # 對shp文件創(chuàng)建一個圖層,定義為多個面類newField = ogr.FieldDefn('value', ogr.OFTReal) # 給目標(biāo)shp文件添加一個字段,用來存儲原始柵格的pixel value,浮點型,Poly_layer.CreateField(newField)gdal.Polygonize(inband, None, Poly_layer, 0) # 核心函數(shù),執(zhí)行的就是柵格轉(zhuǎn)矢量操作# gdal.FPolygonize(inband, None, Poly_layer, 0) # 只轉(zhuǎn)矩形,不合并Polygon.SyncToDisk()Polygon = Nonedef raster_shp_delete_0(path):inraster = gdal.Open(path) # 讀取路徑中的柵格數(shù)據(jù)inband = inraster.GetRasterBand(1) # 這個波段就是最后想要轉(zhuǎn)為矢量的波段,如果是單波段數(shù)據(jù)的話那就都是1prj = osr.SpatialReference()prj.ImportFromWkt(inraster.GetProjection()) # 讀取柵格數(shù)據(jù)的投影信息,用來為后面生成的矢量做準(zhǔn)備outshp = path[:-4] + "d0.shp" # 給后面生成的矢量準(zhǔn)備一個輸出文件名,這里就是把原柵格的文件名后綴名改成shp了drv = ogr.GetDriverByName("ESRI Shapefile")if os.path.exists(outshp): # 若文件已經(jīng)存在,則刪除它繼續(xù)重新做一遍drv.DeleteDataSource(outshp)Polygon = drv.CreateDataSource(outshp) # 創(chuàng)建一個目標(biāo)文件Poly_layer = Polygon.CreateLayer(path[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon) # 對shp文件創(chuàng)建一個圖層,定義為多個面類newField = ogr.FieldDefn('value', ogr.OFTReal) # 給目標(biāo)shp文件添加一個字段,用來存儲原始柵格的pixel value,浮點型,Poly_layer.CreateField(newField)gdal.Polygonize(inband, None, Poly_layer, 0) # 核心函數(shù),執(zhí)行的就是柵格轉(zhuǎn)矢量操作# gdal.FPolygonize(inband, None, Poly_layer, 0) # 只轉(zhuǎn)矩形,不合并strValue = 0strFilter = "Value = '" + str(strValue) + "'"Poly_layer.SetAttributeFilter(strFilter)pFeatureDef = Poly_layer.GetLayerDefn()pLayerName = Poly_layer.GetName()pFieldName = "Value"pFieldIndex = pFeatureDef.GetFieldIndex(pFieldName)for pFeature in Poly_layer:pFeatureFID = pFeature.GetFID()Poly_layer.DeleteFeature(int(pFeatureFID))strSQL = "REPACK " + str(Poly_layer.GetName())Polygon.ExecuteSQL(strSQL, None, "");Poly_layer = NonePolygon.SyncToDisk()Polygon = Noneif __name__ == '__main__':path = r"I:\5GF2\1ALLimg20211130\8波段4預(yù)測結(jié)果\GF7_DLC_E116.6_N31.1_20210911_L1A0000560021-BWDPAN_ORTHO_PSH_preR.tif"start_time = datetime.datetime.now()raster_shp_delete_0(path)end_time = datetime.datetime.now()print("Succeeded at", end_time)print("Elapsed Time:", end_time - start_time) # 輸出程序運行所需時間

參考文獻:

看下面兩個就可以了

[1] 【Python】GDAL批量柵格轉(zhuǎn)矢量 - 知乎
https://zhuanlan.zhihu.com/p/210939809

[2] (39條消息) GDAL–柵格轉(zhuǎn)矢量_secyb的博客-CSDN博客_gdal柵格轉(zhuǎn)矢量
https://blog.csdn.net/secyb/article/details/80245157

【3】柵格結(jié)果不保存到磁盤中,Python ogr.GetDriverByName方法代碼示例 - 純淨(jìng)天空
https://vimsky.com/zh-tw/examples/detail/python-method-osgeo.ogr.GetDriverByName.html

總結(jié)

以上是生活随笔為你收集整理的6. GDAL进行栅格转矢量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。