Перетворення з DMS в DD за допомогою Python у Field Calculator?


12

Мені потрібно перетворити lat / long, який виражається у градусах, хвилинах і секундах у дані, у десяткові градуси. Наприклад, у даних вони вказані як N335042.06 у стовпці Latitude та W86031.04 у стовпці Longitude. Я робив цю проблему раніше, ніж створив сценарій, який перетворив 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!Синтаксис дійсний тільки в поле вираження. Ви повинні визначити функцію в розділі "до логіки", яка приймає значення потрібних полів і повертає потрібне значення. Потім у полі виразів викличте функцію та передайте значення поля за допомогою !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
кодовому

Оновлена ​​відповідь з додатковою інформацією, спробуйте її і повідомте нам, якщо у вас все ще виникають проблеми.
blah238

Дякую! Як дістатися, але я зіткнувся з новою помилкою. Я відредагував своє перше повідомлення з новим кодом. Думки? Вибачте, я новачок у Python, але я дуже вдячний за вашу допомогу!
kaoscify

Спробуйте return DDзамість цього return latDD.
blah238

1
Я видалив print DDі змінив return latDDдо , return DDяк ви запропонували, і це спрацювало! Дякую!
kaoscify

-1

Використовуючи просто Field Calculator без попередньої логіки, я зміг зробити цю роботу для мене. Рядок, який я мав, був трохи іншого формату з деякими пробілами.

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

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

довге значення типу "-dd mm ss.ss", і це для long

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.