Lebih

Bagaimana cara mengakses informasi metadata dan metatipe Shapefile menggunakan OGR?


Saya mencoba menggunakan ogrinfo untuk mendapatkan beberapa detail tentang shapefile. Sekarang, satu-satunya cara yang saya tahu adalah menggunakan orginfo:

ogrinfo -ro -so -al BRA_001.shp

Tetapi menampilkan semua informasi tentang bentuknya:

INFO: Buka '.BRA_001.shp' menggunakan driver 'ESRI Shapefile' berhasil. Nama lapisan: BRA_001 Geometri: Poligon 3D Jumlah Fitur: 273 Luas: (-42.645514, -22.360532) - (-42.321728, -22.198300) Lapisan SRS WKT: GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG",,"6326"]], PRIMEM[ "Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["derajat",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4326"]] Nama : String (0.0) deskripsi: String (0.0) timestamp: String (0.0) begin: String (0.0) end: String (0.0) altitudeMode: String (0.0) tessellate: Integer (0.0) extrude: Integer (0.0) visibility: Integer (0.0) drawOrder: String (0.0) ikon: String (0.0)

Omong-omong, ini sangat berguna, tetapi yang saya butuhkan hanyalah mendapatkan hanya nama metadata dengan tipe, mis .:

Nama: String (0.0) deskripsi: String (0.0) timestamp: String (0.0) begin: String (0.0) end: String (0.0) altitudeMode: String (0.0) tessellate: Integer (0.0) extrude: Integer (0.0) visibility: Integer (0.0) drawOrder: String (0.0) ikon: String (0.0)

Dapatkah seseorang membantu saya?


Cara yang sangat cepat adalah dengan menggunakan ekor utilitas baris perintah linux sebagai berikut:

ogrinfo -ro -so -al BRA_001.shp | ekor -n + 20

Namun, ini tidak selalu dapat diulang jika SRS berbeda. Seperti yang disebutkan user30184, Anda harus menggunakan OGR API. Contoh berikut dalam Python:

dari osgeo import ogr shpFile = r"./BRA_001.shp" dataSource = ogr.Open(shpFile) layer = dataSource.GetLayer(0) layerDefn = layer.GetLayerDefn() untuk i dalam jangkauan(layerDefn.GetFieldCount()): fieldName = layerDefn.GetFieldDefn(i).GetName() fieldTypeCode = layerDefn.GetFieldDefn(i).GetType() fieldType = layerDefn.GetFieldDefn(i).GetFieldTypeName(fieldTypeCode) fieldWidth = layerDefn.GetFieldDefn(i).GetPrecision(i).GetPrecision (Namabidang) + ": " + str(Tipe bidang) + " (" + str(Lebar bidang) + ")"

Berikut adalah contoh yang mencetak output sebagai JSON Array:

import sys try: from osgeo import ogr, gdal kecuali: sys.exit('[ ERROR ]: can find GDAL/OGR modules') def printMetadata(daShapefile): dataSource = ogr.Open(daShapefile) daLayer = dataSource.GetLayer(0 ) layerDefinition = daLayer.GetLayerDefn() c = layerDefinition.GetFieldCount() cetak "[" untuk i dalam rentang(c): fieldName = layerDefinition.GetFieldDefn(i).GetName() fieldTypeCode = layerDefinition.GetFieldDefn(i).GetType( ) fieldType = layerDefinition.GetFieldDefn(i).GetFieldTypeName(fieldTypeCode) fieldWidth = layerDefinition.GetFieldDefn(i).GetWidth() GetPrecision = layerDefinition.GetFieldDefn(i).GetPrecision() if((c - 1) != i): scape = ',' else: scape = "" print("{"name":"%s","type":"%s","length":%s, "precision":%s}%s" % (fieldName,fieldType,str(fieldWidth),str(GetPrecision),scape)) print "]" if len( sys.argv ) < 2: sys.exit(' [ ERROR ]: Anda harus mendefinisikan file ') else: file_path_name = sys.argv[1] printMetadata(sys.argv[1])

Jika Anda ingin tetap berada di baris perintah di sini adalah contoh menggunakan pembungkus OGR fiona dan pengurai JSON jq.

>info fio BRA_001.shp | jq '.["schema"]["properties"]' > { "Name": "str:0" "description": "str:0" "timestamp": "str:0" "begin": "str: 0" "end": "str:0" "altitudeMode": "str:0" "tessellate": "int:0" "extrude": "int:0" "visibility": "int:0" "drawOrder" : "str:0" "ikon": "str:0" }

infomengembalikan JSON dariogrinfokeluaran. Ini lebih mudah dan lebih dapat diandalkan untuk diurai daripada output teks murni. DenganjqAnda cukup memilih informasi yang ingin Anda lihat - properti dalam kasus Anda.


Tonton videonya: Penyiapan Data Jaringan Jalan Untuk Network Analisis QGIS dan ArcGIS (Oktober 2021).