Konversi NetCDF ke Format xyz untuk Batimetri

Postingan ini tidak akan membahas panjang lebar apa itu Batimetri dan keilmuan yang melibatkan itu. Di sini hanya akan membahas tentang bagaimana cara mengonversi data Batimetri yang berformat NetCDF (nc) ke format xyz (longitude, latitude, depth) dalam bentuk teks. Untuk apa capek-capek melakukan ini? Well, beberapa software modelling perairan salah satunya adalah Delft3d memerlukan masukannya dengan format xyz. Saya membuat script untuk konversi ini alasannya karena ada beberapa teman saya yang meminta tolong untuk mengonversi data nc mereka ke format xyz ini karena dibutuhkan sebagai masukan software modelling mereka.

Script untuk konversi ini sangat sederhana karena kita hanya butuh untuk mengekstrak data dari file nc dan menyimpannya di file teks baru dengan format yang sudah di atur. Berikut script untuk melakukan pekerjaan tersebut.

#!/usr/bin/python
import numpy as np
from netCDF4 import Dataset
import csv
#setting
ncfile = 'GRIDONE_2D.nc' #edit ini dan masukkan nama file nc yang ingin dikonversi
ascii3d = 'GRIDONE_2D.xyz' #edit ini dan masukkan nama file keluaran xyz atau teks yang diinginkan
#open nc
dset = Dataset(ncfile, 'r')
lat = dset.variables['lat'][:]
lon = dset.variables['lon'][:]
kedalaman = dset.variables['elevation'][:]
with open(ascii3d, 'w') as tulis_file:
datawriter = csv.writer(tulis_file, delimiter=',')
#datawriter.writerow(['bujur', 'lintang', 'kedalaman'])
for i in xrange(len(lon)):
#biar tenang nunggunya, lebih baik perlihatkan progress
print 'progress', i
for j in xrange(len(lat)):
datawriter.writerow([lon[i], lat[j], kedalaman[j,i]])
view raw nc2txt.py hosted with ❤ by GitHub
Jika script di atas tidak kelihatan, silahkan download di sini.

Terkadang file hasil konversi menjadi terlalu besar sehingga ketika dijadikan masukan untuk software modelling menjadi gagal karena RAM yang tidak cukup. Untuk itu disarankan konversinya dibagi menjadi per part. Untuk pembagiannya saya serahkan kepada pembaca karena pembaca lebih tahu keperluannya seperti apa. Basicnya pada script di atas kita hanya perlu mengedit bagian variabel lon dan lat. Contoh kasus matriks depth pada data nc berukuran 1000 x 1000. Anggap ukuran ini terlalu besar ketika dikonversi ke format xyz dan ingin kita bagi 2 maka script awal tadi di edit saja yang ada di baris 14 atau 15 (kasus ini kita akan mengedit baris 14) menjadi.

#!/usr/bin/python
import numpy as np
from netCDF4 import Dataset
import csv
#setting
ncfile = 'GRIDONE_2D.nc' #edit ini dan masukkan nama file nc yang ingin dikonversi
ascii3d = 'GRIDONE_2D_part1.xyz' #edit ini dan masukkan nama file keluaran xyz atau teks yang diinginkan
#open nc
dset = Dataset(ncfile, 'r')
lat = dset.variables['lat'][0:500]
lon = dset.variables['lon'][:]
kedalaman = dset.variables['elevation'][:]
with open(ascii3d, 'w') as tulis_file:
datawriter = csv.writer(tulis_file, delimiter=',')
#datawriter.writerow(['bujur', 'lintang', 'kedalaman'])
for i in xrange(len(lon)):
#biar tenang nunggunya, lebih baik perlihatkan progress
print 'progress', i
for j in xrange(len(lat)):
datawriter.writerow([lon[i], lat[j], kedalaman[j,i]])
view raw gistfile1.txt hosted with ❤ by GitHub

Lalu ketika selesai, running lagi dengan mengedit scriptnya menjadi seperti berikut.

#!/usr/bin/python
import numpy as np
from netCDF4 import Dataset
import csv
#setting
ncfile = 'GRIDONE_2D.nc' #edit ini dan masukkan nama file nc yang ingin dikonversi
ascii3d = 'GRIDONE_2D_part2.xyz' #edit ini dan masukkan nama file keluaran xyz atau teks yang diinginkan
#open nc
dset = Dataset(ncfile, 'r')
lat = dset.variables['lat'][500:]
lon = dset.variables['lon'][:]
kedalaman = dset.variables['elevation'][:]
with open(ascii3d, 'w') as tulis_file:
datawriter = csv.writer(tulis_file, delimiter=',')
#datawriter.writerow(['bujur', 'lintang', 'kedalaman'])
for i in xrange(len(lon)):
#biar tenang nunggunya, lebih baik perlihatkan progress
print 'progress', i
for j in xrange(len(lat)):
datawriter.writerow([lon[i], lat[j], kedalaman[j,i]])
view raw gistfile1.txt hosted with ❤ by GitHub
Hasil dari 2x running script di atas akan menghasilkan 2 file bernama GRIDONE_2D_part1.xyz dan GRIDONE_2D_part2.xyz.

Sekian cara untuk mengonversi datanya. Dari sini tergantung dari keperluan pembaca.

referensi:
http://www.esri.com/news/arcnews/summer11articles/comprehensive-bathymetric-data-management-made-more-efficient.html, di akses pada 6 Maret 2018

Komentar