Как получить широту / долготу в секундах в градусах (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, это работает. но для других это не так. Я подозреваю, что проблема заключается в целочисленном преобразовании, которое округляет десятичные числа, а не усекает их.

Есть ли другой вариант? Спасибо.

Obsidianz
источник
Я могу предложить обходной путь. Не оптимально, но если вы застряли прямо сейчас, вы можете выполнить свою работу. Щелкните правой кнопкой мыши и сохраните как 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, #) ||'\'
Simbamangu
источник
Просто из любопытства, как будет выглядеть формула для градусов, минут?
булава
Добавил пример; это работает в 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расчетов со вторым выражением, чтобы убедиться, что округления не будет.

lynxlynxlynx
источник
2
У него не было функции strpos, но она есть сейчас;) github.com/qgis/Quantum-GIS/commit/…
Натан W
так много пустого шума.
lynxlynxlynx
Да, не обращайте внимания на тот первый бит, который был немного очищен, не связанный с новой функцией.
Натан W
Ужасно это ... постараюсь решить это.
Обсидианц