Window10 64位,通过Python读取.mif, shp文件
1. 讀取依賴庫及安裝
依賴模塊osgeo ,osgeo依賴于GDAL
.mif 是Mapinfo支持的信息
.shp是 postgis存儲地理空間信息的文件格式;
嘗試了很多安裝方法:包括安裝Anaconda,因為有博客說anaconda中包含GDAL,失敗了。
由于GDAL不是純python模塊,通過pip install GDAL==3.1.2可能沒法安裝成功;
最終通過下邊方式完美安裝成功:
Windos10 64位osgeo安裝
- 在此處下載GDAL wheel
- 安裝及驗證
2. .MIF文件讀取
.MIF文件是Mapinfo中保存地理坐標等信息的文件格式;由文件頭+幾何信息(.MIF文件)和文件頭一次的屬性值(.MID文件)構成;
倆個文件放在同一個目錄下,文件名相同只是后綴不同;讀取會都讀取進來。
# python讀取.mif 代碼
from osgeo import gdal
from osgeo import ogr# 讀取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_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()# print("feature: ", feature)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: ", line)# 獲取每個field的值,可以用 feature.GetField(oField.GetNameRef()) 或者 feature.GetFieldAsString(index)# print("\t: ", feature.GetField(oField.GetNameRef()))# 獲取要素中的幾何體geometry = feature.GetGeometryRef()print("geom: ", geometry)print()# 為了演示,只輸出一個要素信息break# 遍歷圖層中的要素,遍歷方式2:# for feature in layer:# if layer_name == 'PlateRes_Manoeuvreanhui':# data_field = feature.GetField("Group_ID")# print('data_field: ', data_field)# print("geom: ", feature.GetGeometryRef())# print("kind: ", feature.GetField("Kind"))# print("Direction: ", feature.GetField("Direction"))# print("Fields: ", feature.GetField("Field3"))# breakfeature.Destroy()ds.Destroy()def main():file_path = "F://mat//chongqin_hd.MIF"readmif(file_path)if __name__ == "__main__":main()
參考:
-
https://blog.csdn.net/belong0204/article/details/70161344?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.edu_weight)
-
https://blog.csdn.net/u011210523/article/details/95808300
總結
以上是生活随笔為你收集整理的Window10 64位,通过Python读取.mif, shp文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV-Python形态变换、图像
- 下一篇: Java gdal .mif/.mid文