Як отримати широту / довготу в градусі секунди (DMS) за допомогою калькулятора QGIS?


9

Я придумав такий вираз, щоб перетворити 5.1234 на 5 ° 7`24.24 "

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

Ось проблема: для деяких моментів, таких як 5.1234, він працює. але для інших це не так. Я підозрюю, що проблема полягає в цілому перетворенні, яке округляє десяткові цифри, а не обрізання.

Чи є якийсь інший варіант? Дякую.


Я можу запропонувати рішення. Не оптимально, але якщо ви застрягли прямо зараз, ви можете приступити до своєї роботи. Клацніть правою кнопкою миші та збережіть як CSV. Відкрийте CSV в Excel або Google Docs, введіть свою формулу (яка повинна бути чистішою та простішою). Видаліть усі поля, крім унікального ідентифікатора та перетворених рядків DMS. Збережи це. З'єднайте таблицю з існуючим шаром і ви налаштовані.
spatialthoughts

1
Будьте обережні з негативними введеннями.
whuber

Просто щоб додати відповідь spatialthought в: округлення вниз до найближчої ступеня буде працювати в Excel з допомогою функції () на підлозі.
Міха

Відповіді:


3

Мені подобається вираз, який ви зібрали - мабуть, немає рішення у QGIS 1.8, але у QGIS 1.9-dev є floor()функція округлення, яка округляється вниз . Для 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) || '"'

Зверніть увагу на втечений апостроф ( \').

Для D ° M.MMM ':

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

Щоб обмежити кількість відображених десяткових хвилин, замініть номер у виразі нижче числом цифр:

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

Лише з цікавості, як виглядала б формула для градусів, хвилин?
булава

Додано приклад; це працює в QGIS 2.6 (і, мабуть, все, щонайменше, 2.0 і вище), але зараз можуть бути більш елегантні функції форматування.
Сімбамангу

1
Всього одна проблема: Ваша формула працює лише на позитивні значення Істінга та Нортінга. Негативні - це занадто мало. І мені цікаво, як можна розрізнити 0,5 ° E та 0,5 ° W. підлога (+/- 0,5) завжди буде 0, а не -0.
AndreJ

Aaargh. Підводні камені недостатнього тестування ... і ось я працюю і в південній (негативній) півкулі. Оновлення незабаром.
Сімбамангу

1

Оператор модуля може використовуватися для обрізання, але отриманий вираз був би дуже потворним. Краще використовувати підстановку рядків, але, на жаль, QGIS не піддає жодних strpos або подібних функцій. Використовуйте regexp_replace($x, '\\..*', '')для отримання цілої частини та regexp_replace($x, '^[0-9]*\\.', '')отримання десяткової частини. Використовуйте torealзамість tointобчислень з другим виразом, щоб переконатися, що не буде округлення.


2
Не було функції strpos, але вона є зараз;) github.com/qgis/Quantum-GIS/commit/…
Nathan W

tsk tsk tsk, стільки шумових пробілів.
lynxlynxlynx

Так, ігноруйте, що перший шматочок був лише трохи очищення, не пов'язаного з новою функцією.
Nathan W

Потворно це ... спробуємо це виправити.
Обсідіанц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.