Bagaimana cara mendapatkan lintang / bujur dalam Degree Minute Second (DMS) menggunakan kalkulator bidang QGIS?

9

Saya datang dengan ungkapan berikut untuk mengonversi 5.1234 ke 5 ° 7`24.24 "

toint ($ x) || '°' || toint ((($ x) - toint ($ x)) * 60) || '`' || substr ((tostring (((($ x) - toint ($ x)) * 60) - toint ((($ x) - toint ($ x)) * 60)) * 60), * 60), 1,5) || '"

Inilah masalahnya: untuk beberapa poin seperti 5.1234, ia berfungsi. tetapi bagi orang lain, tidak. Saya menduga masalahnya adalah konversi bilangan bulat yang mengumpulkan angka desimal alih-alih memotongnya.

Apakah ada opsi lain? Terima kasih.

Obsidianz
sumber
Saya dapat menyarankan solusi. Tidak optimal, tetapi jika Anda macet sekarang, Anda bisa menyelesaikan pekerjaan Anda. Klik kanan dan Simpan Sebagai CSV. Buka CSV di Excel atau Google Documents, masukkan formula Anda (yang seharusnya lebih bersih dan mudah). Hapus semua bidang kecuali pengidentifikasi unik dan string DMS yang dikonversi. Simpan itu. Apakah tabel bergabung dengan layer yang ada dan Anda sudah siap.
spatialthoughts
1
Hati-hati dengan input negatif.
whuber
Hanya untuk menambah jawaban spatialthought ini: pembulatan ke bawah ke derajat terdekat akan bekerja di Excel menggunakan FLOOR () fungsi.
Micha

Jawaban:

3

Saya suka ungkapan yang Anda kumpulkan - mungkin tidak ada solusi di QGIS 1.8, tetapi di QGIS 1.9-dev ada floor()fungsi pembulatan yang membulatkan ke bawah . Untuk D ° M'S ':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || floor(((abs($x)) - floor (abs($x))) * 60) ||'\'' || substr( (tostring((((abs($x)) - floor (abs($x))) * 60) - floor(((abs($x)) - floor (abs($x))) * 60)) * 60),1,5) || '"'

Perhatikan apostrof lolos ( \').

Untuk D ° M.MMM ':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || ((abs($x) - floor(abs($x))) * 60) ||'\''

Untuk membatasi jumlah menit desimal yang ditampilkan, gantilah # dalam ekspresi di bawah ini dengan jumlah digit:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'
Simbamangu
sumber
Hanya karena penasaran, seperti apa rumus untuk Derajat, Menit?
Gada
Menambahkan contoh; ini berfungsi di QGIS 2.6 (dan mungkin apa saja 2.0 dan lebih tinggi) tetapi mungkin ada fungsi pemformatan yang lebih elegan yang tersedia sekarang.
Simbamangu
1
Hanya satu perangkap: Formula Anda hanya berfungsi untuk nilai positif dari Timur dan Utara. Negatif terlalu kecil. Dan saya ingin tahu bagaimana 0,5 ° E dan 0,5 ° W dapat dibedakan. lantai (+/- 0,5) akan selalu menjadi 0, bukan -0.
AndreJ
Aaargh. Jebakan dari pengujian yang tidak mencukupi ... dan inilah saya yang bekerja di belahan selatan (negatif) juga. Memperbarui segera.
Simbamangu
1

Operator modulo dapat digunakan untuk melakukan pemotongan, tetapi ekspresi yang dihasilkan akan sangat jelek. Lebih cantik menggunakan substitusi string, tetapi sayangnya QGIS tidak memaparkan fungsi strpos atau fungsi serupa. Gunakan regexp_replace($x, '\\..*', '')untuk mendapatkan seluruh bagian dan regexp_replace($x, '^[0-9]*\\.', '')untuk mendapatkan bagian desimal. Gunakan torealalih-alih tointuntuk perhitungan dengan ekspresi kedua untuk memastikan tidak ada pembulatan.

lynxlynxlynx
sumber
2
Tidak memiliki fungsi tegakan
Nathan W
tsk tsk tsk, begitu banyak kebisingan spasi.
lynxlynxlynx
Ya abaikan bit pertama itu hanya sedikit pembersihan yang tidak terkait dengan fungsi baru.
Nathan W
Jelek itu ... akan berusaha menyelesaikannya.
Obsidianz