【Python】利用ogr包读取空间数据文件(二):读出Coverage文件节点信息

首先讲讲为什么要去做这么一件事情:希望可以用自己用Python写的迪杰斯特拉算法来计算网络图上两个节点的最短路径,于是就需要把coverage文件的信息读进来,生成一个类似于邻接矩阵的矩阵。

一、先加载ogr与numpy的包

import ogr  
import numpy as np

二、创建读取coverage文件的驱动,并读取文件

driver = ogr.GetDriverByName('AVCBin')
filename = 'G:\\data\\coverage\\road\\arc.adf'
dataSource = driver.Open(filename,0)

三、读取coverage中要素的数量

layer = dataSource.GetLayer(0)
n = layer.GetFeatureCount()

四、查找coverage中的最大节点数(这里遇到了一个问题,不知道为什么GetField方法不能直接通过字段名称读取数据,在这里卡了好久,最终查了官方文档后,发现还可以直接通过字段的序号来读取)

nmax = n1 = n2 = 0
for r in range(1, n+1):    
    rr = layer.GetFeature(r)
    n1 = rr.GetField(1)
    if n1 > nmax:
        nmax = n1
    n2 = rr.GetField(2)
    if n2 > nmax:
        nmax = n2

五、利用numpy创建一个nmax*nmax的零二维数组,并给不是对角线上的数值赋值无穷大

road_list = np.zeros((nmax,nmax))
for i in range(0, nmax):
    for j in range(0, nmax):
        if i != j:
            road_list[i][j] = float('inf')

六、遍历coverage文件中的要素,读取节点信息(包括前节点FNODE、后节点TNODE以及长度LENGTH)

for r in range(1, n+1):    
    rr = layer.GetFeature(r)
    n1 = rr.GetField('FNODE') - 1  
    n2 = rr.GetField('TNODE') - 1
    road_list[n1][n2] = road_list[n2][n1] = rr.GetField('LENGTH')

七、读取完成


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页