Преобразование из DMS в DD с использованием Python в полевом калькуляторе?


12

Мне нужно преобразовать широту / долготу, выраженную в градусах, минутах и ​​секундах в данных, в десятичные градусы. Например, в данных они указаны как N335042.06 в столбце Широта и W86031.04 в столбце Долгота. Я делал эту проблему раньше, когда создавал скрипт, который конвертировал DMS в DD, и наоборот, так что, думаю, я мог бы использовать биты из этого. Но проблема у меня заключается в том, как игнорировать (из-за отсутствия лучшего слова) буквы «N» и «W» в данных? Могу ли я их пропустить? И DMS перечислены все вместе без каких-либо символов или пробелов.

Могу ли я использовать len(), range(), split()чтобы указать , какую часть считывать значения? Например, можете сделать следующее?

N335042,06 где 33 = градусы 50 = минуты 42,06 = секунды ...?

Я наткнулся на эту статью ESRI, но она в VB. Вероятно, будет использовать его в качестве ссылки, но некоторые термины / синтаксис отличается от Python.

Окончательный код, который работает!

# 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!)

4
Спустя 7 месяцев мне пришлось выяснить, как это сделать снова, и я оказался здесь, спасибо за размещение вашего кода! :)
blah238

Ответы:


8
  • Взгляните на раздел по нарезке в руководстве по Python . Вы можете получить диапазон символов из строки, используя синтаксис, например D = int(x[1:2]).

    На несколько секунд попробуйте S = float(x[5:]). Это будет захватывать все символы, начиная с индекса 5 до конца строки, в случае, если у вас есть значения переменной длины в течение нескольких секунд.

  • !FieldName!Синтаксис действителен только в поле выражения. Вы должны определить функцию в разделе «pre-logic», которая принимает значения полей, которые вы хотите, и возвращает желаемое значение. Затем в поле выражения вызовите функцию и передайте значения поля, используя !FieldName!синтаксис. См. Примеры вычислений полей в справке.

Ниже приведен код моего кода в Калькуляторе полей, но он указывает на ошибку в первой строке. Есть идеи? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600И в блоке кода у меня есть!Latitude! = DD
kaoscify

Обновленный ответ с дополнительной информацией, попробуйте и дайте нам знать, если у вас все еще есть проблемы.
blah238

Благодарность! Как добраться, но я столкнулся с новой ошибкой. Я отредактировал свой первый пост с новым кодом. Мысли? Извините, я новичок в Python, но я очень ценю вашу помощь!
kaoscify

Попробуй return DDвместо return latDD.
blah238

1
Я удалил print DDи изменил return latDDк , return DDкак вы предложили, и это сработало! Благодарность!
kaoscify

-1

Используя только Калькулятор поля без предварительной логики, я смог сделать эту работу для меня. У меня была немного другой формат с некоторыми пробелами.

Значение LAT как "dd mm ss.ss", и я использовал это в калькуляторе.

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

длинное значение типа "-dd mm ss.ss" и это долго

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


2
На самом деле, ваше длинное значение неверно, так как у вас есть возможные отрицательные градусы и положительные минуты и секунды. Лучше использовать регулярное выражение import reв предварительной логике
Майк Т
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.