tif轉shp

shp文件包含shp,shx,prj,dbf文件,通過osgeo中的ogr可以對其進行構建,另外,tif圖片的輪廓線通過opencv的相關方法得到。

這裏我們預處理的圖像爲二值化的圖片。

contours, hierarchy = cv2.findContours(img2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 提取二值圖的所有輪廓邊界

其中,第一個參數爲tif圖片,第二個參數爲輪廓的組織方式,這裏選擇爲樹的結構方式,第三個參數爲輪廓中點的存儲方式,這裏選擇爲稀疏簡單的方式。返回值有兩個,第一個是表示輪廓點的ndarray類型的矩陣,第二個是對應的屬性值。

後面就是遍歷獲取到的輪廓,對於每個輪廓,調用ogr相關方法組建shp文件的過程,不跟你多比比,直接上代碼


gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")  # 爲了支持中文路徑
gdal.SetConfigOption("SHAPE_ENCODING", "CP936")  # 爲了使屬性表字段支持中文

strVectorFile = '/xxxx/test.shp'        # 定義寫入路徑及文件名

ogr.RegisterAll()  # 註冊所有的驅動
strDriverName = "ESRI Shapefile"  # 創建數據,這裏創建ESRI的shp文件
oDriver = ogr.GetDriverByName(strDriverName)
if oDriver == None:
    print("%s 驅動不可用!\n", strDriverName)

oDS = oDriver.CreateDataSource(strVectorFile)  # 創建數據源
if oDS == None:
    print("創建文件【%s】失敗!", strVectorFile)

srs = osr.SpatialReference()  # 創建空間參考
srs.ImportFromEPSG(4326)  # 定義地理座標系WGS1984
papszLCO = []
# 創建圖層,創建一個多邊形圖層,"TestPolygon"->屬性表名
oLayer = oDS.CreateLayer("TestPolygon", srs, ogr.wkbPolygon, papszLCO)
if oLayer == None:
    print("圖層創建失敗!\n")

'''下面添加矢量數據,屬性表數據、矢量數據座標'''
oFieldID = ogr.FieldDefn("FieldID", ogr.OFTInteger)  # 創建一個叫FieldID的整型屬性
oLayer.CreateField(oFieldID, 1)

oDefn = oLayer.GetLayerDefn()  # 定義要素
gardens = ogr.Geometry(ogr.wkbMultiPolygon)  # 定義總的多邊形集
i = 0
for contour in contours:
    area = cv2.contourArea(contour)
    if area > 100:  # 面積大於n才保存
        # print(area)
        box1 = ogr.Geometry(ogr.wkbLinearRing)
        i += 1
        for point in contour:
            x_col = float(point[0, 1])
            y_row = float(point[0, 0])
            box1.AddPoint(y_row, x_col)
        oFeatureTriangle = ogr.Feature(oDefn)
        oFeatureTriangle.SetField(0, i)
        garden1 = ogr.Geometry(ogr.wkbPolygon)  # 每次重新定義單多變形
        garden1.AddGeometry(box1)  # 將輪廓座標放在單多邊形中
        gardens.AddGeometry(garden1)  # 依次將單多邊形放入總的多邊形集中
gardens.CloseRings()  # 封閉多邊形集中的每個單多邊形,後面格式需要

geomTriangle = ogr.CreateGeometryFromWkt(str(gardens))  # 將封閉後的多邊形集添加到屬性表
oFeatureTriangle.SetGeometry(geomTriangle)
oLayer.CreateFeature(oFeatureTriangle)
oDS.Destroy()
print("數據矢量創建完成!\n")

代碼來自其他大佬,然而忘記了其原鏈接,如有不妥,請聯繫我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章