CSV/txt转点shp python+gdal

废话不说,直接上码 


from osgeo import ogr
import pandas as pd
from osgeo import osr


def csv2shp(csv_path, shp_path):
    # 解决中文字符问题
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    gdal.SetConfigOption("SHAPE_ENCODING", "")

    # 设置空间参考,4326代表WGS84
    SpatialReference = osr.SpatialReference()
    SpatialReference.ImportFromEPSG(4326)

    # 新建DataSource,Layer
    driver = ogr.GetDriverByName("ESRI Shapefile")
    data_source = driver.CreateDataSource(shp_path)
    layer = data_source.CreateLayer('Point', SpatialReference, ogr.wkbPoint)

    # 读取csv文件
    csv_df = pd.read_csv(csv_path)
    # csv所有列名,即shp的字段名
    filed_names = list(csv_df)

    # layer添加上述字段
    for filed_name in filed_names:
        print(str(csv_df[filed_name].dtypes))
        if ("int" in str(csv_df[filed_name].dtypes)):
            field = ogr.FieldDefn(filed_name, ogr.OFTInteger)
            field.SetWidth(10)
        elif ("float" in str(csv_df[filed_name].dtypes)):
            field = ogr.FieldDefn(filed_name, ogr.OFTReal)
            field.SetWidth(10)
            field.SetPrecision(6)
        else:
            field = ogr.FieldDefn(filed_name, ogr.OFTString)
            field.SetWidth(10)
        layer.CreateField(field)

    # 从layer中读取相应的feature类型,并创建feature
    featureDefn = layer.GetLayerDefn()
    feature = ogr.Feature(featureDefn)

    # 设定几何形状
    point = ogr.Geometry(ogr.wkbPoint)

    # 循环输入字段属性值
    for i in range(len(csv_df)):
        for j in range(len(filed_names)):
            if ("int" in str(csv_df[filed_names[j]].dtypes)):
                feature.SetField(filed_names[j], int(csv_df.iloc[i, j]))
            elif ("float" in str(csv_df[filed_names[j]].dtypes)):
                feature.SetField(filed_names[j], float(csv_df.iloc[i, j]))
            else:
                feature.SetField(filed_names[j], str(csv_df.iloc[i, j]))

        # 设置几何信息部分
        # 利用经纬度创建点,X为经度,Y为纬度(我的数据第0列是纬度,第1列是经度)
        point.AddPoint(float(csv_df.iloc[i, 0]), float(csv_df.iloc[i, 1]))
        feature.SetGeometry(point)

        # 将feature写入layer
        layer.CreateFeature(feature)

    # 从内存中清除 ds,将数据写入磁盘中
    data_source.Destroy()


csv_path = 'csv路径'
shp_path = '.shp输出路径'
csv2shp(csv_path, shp_path)

有用的话给个赞和关注~

上一篇:Flutter 搜狗键盘收起TextField没有失去焦点。问题


下一篇:istack堆叠