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")

代码来自其他大佬,然而忘记了其原链接,如有不妥,请联系我。

你可能感兴趣的:(图像处理)