欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何使用Python中的GDAL库循环写入矢量数据

程序员文章站 2022-12-07 09:12:54
该文章为《如何使用Python中的GDAL库创建矢量文件》后续在《如何使用Python中的GDAL库创建矢量文件》文章中,介绍了利用GDAL库创建点、线、面矢量文件,文章中只介绍了单个数据的创建情况,那么面对有很多个数据时,该怎么创建呢?问题来源:现有一些点坐标,目的是将其构建成一个点矢量文件,直接上代码。单个点数据情况:from osgeo import ogr,osr Longitude = 116.4 Latitude = 39.9 def create_point():...

该文章为《如何使用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打开如下:

如何使用Python中的GDAL库循环写入矢量数据

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

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