该文章为《如何使用Python中的GDAL库创建矢量文件》后续

在《如何使用Python中的GDAL库创建矢量文件》文章中,介绍了利用GDAL库创建点、线、面矢量文件,文章中只介绍了单个数据的创建情况,那么面对有很多个数据时,该怎么创建呢?

问题来源:现有一些点坐标,目的是将其构建成一个点矢量文件,直接上代码。

单个点数据情况:

from osgeo import ogr,osr
 
Longitude = 116.4 
Latitude = 39.9
 
def create_point():
    ## 生成点矢量文件 ##
    driver = ogr.GetDriverByName("ESRI Shapefile")
    data_source = driver.CreateDataSource("Point.shp") ## shp文件名称
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326) ## 空间参考:WGS84
    layer = data_source.CreateLayer("Point", srs, ogr.wkbPoint) ## 图层名称要与shp名称一致
    field_name = ogr.FieldDefn("Name", ogr.OFTString) ## 设置属性
    field_name.SetWidth(20)  ## 设置长度
    layer.CreateField(field_name)  ## 创建字段
    field_Longitude = ogr.FieldDefn("Longitude", ogr.OFTReal)  ## 设置属性
    layer.CreateField(field_Longitude)  ## 创建字段
    field_Latitude = ogr.FieldDefn("Latitude", ogr.OFTReal)  ## 设置属性
    layer.CreateField(field_Latitude)  ## 创建字段
    feature = ogr.Feature(layer.GetLayerDefn())
    feature.SetField("Name", "point")  ## 设置字段值
    feature.SetField("Longitude", str(Longitude))  ## 设置字段值
    feature.SetField("Latitude", str(Latitude))  ## 设置字段值
    wkt = "POINT(%f %f)" % (float(Longitude), float(Latitude)) ## 创建点
    point = ogr.CreateGeometryFromWkt(wkt) ## 生成点
    feature.SetGeometry(point)  ## 设置点
    layer.CreateFeature(feature)  ## 添加点
    feature = None ## 关闭属性
    data_source = None ## 关闭数据

多个点数据情况:

from osgeo import ogr,osr
 
Longitude = [116.41,116.42,116.40,116.45]
Latitude = [39.9,39.92,39.91,39.98]
 
def create_multipoint():
    ## 生成点矢量文件 ##
    driver = ogr.GetDriverByName("ESRI Shapefile")
    data_source = driver.CreateDataSource("MultiPoint.shp") ## shp文件名称
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326) ## 空间参考:WGS84
    layer = data_source.CreateLayer("Point", srs, ogr.wkbPoint) ## 图层名称要与shp名称一致
    field_name = ogr.FieldDefn("Name", ogr.OFTString) ## 设置属性
    field_name.SetWidth(20)  ## 设置长度
    layer.CreateField(field_name)  ## 创建字段
    field_Longitude = ogr.FieldDefn("Longitude", ogr.OFTReal)  ## 设置属性
    layer.CreateField(field_Longitude)  ## 创建字段
    field_Latitude = ogr.FieldDefn("Latitude", ogr.OFTReal)  ## 设置属性
    layer.CreateField(field_Latitude)  ## 创建字段
    for i in range(len(Longitude)):
        feature = ogr.Feature(layer.GetLayerDefn())
        feature.SetField("Name", "point")  ## 设置字段值
        feature.SetField("Longitude", str(Longitude[i]))  ## 设置字段值
        feature.SetField("Latitude", str(Latitude[i]))  ## 设置字段值
        point = ogr.Geometry(ogr.wkbPoint)
        point.AddPoint(float(Longitude[i]), float(Latitude[i]))
        feature.SetGeometry(point)  ## 设置点
        layer.CreateFeature(feature)  ## 添加点
        feature.Destroy() ## 关闭属性
    data_source.Destroy() ## 关闭数据

这里,需要注意的是,代码的倒数第二行,feature.Destroy()  ## 关闭属性,这一行需要在 for循环 里面,否则,生成的矢量文件将只有最后一个数据。

生成的点,用ArcGIS打开如下:

循环创建线、面文件和点相似,这里就不作介绍了。

本文地址:https://blog.csdn.net/u012569919/article/details/109958418