GDAL讀取midmif檔案(python版)

2021-09-25 06:06:10 字數 4066 閱讀 2959

在工作中,需要經常跟midmif檔案打交道,並且經常都是批量處理,雖然mapinfo工具也可以做到,但是公司沒有購買版權,只有尋求它法。

作為乙個產品pm,對技術不怎麼精通,對python也不熟悉,但是產品語言和技術語言都是相通的,於是工作之餘學習研究了一段時間,現在的水平基本可以處理一些基本的業務和產品邏輯需求。把自己的學習小成果總結下,方便入門gdal的同學,更多的是梳理下知識。

讀取midmif檔案步驟:

1、建立驅動;

2、建立datasource;

3、遍歷datasource中的layer;

4、獲取layer的屬性;

5、獲取feature的值。

實現**:

driver = ogr.getdriverbyname("mapinfo file")

#datapath是mif檔案所在的目錄

ds = driver.open(datapath)

#遍歷datasource中的內容

for layer in ds:

#獲取每乙個layer的名稱

layer_name = in_layer.getname()

print(layer_name)

#獲取layer的屬性定義

layer_defn = layer.getlayerdefn()

#遍歷layer下的feature

for field_index in range(0, layer_defn.getfieldcount()):

#獲取每乙個layer中的field定義

ofield =layer_defn.getfielddefn(field_index)

#輸出每乙個屬性的名稱,屬性型別,屬性長度,屬性精度

print( '%s: %s(%d.%d)' % (ofield.getnameref(),ofield.getfieldtypename(ofield.gettype()),ofield.getwidth(),ofield.getprecision()))

#遍歷圖層中的要素

#遍歷圖層中的要素,遍歷方式1:

feature = layer.getnextfeature()

while feature is not none:

# 獲取要素中的屬性表內容

for index in range(layer_defn.getfieldcount()):

ofield =layer_defn.getfielddefn(index)

line = " %s (%s) = " % (ofield.getnameref(),ofield.getfieldtypename(ofield.gettype()))

if feature.isfieldset(index):

line = line+ "%s" % (feature.getfieldasstring(index))

else:

line = line+ "(null)"

print(line)

# 獲取要素中的幾何體

geometry =feature.getgeometryref()

print(geometry)

# 演示,只輸出乙個要素資訊

break

#遍歷圖層中的要素,遍歷方式2:

for feature in layer:

#根據不同layer,獲取相應的字段值

if layer_name == 'plateres_manoeuvreanhui':

#獲取相應的字段的值

group_id = feature.getfield("group_id")

print(group_id)

#滿足條件時,更新相應的字段值,這裡可以批量更新某些欄位的值

if group_id == '3122685':

feature.setfield("datetype", '22')

#演示,輸出乙個要素資訊

break

feature.destroy()

## 完整的**如下:

#python**

import os,sys

from osgeo import gdal

from osgeo import ogr

from osgeo import osr

#讀取mif檔案

def readmif(file_path):

#為了支援中文路徑

gdal.setconfigoption("gdal_filename_is_utf8","no")

#為了使屬性表字段支援中文

gdal.setconfigoption("shape_encoding","")

#註冊所有的驅動

ogr.registerall()

#建立mif型別檔案驅動

driver = ogr.getdriverbyname('mapinfo file')

print(file_path)

ds = driver.open(file_path)

for layer in ds:

layer_name = layer.getname()

print(layer_name)

layer_defn = layer.getlayerdefn()

for field_index in range(0, layer_defn.getfieldcount()):

#獲取每乙個layer中的field定義

field_defn = layer_defn.getfielddefn(field_index)

#獲取屬性定義

ofield =layer_defn.getfielddefn(field_index)

#輸出每乙個屬性的名稱,屬性型別,屬性長度,屬性精度

print( '%s: %s(%d.%d)' % (ofield.getnameref(),ofield.getfieldtypename(ofield.gettype()),ofield.getwidth(),ofield.getprecision()))

#遍歷圖層中的要素,遍歷方式1:

feature = layer.getnextfeature()

while feature is not none:

# 獲取要素中的屬性表內容

for index in range(layer_defn.getfieldcount()):

ofield =layer_defn.getfielddefn(index)

line = " %s (%s) = " % (ofield.getnameref(),ofield.getfieldtypename(ofield.gettype()))

if feature.isfieldset(index):

line = line+ "%s" % (feature.getfieldasstring(index))

else:

line = line+ "(null)"

print(line)

# 獲取要素中的幾何體

geometry =feature.getgeometryref()

print(geometry)

# 為了演示,只輸出乙個要素資訊

break

#遍歷圖層中的要素,遍歷方式2:

for feature in layer:

if layer_name == 'plateres_manoeuvreanhui':

data_field = feature.getfield("group_id")

print(data_field)

break

feature.destroy()

ds.destroy()

def main():

file_path = sys.ar**[1]

readmif(file_path)

if __name__ == "__main__":

main()

使用python讀取mid mif檔案

1.使用geopandas讀取 df geopandas.read file path,encoding utf 8 gdf geopandas.geodataframe df,geometry geometry crs init epsg 4326 此方法簡單。但是缺點較為明顯,當檔案較大時,會比...

新版GDAL 讀取shape檔案讀取失敗和亂碼

於是找到網上的 gdal之ogr入門 include ogrsf frmts.h int main ogrlayer polayer polayer pods getlayerbyname point ogrfeature pofeature polayer resetreading while p...

使用GDAL讀取影像

最近在學習gdal和opencv,gdal的強大功能我就不用說了,大家上網可以查到很多關於它的資料。opencv是乙個開源的計算機視覺庫,可以去opencv中文論壇具體了解它,說下我的構思吧,opencv庫里有很多關於數字影象處理的函式,但是它卻侷限於遙感影象的讀取,而gdal卻對遙感影像的讀取支援...