OGR读取shp多边形

一、导入ogr库

一般不推荐直接导入ogr,容易出问题。

import ogr

ogr官网上推荐采用以下两种两种方法

from osgeo import ogr
try:
    from osgeo import ogr
except:
    import ogr

二、获取数据驱动

读取shp文件前要获取数据驱动来打开数据

driver = ogr.GetDriverByName("Esri Shapefile")
inpath = "***.shp"
datasource = driver.Open(inpath, 0)# 0为只读,1为可写:

driver.Open()方法如下

Open(self, char name, int update = 0) #其中update值 0为只读,1为可写:

三、新建图层并遍历数据

ogr读取的shp文件并不能直接处理,需要从打开的数据源创建Layer-图层,然后再进行循环遍读取多边形。ogr中采用GetGeometryRef()读取形状。由于多边形的特殊,需要调用两次该方法才能读取出多边形的坐标节点列表。第一次调用读取出的形状是多边形,第二次调用读取的是组成多边形的折线,读取出折线后才能获取折点的x,y坐标。

layer = datasource.GetLayer(0)#GetLAayer方法默认参数为o
for feature in layer:
    list = []
     geom = feature.GetGeometryRef()
     polygon = geom.GetGeometryRef(0)
     for i in range(polygon.GetPointCount()):
         x = polygon.GetX(i)
         y = polygon.GetY(i)
         list.append([x, y])

PS:获取多边形属性操作类似,采用的是GetField('CNTRY_NAME')方法

for feature in layer:
    field = feature.GetField('CNTRY_NAME')#参数采用字段名或数字,类似从列表获取元素。

遍历属性表可以采用一下方式

for feature i layer:
    for i in range(feature.GetFieldCount()):
        feature.GetField(i)

读取多边形节点和属性代码

from osgeo import ogr

inpath = "文件名.shp"

driver = ogr.GetDriverByName("Esri Shapefile")
datasource = driver.Open(inpath, 0)# 0为只读,1为可写:
layer = datasource.GetLayer(0)#GetLAayer方法默认参数为o
for feature in layer:
    list = []
    fields = []
    for i in range(feature.GetFieldCount()):
        fields.append(feature.GetField(i))
    geom = feature.GetGeometryRef()
    polygon = geom.GetGeometryRef(0)
    for i in range(polygon.GetPointCount()):
        x = polygon.GetX(i)
        y = polygon.GetY(i)
        list.append([x, y])
    fields.append(list)

附说明

本文用于个人记录ogr学习使用过程,如果要系统学习ogr使用,推荐去osgeo官网

获取shp属性和坐标的方法有很多。如果要单纯获取属性表,可以直接拖拽对应文件的dbf至excel打开再另存为。获取坐标的话也可以在对应的文件的属性表内新建x,y字段选择计算几何。

自写完整代码

import sys
from osgeo import ogr

def getfield(feature):
      """
      获取多边形对应属性信息
      :param feature:多边形
      :return:多边形属性(列表)
      """
      fieldlist = []
      for i in range(feature.GetFieldCount()):
            fieldlist.append(feature.GetField(i))
      return fieldlist

def extra_node(feature):
      """
      获取多边形节点坐标,存储为二维列表,o为x坐标,1为有坐标
      :param: eature,获取的多边形:
      :return: 多边形节点坐标对,列表
      """
      list = []
      geom = feature.GetGeometryRef()
      polygon = geom.GetGeometryRef(0)
      for i in range(polygon.GetPointCount()):
            x = polygon.GetX(i)
            yi = polygon.GetY(i)
            list.append([x, yi])
      return list

def writerow(wrtpath, list):
      """
      写入CSV行
      :param path: 输出文件路径
      :param list: 写入列表
      :return:
      """
      with open(wrtpath, 'w', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(list)
      f.close()

wspath = "lane.shp"
# 输出文件路径
outpath = "D:/Research/"
# 输出文件名
name = "3600-3900.csv"
#属性表和点对
fieldtable = []
nodetable = []

# 创建数据源
dadtasource = ogr.Open(wspath)
# 初始化驱动
driver = dadtasource.GetDriver()
if dadtasource == None:
      print("Can't Open The File")
      sys.exit()
else:
      print("Done!")
# 获取要素图层
layer = dadtasource.GetLayer()
# 遍历所有要素多边形
for feature in layer:
      fields = shptool.getfield(feature)  # 获取当前要素多边形属性信息
    # fieldtable.append(fields)  # 写入当前要素多边形属性信息至表,可不用
      points = shptool.extra_node(feature)  # 获取要素多边形节点
      fields.append(points)
      DataTools.writerow(out_file, fields)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值