Temel Eğer / Sonra ArcGIS Alan Hesaplama Python Ayrıştırıcı?


18

Masaüstü için ArcGIS 10.2 kullanıyorum ve bu siteye bakıyorum ve henüz cevabımı bulamıyorum. VBA ve Python için çok yeni, ancak ArcGIS ile uzun yıllar. Özniteliklere Göre Seç ile bunu yavaş bir şekilde yapabileceğimi biliyorum, ama zaman alıcı.

Bir hastalık (nokta katmanı) ve ABD Sayım Yolları (çokgen katmanı) arasında mekansal bir birleşim deniyorum. Bunun için sayım verisi gerekir. Her nokta / vaka için, davanın hangi yıla bağlı olduğuna göre 2001-2012 tarih aralığına sahip YEAR adlı bir alanım var. Her yıl bir sayı sütununa ihtiyacım var. Örneğin, ilk COUNT01 çağrıyorum. YEAR'daki vaka tarihi 2001 ise, COUNT01 içinde bir tane olacaktır. Başka bir yıl (2002-2012) ise, 0 olması gerekir. COUNT02, COUNT03 ... COUNT12 sütunum olacak. "Boş" değere sahip olamaz.

İşte şimdiye kadar denedim

resim açıklamasını buraya girin

Ve işte veriler Arc'da böyle görünüyor.

resim açıklamasını buraya girin


3
Bunu Python kullanarak yapmanızı ve vbave vbscriptetiketlerini bir etiketle değiştirmek için Sorunuzu düzenlemenizi öneririz python. Henüz gitmemesine rağmen VBScript kullanımdan kaldırılma sürecindedir . Gerçek giriş ve beklenen çıktıyı gösteren bazı örnek satırların bir resmini / tablosunu içeren daha ayrıntılı bir açıklama sağladıktan sonra Python ayrıştırıcıyla yapmayı kolaylaştıracağım. YEAR bir tarih alanı mı yoksa yıllara karşılık gelen değerleri içeren bir tam sayı alanı mı?
PolyGeo

Tavsiye ve yardım için teşekkürler. Özellik tablosunun bir görüntüsünü ekledim. YEAR giriş değişkeni şu anda bir Double (SAS Tarihinden ayrıştırıldı) olarak ve Counts01 çıkış değişkeni sütunu Kısa Tamsayı olarak saklanmaktadır.
BenW

1
Vaka alanınız olarak YEAR ile Özet İstatistikleri kullanmayı düşündünüz mü ? Bu, Python veya Saha Hesaplayıcı kullanmanıza gerek kalmadan her yıl için COUNT değeri vermelidir.
PolyGeo

Tavsiyeniz için teşekkürler. Özet İstatistikleri dikkate aldım, ancak nihai hedef, 100 bin kişi başına yıllık ve 10 yıllık ortalama insidans oranlarını hesaplayabildiğim 1.249 bireysel sayım yolu başına yıllık vaka sayısı elde etmektir. Bazı nüfus sayım sistemlerinde hiçbir vaka yoktu, bazılarında bir ton vardı, ama hepsinin dahil edilmesine ihtiyacım var. Tract'ları yıllara göre özetlemek bile, hiçbir örneği olmayan bu traktların 278'ini atlamaktadır.
BenW

Yanıtlar:


38

Bu istediğini düşünüyorum .... python kullanarak aşağıdakileri yapabilirsiniz (YIL ve COUNT0X alanlarının tamsayı olduğunu varsayar)

  • Aşağıda vurgulandığı gibi Python olarak değiştirin
  • Kodu 'Mantık Öncesi' giriş kutusuna ekleyin
  • YılVal değerini hesapladığınız her alan için gerektiği gibi değiştirin (Count01 2001, Count02 2002, vb. Kullanır)

Not Kodu ayrıştırmak için girintiyi kullanan Python ile aralığın doğru olduğundan emin olun.

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

bu


3
@BenW - bu sorununuzu çözdüyse, lütfen bunu yanıt olarak işaretleyin (cevap oyu sayısının altındaki onay kutusu)
Chad Cooper

Eğer if deyiminde aksanlı harfler içeren bir dize değerini kontrol etmek istersem ne yapmam gerekir?
greyline

Alanlar metin, çift, vb. Gibi başka bir türdeyse ne yapmalı?
khaliff

@khaliff Örneğin if (int(year) == yearVal): , python koduna bir tür dönüştürme işlevi ekleyebilirsiniz , ya da diğerleri (bkz: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
gisnside

Teşekkür ederim. Ayrıca myCalc, myFunc, Reclass, vb.nin ne zaman kullanılacağını bulabileceğim bir bağlantınız var mı?
khaliff

8

Bu cevap aslında yukarıda listelenenle aynıdır, ancak Count01 alanı için kod bloğunu kullanmak zorunda kalmamanın bir yolu, ayrıştırıcıyı Python'a ve sonra da

1 if !YEAR! == 2001 else 0

Bunun okuma şekli: YEAR alanı 2001 ise, alanı 1 olarak, 2001 değilse alanı 0 olarak ayarlayın ...

Birden çok if koşulunuz varsa, 2. (ve sonraki) "if" koşullarını else ifadesinin içine yerleştirebilirsiniz, örneğin ...

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

Bunun okuma şekli: YEAR alanı 2001 ise, alanı 1 değilse, 2001 değilse, 2002 ise 2 olarak ayarlayın, sonra 0 olarak ayarlayın ...


Birden fazla koşulum varsa, bu hesaplamayı nasıl değiştirmeliyim, yani "elif" kullanıyor muyuz?
khaliff

Birden fazla koşulunuz varsa, "if" koşullarını else ifadesinin içine yerleştirebilirsiniz ... böylece böyle bir şeyle sonuçlanabilirsiniz ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller

6

VBScript kullanacaksanız, alan hesaplamanız yanlış ayarlanmıştır. Öncelikle, alanın adı olan bir değişken kullanmam, bu kafa karıştırıcı, farklı bir ad kullanın, böylece ayarladığınız şey netleşir. "Endif" dosyanız yanlıştı "end if" olmalı ve kodunuzun mantık öncesi kod bölümünde olması gerekirdi. Bunu ayarlamanın doğru yolu aşağıda gösterilmiştir. Ancak diğerlerinin söylediği gibi, VBScript'i kullanmamaya çalışın, çünkü ESRI Python'un lehine kurtulmak için bükülmüş.

Doğru Hesap Makinesi Kullanımı


Yardımınız için çok teşekkürler. Genel fikir birliği gibi görünüyor Python ile gidiş sona erdi.
BenW
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.