Konversi dari DMS ke DD menggunakan Python di Field Calculator?

12

Saya perlu mengkonversi lat / long yang dinyatakan sebagai derajat, menit, dan detik dalam data menjadi derajat desimal. Misalnya, dalam data, mereka terdaftar sebagai N335042.06 di kolom Latitude, dan W86031.04 di kolom Longitude. Saya telah melakukan masalah ini sebelumnya di mana saya membuat skrip yang mengubah DMS ke DD, dan sebaliknya, jadi saya kira saya bisa menggunakan bit dari itu. Tetapi masalah yang saya alami adalah bagaimana mengabaikan (karena tidak ada kata yang lebih baik) 'N' dan 'W' dalam data? Bisakah saya melewati mereka? Dan DMS terdaftar bersama-sama tanpa simbol atau spasi.

Dapatkah saya menggunakan len(), range(), split()untuk menentukan apa bagian untuk membaca dari nilai? Misalnya, dapat melakukan hal berikut?

N335042.06 di mana, 33 = derajat 50 = menit 42.06 = detik ...?

Saya datang di ini artikel ESRI, tapi itu di VB. Mungkin akan menggunakannya sebagai referensi tetapi beberapa terminologi / sintaks berbeda dari Python.

Kode terakhir berhasil!

# Pre-logic
def latDD(x):
  D = int(x[1:3])
  M = int(x[3:5])
  S = float(x[5:])
  DD = D + float(M)/60 + float(S)/3600
  return DD

# Expression
latDD(!Latitude!)
kaoscify
sumber
4
7 bulan kemudian saya harus mencari cara untuk melakukan ini lagi dan berakhir di sini, terima kasih telah memposting kode Anda! :)
blah238

Jawaban:

8
  • Lihatlah bagian mengiris dalam tutorial Python . Anda dapat mengambil serangkaian karakter dari string menggunakan sintaks slicing, mis D = int(x[1:2]).

    Selama beberapa detik, cobalah S = float(x[5:]). Ini akan mengambil semua karakter mulai dari indeks 5 hingga akhir string, jika Anda memiliki nilai panjang variabel untuk detik.

  • The !FieldName!sintaks hanya berlaku dalam kotak ekspresi. Anda harus mendefinisikan fungsi di bagian "pra-logika" yang mengambil nilai dari bidang yang Anda inginkan dan mengembalikan nilai yang diinginkan. Kemudian, di kotak ekspresi, panggil fungsi dan berikan nilai bidang menggunakan !FieldName!sintaks. Lihat Menghitung contoh Field dalam bantuan.
blah238
sumber
Berikut ini adalah apa yang saya miliki sebagai kode saya di Kalkulator Bidang, tetapi ini menunjukkan bahwa baris pertama memiliki kesalahan. Ada ide? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600Dan di blok kode yang saya miliki!Latitude! = DD
kaoscify
Jawaban diperbarui dengan info lebih lanjut, coba dan beri tahu kami jika Anda masih mengalami masalah.
blah238
Terima kasih! Cara ke sana, tapi saya mengalami kesalahan baru. Saya telah mengedit posting pertama saya dengan kode baru. Pikiran? Maaf, saya baru mengenal Python, tapi saya sangat menghargai bantuan Anda!
kaoscify
Coba return DDalih-alih return latDD.
blah238
1
Saya dihapus print DDdan diubah return latDDsesuai return DDkeinginan Anda, dan itu berhasil! Terima kasih!
kaoscify
-1

Hanya dengan menggunakan Kalkulator Bidang tanpa logika pra, saya dapat membuat ini berfungsi untuk saya. String yang saya miliki adalah format yang sedikit berbeda dengan beberapa spasi.

Nilai LAT seperti "dd mm ss.ss" dan saya menggunakan ini dalam kalkulator.

float (! LAT! [0: 2]) + float (! LAT! [3: 5]) / 60+ float (! LAT! [6:]) / 3600

nilai panjang seperti "-dd mm ss.ss" dan ini lama

float (! LONG_! [0: 3]) + float (! LONG_! [4: 6]) / 60+ float (! LONG_! [7:]) / 3600

haul_n_asphalt
sumber
2
Sebenarnya, nilai lama Anda salah karena Anda memiliki kemungkinan derajat negatif dan menit dan detik positif. Lebih baik gunakan ekspresi reguler import redalam pra-logika
Mike T