精华内容
下载资源
问答
  • python 读取shp文件

    2013-03-14 05:37:11
    Reading and writing vector data with OGR
  • 今天小编就为大家分享一篇对python 读取线的shp文件实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • python 加载shp文件

    2017-07-30 16:10:43
    python 加载shp文件
  • python读取shp文件

    千次阅读 热门讨论 2021-02-06 17:06:14
    python读取shp地图文件 为了小白画图初体验四,得先做一些铺垫,也是自己踩的坑,然后学的习。其中一个基础就是怎么读取shp文件shp文件一般有三个,.shp.dbf.shx,存放的就是地图信息,更直接一点的就是点的信息...

    python读取shp地图文件

    为了小白画图初体验四,得先做一些铺垫,也是自己踩的坑,然后学的习。其中一个基础就是怎么读取shp文件。
    shp文件一般有三个,.shp.dbf.shx,存放的就是地图信息,更直接一点的就是点的信息,由点构成线,由线构成多边形。而读取出来的点信息是以经纬度表示的。
    气象绘图能涉及的一般是shapefile库和Basemap库,两个都可以读取shp文件。
    这里主要介绍shapefile库读取的方法,和Basemap库出现“utf-8”错误的解决方法。

    shapefile库读取shp文件

    概述

    import shapefile
    sf = shapefile.Reader('Zhejiang_province')
    shapes = sf.shapes()
    

    这是读取shp文件的基本操作,shapes里面存放的就是地图信息类的数组。,里面一个或者多个shapefile类

    sf = shapefile.Reader('Zhejiang_province')
    shapes = sf.shapes()
    pts = shapes[0].points
    prt =shapes[0].parts
    

    上图的文件是浙江省省界,就一个文件

    sf = shapefile.Reader("country1")
    for shape_rec in sf.shapeRecords():
        pts = shape_rec.shape.points#边界点
        prt = shape_rec.shape.parts
    

    上图的文件是国家界,就多个类,每一个存放了每个国界的信息
    下面以单一的文件给大家作介绍,方便理解,多文件无非就是写个循环,加个判断。

    简单介绍

    浙江省省界文件

    sf = shapefile.Reader('Zhejiang_province')
    shapes = sf.shapes()
    pts = shapes[0].points
    prt =shapes[0].parts
    

    .points里面存放所有点的信息,每个点用(x,y)表示,其实就是所表示区域的边界点,代码里读出的就是浙江省的所有边界点,用经纬度来表示位置。这里存在一个问题,那就是以浙江省为例,有舟山群岛,所有点的坐标不连续,其实相当于许多小区域的组合,但是.points里面不管这些,只会表示点,咱们画图来看一下

    import shapefile
    import matplotlib.pyplot as plt
    
    sf = shapefile.Reader('Zhejiang_province')
    shapes = sf.shapes()
    codes = []
    pts = shapes[0].points
    
    x,y = zip(*pts)#把经纬度分别给到x,y
    fig = plt.figure(figsize=[12,18])
    ax = fig.add_subplot(111)
    ax.plot(x, y, '-', lw=1, color='k')
    plt.show()
    

    在这里插入图片描述
    可以看出,画完陆地去画岛的时候很生硬,直接扯过去了(因为用的是plot,如果是散点图不会画成这样,但我们不需要散点)。
    这里涉及了另一个知识点

    shapefile.Reader类属性

    包含有4个属性:数据类型(shapeType),代表该"几何数据"对象的数据类型(点,shapeType=1,线,shapeType=3,多边形,shapeType=5);数据范围(bbox),只针对多点数据,代表该"几何数据"对象的边界范围;数据块(parts),只针对线或者多边形,代表该"几何数据"对象各个块的第一个点的索引;点集(points),代表该"几何数据"对象的所有点坐标。

    点集(points):这个已经介绍过了

    数据类型(shapeType):是shp文件内部按什么状态存放,以上面浙江省界例子来看是多边形shapeType=5,即区块

    sf = shapefile.Reader('Zhejiang_province')
    shapes = sf.shapes()
    print(shapes[0].shapeType)
    

    数据范围(bbox):就是经纬度的最大最小值,四个,上下左右
    重点说一下
    数据块(parts):既然上文提到了shp文件所描绘的边界会出现断开的现象,那从哪开始断开呢,就在这个属性里面记录。parts属性是一个列表,记录了每个区块第一个点的索引值,即下标。
    气象绘图目前精确一点的mask方法就是利用parts,points结合matplotlib中的路径功能来做mask。

    气象绘图利用shp文件做掩膜

    先放代码,还是以浙江省界为例

    fig = plt.figure(figsize=[12,18])
    ax = fig.add_subplot(111)
    
    sf = shapefile.Reader('Zhejiang_province')
    shapes = sf.shapes()
    codes = []
    pts = shapes[0].points#边界点
    prt = list(shapes[0].parts) + [len(pts)]#区块起始索引
    for i in range(len(prt) - 1):
        codes += [Path.MOVETO]#点移动
        codes += [Path.LINETO] * (prt[i+1] - prt[i] -2)#画线
        codes += [Path.CLOSEPOLY]#这块画完,循环结束,下一块
    clip = Path(pts, codes)#利用数据和路径生成一个画图动作
    clip = PathPatch(clip, transform=ax.transData)#再加入ax的变换
    

    prt的含义:上文已经说过了parts的意义,设想一下,两块区域的的起始坐标中间夹的不就是一块区域的所有坐标吗,但是最后一块区域没有结束值,所有加了[len(pts)],这就是最后一个点的索引。

    for循环的作用:建立一个绘图路径,利用区块起始点的索引生成一个画图动作

    最后生成的clip就是我们需要的掩膜mask,在合适的位置配合下列代码完成掩膜白化效果:

    cs = data.plot.contourf(ax=ax,levels=levels,cbar_kwargs=cbar_kwargs, cmap='Spectral_r')
    for contour in cs.collections:
            contour.set_clip_path(clip)
    

    大家可以不用理解原理,只需要明白,怎么读取shp文件,找到你需要的边界坐标点(points)和(parts),把他们带入其中,执行这个过程就可以了。

    下一个问题:Basemap库出现“utf-8”错误的解决方法

    Basemap库还是很好用的,但是有些朋友肯定出现过这个问题

    m.readshapefile('Zhejiang_province','Zhejiang Map',color='k',linewidth=1.2)
    

    当我们执行这条命令时报错

      File "C:\ProgramData\Miniconda3\lib\site-packages\shapefile.py", line 104, in u
        return v.decode(encoding, encodingErrors)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 2: invalid continuation byte
    

    这是shapefile需要读取文件得“utf-8”编码的缘故,解决方法,进入一下路径(作者的电脑,大家相应寻找)C:\ProgramData\Miniconda3\Lib\site-packages
    找到shapefile.py文件,复制一份(防止操作失误),然后在shapefile.py文件的第104行做修改

    #原来的
    return v.decode(encoding, encodingErrors)
    #修改为
    return v.decode('latin-1', encodingErrors)
    

    这样编译就可以通过了,如果以后碰到utf-8的出错了记得改回来。

    最后还是提醒大家文章是以单个shapes[0].points为例的,有一部分shp内部有很多个,记得做循环,筛选你需要的
    以我自己画的图结束吧
    在这里插入图片描述

    展开全文
  • 如下所示:import shapefilesf = shapefile...E:\1.2\cs\DX_CSL.shp")shapes = sf.shapes()print shapes[1].partsprint len(shapes) #79条记录#print len(list(sf.iterShapes())) #79条记录#for name in dir(sh...

    如下所示:

    import shapefile

    sf = shapefile.Reader("E:\1.2\cs\DX_CSL.shp")

    shapes = sf.shapes()

    print shapes[1].parts

    print len(shapes) #79条记录

    #print len(list(sf.iterShapes())) #79条记录

    #for name in dir(shapes[3]): #不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表

    # if not name.startswith("__"):

    # print name

    print sf.numRecords

    recds = sf.records()

    for i in range(sf.numRecords):

    rcd = sf.record(i)

    #sp = rcd.shape 没有shape属性

    #print sp.points

    #recds.shape

    #读取记录

    print sf.shapeRecord(1).shape.shapeType

    print sf.shapeRecord(1).record

    print sf.fields

    print ""

    for shp in range(len(shapes)):

    shap = shapes[shp]

    print shap.points

    print shap.shapeType

    print len(shap.points)

    for i in range(len(shap.points)):

    print shap.points[i]

    for x in range(len(shap.points[i])):

    print shap.points[i][x]

    以上这篇对python 读取线的shp文件实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

    本文标题: 对python 读取线的shp文件实例详解

    本文地址: http://www.cppcns.com/jiaoben/python/248075.html

    展开全文
  • python读写shp

    千次阅读 2021-01-23 13:49:58
    python读写shp文件所需的库为pyshp,对应的安装命令为 pip install pyshp 二、写出shape文件 本来想先写读取shape文件的,但是手头没有测试用的shp数据,就决定先写写出shp数据吧,这样就可以造一个读取用的测试数据...

    近期由于工作原因需要读写shape文件,主要涉及几何数据和属性数据,在网上学习了一番,有些问题网上也没解决方案,不过最终自己还是解决了,今天有空在此作一番整理,希望与各位进行分享

    一、前期准备

    python读写shp文件所需的库为pyshp,对应的安装命令为 pip install pyshp

    二、写出shape文件

    本来想先写读取shape文件的,但是手头没有测试用的shp数据,就决定先写写出shp数据吧,这样就可以造一个读取用的测试数据了

    直接上代码吧,通过代码来介绍会比较方便

    1、需要导入库,import shapefile
    
    2、定义一个写出shp文件的函数 write_shp,包含众多参数,下面一个个介绍
    
    3、target和shape_type是初始化shape.Writer的两个必要参数
    target是生成的shape文件的路径,具体到文件名即可,不用带后缀,程序会自动生产shp、dbf、shx三个文件
    shape_type是指定几何数据类型,是一个INT类型的数据,取值范围见代码,我们主要用1、3、5,分别对应点、线、面
    autoBalance设置为1可以避免几何数据行数与属性行数不匹配的问题,此时系统会自动填充属性,保持数量对应,默认是False,需要设置
    
    4、geo_data为几何数据,点线面的结构不同,在本函数中:
    points为点集(不是几何类型的点集,是我们包含很多行记录,多行记录组成的点集,下同),用列表表示,列表中的每一项为一个二维的点坐标,同样为列表类型,包含两个元素,分别为xy坐标,一个坐标对应一行记录;
    polylines为线集,用列表表示,列表中的每一项为一条线,一条线对应一行记录;一条线也用列表表示,其中的每一项为线的每一段(一条线可能分几段,一般就一段);一段也用列表表示,其中的每一项为一个二维点,同point;
    polygons为面集,用列表表示,列表中的每一项为一个面,实际上也是一条线,只是首尾相连;同线有好几段,面也可能有几条线组成,其他类似,所以线和面的结构相同;
    pointzs为三维点集,相比于points多了Z坐标,polylinezs和polygonzs也相同。
    
    5、后面五个参数是属性相关参数:
    field_names为属性名数组,个数与属性个数一致
    field_types为属性的数据类型数组,个数与属性个数一致,具体见代码,主要用“C”字符类型,“N”数字类型,“F”浮点数类型
    field_sizes为属性的数据长度,个数与属性个数一致,这个参数一般用于“C”字符类型的设置,默认为50
    field_decimals为属性值的保留小数位数,个数与属性个数一致,这个参数一般用于“F”浮点型的设置,默认为0
    field_values为属性值数组,个数与geo_data(行数)一致;每一项为一条记录,数值顺序为属性的顺序,个数与geo_data(行数)一致,属性值不存在的用None表示
    
    6、最后说一下文件的保存,之前看网上有用save()函数,但是我调用之后发现无此函数,同样查看源码后发现save()函数被注释了,写出文件已经集成到了record()函数,所以最后不用调save()
    
    #coding=utf-8
    import shapefile
    
    
    def write_shp(target, shape_type, geo_data, field_names, field_types, field_sizes, field_decimals, field_values):
        """
        生成的文件名,自动生成.shp .dbf .shx
        target = "D:\\test"
        
        '''
        几何类型
        NULL = 0
        POINT = 1
        POLYLINE = 3
        POLYGON = 5
        MULTIPOINT = 8
        POINTZ = 11
        POLYLINEZ = 13
        POLYGONZ = 15
        MULTIPOINTZ = 18
        POINTM = 21
        POLYLINEM = 23
        POLYGONM = 25
        MULTIPOINTM = 28
        MULTIPATCH = 31
        '''
        shapeType = 1
        
        几何数据
        points = [[1,1],[2,2]]
        polylines = [[[[1,1],[2,2]],[[2,2],[3,3]]],[[[1,2],[2,4]]]]
        polygons = [[[[1,1],[2,2],[3,1]],[[3,1],[2,2],[3,2]]],[[[1,2],[2,3],[1,3]]]]
        pointzs = [[1,1,1],[2,2,2]]
        polylinezs = [[[[1,1,1],[2,2,2]],[[2,2,3],[3,3,4]]],[[[1,2,5],[2,4,6]]]]
        polygonzs = [[[[1,1,1],[2,2,2],[3,1,3]],[[3,1,4],[2,2,5],[3,2,6]]],[[[1,2,7],[2,3,8],[1,3,9]]]]
        
        属性名称
        field_names = ['test1','test2','test3']
        
        '''
        属性类型
        “C”:字符,文字。
        “N”:数字,带或不带小数。
        “F”:浮动(与“N”相同)。
        “L”:逻辑,表示布尔值True / False值。
        “D”:日期。
        “M”:备忘录,在GIS中没有意义,而是xbase规范的一部分。
        '''
        field_types = ['C','N','F']
        
        字段长度,默认50
        field_sizes = [50,50,50]
        
        字段精度,默认为0
        field_decimals = [0,0,2]
        
        属性值
        field_values = [['a',1,1.111],['b',2,2.226]]
        """
        try:
            w=shapefile.Writer(target=target, shapeType=shape_type, autoBalance=1)
            # 添加属性
            for idx_field in range(len(field_names)):
                w.field(field_names[idx_field], field_types[idx_field], field_sizes[idx_field], field_decimals[idx_field])
            for idx_record in range(len(geo_data)):
                # 写出几何数据
                if shape_type == 1:
                    w.point(*geo_data[idx_record])
                elif shape_type == 3:
                    w.line(geo_data[idx_record])
                elif shape_type == 5:
                    w.poly(geo_data[idx_record])
                elif shape_type == 11:
                    w.pointz(*geo_data[idx_record])
                elif shape_type == 13:
                    w.linez(geo_data[idx_record])
                elif shape_type == 15:
                    w.polyz(geo_data[idx_record])
                else:
                    continue
    
                # 写出属性数据
                record = []
                for idx_field in range(len(field_names)):
                    record.append(field_values[idx_field][idx_record])
                w.record(*record)
            return "success"
        except shapefile.ShapefileException as e:
            return repr(e)
    
    
    
    field_names = ['test1','test2','test3']
    field_types = ['C','N','F']
    field_sizes = [50,50,50]
    field_decimals = [0,0,2]
    field_values = [['a',1,1.111],['b',2,2.226]]
    
    target = "D:\\data\\shp\\point"
    shape_type = 1
    points = [[1,1],[2,2]]
    print(write_shp(target, shape_type, points, field_names, field_types, field_sizes, field_decimals, field_values))
    
    target = "D:\\data\\shp\\polyline"
    shape_type = 3
    polylines = [[[[1,1],[2,2]],[[2,2],[3,3]]],[[[1,2],[2,4]]]]
    print(write_shp(target, shape_type, polylines, field_names, field_types, field_sizes, field_decimals, field_values))
    
    target = "D:\\data\\shp\\polygon"
    shape_type = 5
    polygons = [[[[1,1],[2,2],[3,1]],[[3,1],[2,2],[3,2]]],[[[1,2],[2,3],[1,3]]]]
    print(write_shp(target, shape_type, polygons, field_names, field_types, field_sizes, field_decimals, field_values))
    
    target = "D:\\data\\shp\\pointz"
    shape_type = 11
    pointzs = [[1,1,1],[2,2,2]]
    print(write_shp(target, shape_type, pointzs, field_names, field_types, field_sizes, field_decimals, field_values))
    
    target = "D:\\data\\shp\\polylinez"
    shape_type = 13
    polylinezs = [[[[1,1,1],[2,2,2]],[[2,2,3],[3,3,4]]],[[[1,2,5],[2,4,6]]]]
    print(write_shp(target, shape_type, polylinezs, field_names, field_types, field_sizes, field_decimals, field_values))
    
    target = "D:\\data\\shp\\polygonz"
    shape_type = 15
    polygonzs = [[[[1,1,1],[2,2,2],[3,1,3]],[[3,1,4],[2,2,5],[3,2,6]]],[[[1,2,7],[2,3,8],[1,3,9]]]]
    print(write_shp(target, shape_type, polygonzs, field_names, field_types, field_sizes, field_decimals, field_values))
    

    函数和测试代码都如上所示,可直接运行,得到对应的文件,如下图所示
    在这里插入图片描述

    使用ArcMap打开二维shp,如下图所示
    几何数据显示正常,接口调用的参数是polygons,读者也可以改成points或polylines
    属性也显示正常,因为field_decimals设置的浮点数保留2位小数,所以输入的3位小数四舍五入成2位
    几何数据绘制
    shp属性表
    使用ArcScene打开三维shp,如下图所示
    在这里插入图片描述

    三、读取shp文件

    通过上一节,我们得到了带有几何数据和属性数据的shp文件,这一节我们来读取它们

    3.1 读取属性列表

    首先来读取属性列表,直接上代码

    #coding=utf-8
    import shapefile
    
    def get_shp_field_list(path):
        try:
            try:
                file = shapefile.Reader(path, encoding="gbk")
            except UnicodeDecodeError:
                file = shapefile.Reader(path)
            fields = file.fields
            res = []
            for field in fields:
                res.append(field[0])
            
            return res
        
        except shapefile.ShapefileException as e:
            return repr(e)
            
    print(get_shp_field_list("D:\\data\\shp\\polygon"))
    
    path是shp文件的路径,读取使用的是shapefile.Reader,第一个参数是shp路径,只需写到文件名即可,不用带后缀(带也无所谓),encoding需要设置为‘gbk’,用来解析中文
    

    调用此函数,可得到
    获取到的属性列表

    3.2 读取几何和属性值

    获取到属性列表后,可继续获取每一行的几何数据和你想要的属性的属性值,代码如下。

    path是shp文件路径,同上
    fields是需要获取的属性名列表
    
    #coding=utf-8
    import shapefile
    
    def get_shp_shape_records(path, fields):
        try:
            try:
                file = shapefile.Reader(path, encoding="gbk")
            except UnicodeDecodeError:
                file = shapefile.Reader(path)
            shape_records = file.shapeRecords()
            
            shp_types = []
            shp_datas = []
            shp_fields = []
            for i in range(len(fields)):
                field_values = []
                shp_fields.append(field_values)
    
            for shape_record in shape_records:
                # type
                shp_type = shape_record.shape.shapeType
                if shp_type == 1:
                    shp_types.append('point')
                    points = shape_record.shape.points
                    points_order = []
                    points_order.append(len(points))
                    for point in points:
                        points_order.append(point[0])
                        points_order.append(point[1])
                    shp_datas.append(points_order)
                elif shp_type == 3:
                    shp_types.append('polyline')
                    points = shape_record.shape.points
                    parts = shape_record.shape.parts
                    polyline_record = []
                    for idx in range(0,len(parts)-1):
                        polyline_record_part = points[parts[idx]:parts[idx+1]]
                        polyline_record.append(polyline_record_part)
                    polyline_record_part = points[parts[-1]:]
                    polyline_record.append(polyline_record_part)
                    shp_datas.append(polyline_record)
                elif shp_type == 5:
                    shp_types.append('polygon')
                    points = shape_record.shape.points
                    parts = shape_record.shape.parts
                    polygon_record = []
                    for idx in range(0,len(parts)-1):
                        polygon_record_part = points[parts[idx]:parts[idx+1]]
                        polygon_record.append(polygon_record_part)
                    polygon_record_part = points[parts[-1]:]
                    polygon_record.append(polygon_record_part)
                    shp_datas.append(polygon_record)
                elif shp_type == 11:
                    shp_types.append('pointz')
                    points = shape_record.shape.points
                    zs = shape_record.shape.z
                    points_order = []
                    points_order.append(len(points))
                    for idx in range(len(points)):
                        points_order.append(points[idx][0])
                        points_order.append(points[idx][1])
                        points_order.append(zs[idx])
                    shp_datas.append(points_order)
                elif shp_type == 13:
                    shp_types.append('polylinez')
                    points = shape_record.shape.points
                    zs = shape_record.shape.z
                    parts = shape_record.shape.parts
                    polylinez_record = []
                    for idx in range(0,len(parts)-1):
                        polylinez_record_part = []
                        for idx_pt in range(parts[idx],parts[idx+1]):
                            pt = list(points[idx_pt])
                            pt.append(zs[idx_pt])
                            polylinez_record_part.append(pt)
                        polylinez_record.append(polylinez_record_part)
    
                    polylinez_record_part = []
                    for idx_pt in range(parts[-1],len(points)):
                        pt = list(points[idx_pt])
                        pt.append(zs[idx_pt])
                        polylinez_record_part.append(pt)
                    polylinez_record.append(polylinez_record_part)
                    shp_datas.append(polylinez_record)
                elif shp_type == 15:
                    shp_types.append('polygonz')
                    points = shape_record.shape.points
                    zs = shape_record.shape.z
                    parts = shape_record.shape.parts
                    polygonz_record = []
                    for idx in range(0,len(parts)-1):
                        polygonz_record_part = []
                        for idx_pt in range(parts[idx],parts[idx+1]):
                            pt = list(points[idx_pt])
                            pt.append(zs[idx_pt])
                            polygonz_record_part.append(pt)
                        polygonz_record.append(polygonz_record_part)
    
                    polygonz_record_part = []
                    for idx_pt in range(parts[-1],len(points)):
                        pt = list(points[idx_pt])
                        pt.append(zs[idx_pt])
                        polygonz_record_part.append(pt)
                    polygonz_record.append(polygonz_record_part)
                    shp_datas.append(polygonz_record)
                else:
                    return "undefined type"
    
                # field
                for idx, field in enumerate(fields):
                    shp_fields[idx].append(shape_record.record[field])
    
            return shp_types, shp_datas, shp_fields
            
        except shapefile.ShapefileException as e:
            return repr(e)
    
    print(get_shp_shape_records("D:\\data\\shp\\point", ['test1','test3']))
    print(get_shp_shape_records("D:\\data\\shp\\polyline", ['test1','test3']))
    print(get_shp_shape_records("D:\\data\\shp\\polygon", ['test1','test3']))
    print(get_shp_shape_records("D:\\data\\shp\\pointz", ['test1','test3']))
    print(get_shp_shape_records("D:\\data\\shp\\polylinez", ['test1','test3']))
    print(get_shp_shape_records("D:\\data\\shp\\polygonz", ['test1','test3']))
    
    调用此函数,可得到一个元组,共三项
    第一项是每一行的几何类型
    第二项是每一行的几何数据,结构同写出shp时的介绍
    第三项是每一行的属性数据,列表中的元素数量与输入的属性名个数相同,每个属性的列表中的元素个数与几何数据的个数(行数)相同
    

    在这里插入图片描述

    四、shp文件追加记录

    有时候我们需要为已经存在的shp文件增加记录,我翻看了shapefile库,未找到可以追加的方法,只能采用大家都能想得到的方法了,方法流程和代码如下

    先用read的方法获取原shp文件数据
    然后用write的方法创建新的shp文件对象,把read出来的数据写入该对象
    最后将追加的数据写入该对象
    
    #coding=utf-8
    import shapefile
    
    
    def add_shp_records(path, geo_data, field_values):
        try:
            # 先读取原文件的几何数据和属性数据
            try:
                file = shapefile.Reader(path, encoding="gbk")
            except UnicodeDecodeError:
                file = shapefile.Reader(path)
            shape_records = file.shapeRecords()
            shape_fields = file.fields
            shape_type = file.shapeType
    
            # 创建与原文件同名的导出文件
            w=shapefile.Writer(target=path, shapeType=shape_type, autoBalance=1)
            
            # 创建与原文件相同的属性
            for shape_field in shape_fields:
                w.field(*shape_field)
            
            # 将原文件的几何数据和属性数据添加到新文件
            for shape_record in shape_records:
                w.shape(shape_record.shape)
                w.record(*shape_record.record)
    
            # 在新文件追加待添加的几何数据和属性数据
            for idx_record in range(len(geo_data)):
                # 追加几何数据
                if shape_type == 1:
                    w.point(*geo_data[idx_record])
                elif shape_type == 3:
                    w.line(geo_data[idx_record])
                elif shape_type == 5:
                    w.poly(geo_data[idx_record])
                elif shape_type == 11:
                    w.pointz(*geo_data[idx_record])
                elif shape_type == 13:
                    w.linez(geo_data[idx_record])
                elif shape_type == 15:
                    w.polyz(geo_data[idx_record])
                else:
                    continue
    
                # 追加属性数据
                w.record(*field_values[idx_record])
                
            return "success"
            
    
        except shapefile.ShapefileException as e:
            return repr(e)
    
    
    path = 'D:\data\shp\point'
    points = [[3,3],[4,4]]
    field_values = [['c',3,None],['d',4,None]]
    print(add_shp_records(path, points, field_values))
    
    

    原文件arcgis显示
    在这里插入图片描述
    追加记录后arcgis显示
    在这里插入图片描述

    展开全文
  • python gdal读写shp文件

    千次阅读 2021-01-16 19:09:29
    安装QGIS,直接使用QGIS带的python解释器,就不用了安装各种环境和配置了,很方便。 代码见: 注释写的非常详细。 # -*- coding: utf-8 -*- try: from osgeo import gdal from osgeo import ogr from osgeo ...

    环境配置见:

    https://blog.csdn.net/sinat_41310868/article/details/112210366

    安装QGIS,直接使用QGIS带的python解释器,就不用了安装各种环境和配置了,很方便。

    代码见:

    注释写的非常详细。

    # -*- coding: utf-8 -*-
    try:
        from osgeo import gdal
        from osgeo import ogr
        from osgeo import osr
    except ImportError:
        import gdal
        import ogr
        import osr
    
    # 写入shp文件,polygon
    def writeShp():
        # 支持中文路径
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
        # 属性表字段支持中文
        gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
        # 注册驱动
        ogr.RegisterAll()
        # 创建shp数据
        strDriverName = "ESRI Shapefile"
        oDriver = ogr.GetDriverByName(strDriverName)
        if oDriver == None:
            return "驱动不可用:"+strDriverName
        # 创建数据源
        oDS = oDriver.CreateDataSource("polygon.shp")
        if oDS == None:
            return "创建文件失败:polygon.shp"
        # 创建一个多边形图层,指定坐标系为WGS84
        papszLCO = []
        geosrs = osr.SpatialReference()
        geosrs.SetWellKnownGeogCS("WGS84")
        # 线:ogr_type = ogr.wkbLineString
        # 点:ogr_type = ogr.wkbPoint
        ogr_type = ogr.wkbPolygon
        # 面的类型为Polygon,线的类型为Polyline,点的类型为Point
        oLayer = oDS.CreateLayer("Polygon", geosrs, ogr_type, papszLCO)
        if oLayer == None:
            return "图层创建失败!"
        # 创建属性表
        # 创建id字段
        oId = ogr.FieldDefn("id", ogr.OFTInteger)
        oLayer.CreateField(oId, 1)
        # 创建name字段
        oName = ogr.FieldDefn("name", ogr.OFTString)
        oLayer.CreateField(oName, 1)
        oDefn = oLayer.GetLayerDefn()
        # 创建要素
        # 数据集
        # wkt_geom id name
        features = ['test0;POLYGON((-1.58 0.53, -0.79 0.55, -0.79 -0.23, -1.57 -0.25, -1.58 0.53))',
                    'test1;POLYGON((-1.58 0.53, -0.79 0.55, -0.79 -0.23, -1.57 -0.25, -1.58 0.53))']
        for index, f in enumerate(features):
            oFeaturePolygon = ogr.Feature(oDefn)
            oFeaturePolygon.SetField("id",index)
            oFeaturePolygon.SetField("name",f.split(";")[0])
            geomPolygon = ogr.CreateGeometryFromWkt(f.split(";")[1])
            oFeaturePolygon.SetGeometry(geomPolygon)
            oLayer.CreateFeature(oFeaturePolygon)
        # 创建完成后,关闭进程
        oDS.Destroy()
        return "数据集创建完成!"
    
    # 读shp文件
    def readShp():
        # 支持中文路径
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
        # 支持中文编码
        gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
        # 注册所有的驱动
        ogr.RegisterAll()
        # 打开数据
        ds = ogr.Open("polygon.shp", 0)
        if ds == None:
            return "打开文件失败!"
        # 获取数据源中的图层个数,shp数据图层只有一个,gdb、dxf会有多个
        iLayerCount = ds.GetLayerCount()
        print("图层个数 = ", iLayerCount)
        # 获取第一个图层
        oLayer = ds.GetLayerByIndex(0)
        if oLayer == None:
            return "获取图层失败!"
        # 对图层进行初始化
        oLayer.ResetReading()
        # 输出图层中的要素个数
        num = oLayer.GetFeatureCount(0)
        print("要素个数 = ", num)
        result_list = []
        # 获取要素
        for i in range(0, num):
            ofeature = oLayer.GetFeature(i)
            id = ofeature.GetFieldAsString("id")
            name = ofeature.GetFieldAsString('name')
            geom = str(ofeature.GetGeometryRef())
            result_list.append([id,name,geom])
        ds.Destroy()
        del ds
        return result_list
    writeResult = writeShp()
    print(writeResult)
    readResult = readShp()
    print(readResult)

     

    展开全文
  • python3 读写shp文件.txt

    千次阅读 2019-10-25 09:24:54
    参考:https://www.jianshu.com/p/7b182ea6aa02 参考:...1. 安装 pip install pyshp pip3 install pyshp 2. 知识点: shapeType,文件类型。 NULL = 0 POINT = 1 POLYLINE = ...
  • Pythonshp文件

    千次阅读 2020-10-16 14:40:31
    是一个Python库,用于在Python脚本中对ArcGIS中的Shapefile文件(.shp,.shx,.dbf等格式)进行读写操作。 Reader类, 对shapefile文件读取;Editor类,对shapefile文件编辑;Writer类,对shapefile文件写操作 每个文件...
  • python读取shp地图

    2021-03-21 22:09:35
    这是读取shp文件的基本操作,shapes里面存放的就是地图信息类的数组。,里面一个或者多个shapefile类。 sf = shapefile.Reader('Zhejiang_province') shapes = sf.shapes() pts = shapes[0].points prt =shapes[0]....
  • 最近用python生成了shp文件文件,打开后属性表内容中的中文字符均为乱码,度娘之后发了一个解决方法,备着自己用:我用的ArcGIS 10.2版本,可以通过下面的方法来设置编码行为:方法一:1. 开始--运行,输入”Regedit...
  • 1、读shapefile文件主要读以下内容,包括spatialRef投影信息,layerDefn图层定义信息,geomType几何对象类型,fieldDefn字段定义信息。geomlist是得到了每一个feature的geometryRef后转为Wkt形式表示的坐标点位,...
  • 基于python的basemap库,读取并显示凉山市的shp数据地图,并分颜色显示行政区域规划、河流、道路、水库、乡镇及乡镇名等,并显示对应的比例尺。 代码100行,不难
  • import shapefilesf = shapefile.Reader(“E:\\1.2\\cs\\DX_CSL.shp”)shapes = sf.shapes()print shapes[1].partsprint len(shapes) #79条记录#print len(list(sf.iterShapes())) #79条记录#for name in dir(shapes...
  • python 读取矢量文件

    2020-12-03 12:09:55
    #导入包from osgeo import ogr#打开文件(False - read only, True - read/write)filename = "文件名.shp"ds = ogr.Open(filename, False)#获取第一个图层layer = ds.GetLayer(0)#获取投影信息spatialref = layer....
  • 主要介绍了利用Python裁切tiff图像且读取tiff,shp文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • JSON(JavaScript Object Nonation)是利用键值对+嵌套来表示数据的一种格式,以其轻量、易解析的优点,这篇文章主要介绍了利用Python实现Shp格式向GeoJSON的转换,需要的朋友可以参考下
  • 提取.shp文件中信息并绘图保存

    热门讨论 2013-04-12 11:35:23
    运用matlab读取.shp文件并分块提取坐标信息,绘制各块的图形并保存坐标
  • python GDAL 读写shp文件

    2020-03-20 09:49:02
    C:\Program Files\pythonxy\python\python.exe #-*- coding:gb2312 -*- from osgeo import ogr,osr,gdal import os """ Understanding OGR Data Type: Geometry - wkbPoint,wkbLineString,wkbPolygon,wkbMulti...
  • GDAL读写shp文件代码

    2017-06-13 23:31:57
    使用GDAL读取矢量数据shp文件的一个例子,并提供了数据导出的接口,VS2013代码!
  • 本程序实现shp文件范围内的格点选取 ''' import numpy as np import shapefile import shapely.geometry as geometry from shapely.geometry import Polygon from shapely.ops import cascaded_union import ...
  • Arcgis中利用python语言对shp文件批量添加字段,注释详细,只需更改shp文件所在文件夹路径,以及相关字段名称、类型、长度等设置即可
  • 今天小编就为大家分享一篇解决python ogr shp字段写入中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,702
精华内容 680
关键字:

python读取shp文件

python 订阅
友情链接: sync_fifo.zip