Field Calculator'da Python kullanarak DMS'den DD'ye dönüştürme?


12

Verilerde derece, dakika ve saniye olarak ifade edilen enlem / boylamayı ondalık derecelere dönüştürmem gerekiyor . Örneğin, verilerde Latitude sütununda N335042.06 ve Boylam sütununda W86031.04 olarak listelenmiştir. Daha önce DMS DD ve tersi dönüştürülmüş bir komut dosyası oluşturdu önce bu sorunu yaptım, bu yüzden ben ondan bit kullanabilirsiniz sanırım. Ama yaşadığım problem, verilerde 'N' ve 'W' 'yi (daha iyi bir kelime olmaması nedeniyle) nasıl görmezden gelmektir? Onları atlayabilir miyim? Ve DMS, herhangi bir sembol veya boşluk olmadan birlikte listelenir.

Ben kullanabilir miyim len(), range(), split()değerinden okumak için hangi kısmını belirtmek için? Örneğin, aşağıdakileri yapabilir mi?

N335042.06 burada, 33 = derece 50 = dakika 42.06 = saniye ...?

Bu ESRI makalesine rastladım , ancak VB'de. Muhtemelen referans olarak kullanacaktır, ancak bazı terminoloji / sözdizimi Python'dan farklıdır.

Nihai kod çalışıyor!

# 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 ay sonra bunu nasıl yapacağımı bulmak zorunda kaldım ve burada sona erdi, kodunuzu gönderdiğiniz için teşekkürler! :)
blah238

Yanıtlar:


8
  • Python dersinde dilimleme bölümüne bakın . Dilimleme sözdizimini kullanarak bir dizeden bir dizi karakter yakalayabilirsiniz, örn D = int(x[1:2]).

    Saniyeler için deneyin S = float(x[5:]). Bu, saniyeler için değişken uzunluk değerlerine sahip olmanız durumunda, 5. dizinden başlayarak dizenin sonuna kadar olan tüm karakterleri alır.

  • !FieldName!Sözdizimi ifadesi kutusunda geçerlidir. "Ön mantık" bölümünde, istediğiniz alanların değerlerini alan ve istenen değeri döndüren bir işlev tanımlamanız gerekir. Ardından, ifade kutusunda işlevi çağırın ve !FieldName!sözdizimini kullanarak alan değerlerini iletin. Yardımdaki Alan örneklerini hesaplama konusuna bakın .

Aşağıdaki Alan Hesap Makinesi benim kod olarak var, ama ilk satırda bir hata olduğunu gösterir. Herhangi bir fikir? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600Ve kod bloğunda var!Latitude! = DD
kaoscify

Cevabı daha fazla bilgi ile güncelleyin, deneyin ve hala sorun yaşıyorsanız bize bildirin.
blah238

Teşekkürler! Oraya varıyorum, ancak yeni bir hatayla karşılaştım. İlk yazımı yeni kodla düzenledim. Düşünceler? Üzgünüm, Python'da yeniyim ama yardımın için çok minnettarım!
kaoscify

return DDBunun yerine deneyin return latDD.
blah238

1
Ben kaldırıldı print DDve değiştirilmesi return latDDiçin return DDönerdiğiniz gibi ve işe yaradı! Teşekkürler!
kaoscify

-1

Önceden mantığı olmayan sadece Field Calculator kullanarak bu işi benim için yapabildim. Sahip olduğum dize, bazı boşluklarla biraz farklı bir formattı.

"Dd mm ss.ss" gibi LAT değeri ve bunu hesap makinesinde kullandım.

şamandıra (! LAT! [0: 2]) + şamandıra (! LAT! [3: 5]) / 60+ şamandıra (! LAT! [6:]) / 3600

"-dd mm ss.ss" gibi uzun bir değer ve bu uzun

şamandıra (! LONG_! [0: 3]) + şamandıra (! LONG_! [4: 6]) / 60+ şamandıra (! LONG_! [7:]) / 3600


2
Aslında, negatif değeriniz, pozitif dakika ve saniyeniz olduğu için uzun değeriniz yanlıştır. import reÖn mantıkta düzenli bir ifade kullansak iyi olur
Mike T
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.