png转shp:栅格转矢量(面)

 

 

import gdal
from gdal import gdalconst
from osgeo import gdalconst, gdal, ogr, osr
import numpy as np
import os
import glob, threading

def vector2raster_line(inputfilePath, outputfile, templatefile):
    inputfilePath = inputfilePath
    outputfile = outputfile
    templatefile = templatefile
    data = gdal.Open(templatefile, gdalconst.GA_ReadOnly)
    x_res = data.RasterXSize
    y_res = data.RasterYSize
    vector = ogr.Open(inputfilePath)
    layer = vector.GetLayer()
    targetDataset = gdal.GetDriverByName('GTiff').Create(outputfile, x_res, y_res, 3, gdal.GDT_Byte)
    targetDataset.SetGeoTransform(data.GetGeoTransform())
    targetDataset.SetProjection(data.GetProjection())
    band = targetDataset.GetRasterBand(1)
    NoData_value = -999
    band.SetNoDataValue(NoData_value)
    band.FlushCache()
    gdal.RasterizeLayer(targetDataset, [1, 2, 3], layer, )


def raster2vector_line(inputfile_dir, outfile_dir):
    inputfile = inputfile_dir
    ds = gdal.Open(inputfile, gdal.GA_ReadOnly)
    srcband = ds.GetRasterBand(1)
    maskband = srcband.GetMaskBand()
    outfile = outfile_dir
    drv = ogr.GetDriverByName('ESRI Shapefile')
    dst_ds = drv.CreateDataSource(outfile)
    srs = None
    dst_layer = dst_ds.CreateLayer(outfile, srs=srs)
    dst_fieldname = 'DN'
    fd = ogr.FieldDefn(dst_fieldname, ogr.OFTInteger)
    dst_layer.CreateField(fd)
    dst_field = 0
    options = []
    gdal.Polygonize(srcband, maskband, dst_layer, dst_field, options)


def raster2poly(raster, outshp):
    inraster = gdal.Open(raster)  # 读取路径中的栅格数据
    inband = inraster.GetRasterBand(1)  # 这个波段就是最后想要转为矢量的波段,如果是单波段数据的话那就都是1
    prj = osr.SpatialReference()
    prj.ImportFromWkt(inraster.GetProjection())  # 读取栅格数据的投影信息,用来为后面生成的矢量做准备

    drv = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(outshp):  # 若文件已经存在,则删除它继续重新做一遍
        drv.DeleteDataSource(outshp)
    Polygon = drv.CreateDataSource(outshp)  # 创建一个目标文件
    Poly_layer = Polygon.CreateLayer(raster[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon)  # 对shp文件创建一个图层,定义为多个面类
    newField = ogr.FieldDefn('value', ogr.OFTReal)  # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
    Poly_layer.CreateField(newField)

    gdal.FPolygonize(inband, None, Poly_layer, 0)  # 核心函数,执行的就是栅格转矢量操作
    Polygon.SyncToDisk()
    Polygon = None



if __name__=="__main__":
    img_dir = r"C:\Users\Administrator\Desktop\target maps\*"
    save_dir = r"C:\Users\Administrator\Desktop\shape_file/"
    img_list = glob.glob(img_dir)
    for i in range(len(img_list)):
        img = img_list[i]
        save_img = save_dir+img.split("\\")[-1][:-4] + ".shp"
        # threading.Thread(target=raster2vector_line, args=(img, save_img)).start()
        raster2poly(img, save_img)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当将PNG(Portable Network Graphics)图像化为SHP(Shapefile)矢量文件时,可能会遇到坐标不对的问题。这可能是由于以下几个原因所导致的: 1. 坐标系统不匹配:PNG图像可能使用不同的坐标系统,而SHP文件使用的是地理坐标系统(例如WGS 84),因此必须确保两者的坐标系统匹配。可以使用专业的GIS软件(如ArcGIS)来进行坐标系统的换,以确保正确的匹配。 2. 像素与地理坐标之间的换:PNG图像是基于像素的,而SHP文件是基于地理坐标的。因此,在进行换时,必须使用像素与地理坐标之间的换参数。这些参数通常包括地理参考点、像素大小和旋角度等。确保在换过程中正确设置这些参数,才能保证正确的坐标换。 3. 数据损坏或错乱:在换过程中,如果PNG图像本身存在数据损坏或错乱,可能会导致换后的SHP文件的坐标不正确。在进行换之前,最好检查PNG图像的完整性,确保其没有损坏或错乱的部分。 为了解决PNGSHP坐标不正确的问题,您可以尝试以下方法: 1. 使用专业的GIS软件进行换,并确保正确设置坐标系统和换参数。 2. 检查PNG图像的完整性,确保图像没有数据损坏或错乱。 3. 如果可能,尝试使用其他格式的图像(如JPEG或TIFF)进行换,以查看是否存在与PNG格式相关的问题。 总之,处理PNGSHP坐标不正确的问题需要仔细检查和分析,并确保正确设置坐标系统和换参数,以确保正确的换结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘟嘟love佳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值