2013-07-26 3 views
0

Этот код предназначен для использования с данными полигона, к которым прилагаются счетчики растровых ячеек. Например, если растр является растительным покровом, для каждого типа растительного покрова и столбца соответствующей ячейки в каждом полигоне будет указан столбец. Этот результат исходит из среды геопространственного моделирования, поскольку Tabulate Raster продолжает сбой на больших шейп-файлах, которые я использую. В конечном счете, я хочу, чтобы значение области, а не количество клеток, которое будет достигнуть ниже.Python for-loop with if-statements

Таким образом, код будет проходить через атрибуты shapefile, вытаскивать исходные поля счетчика, а затем создавать новые поля на основе пользовательского ввода (цикл, хотя AddField с использованием имени пользователя + растровые значения для получения новых имен полей), а затем цикл через значения исходного поля и вычислить заданное пользователем значение области для новых полей. По сути, я пытаюсь автоматизировать модель «Добавить поле», «Рассчитать поле», которую я обычно выполняю в Process Builder.

У меня возникли проблемы с выяснением правильной логики расчета новых полей. Поскольку он написан теперь, он получает исходное поле с циклом for, но в конечном итоге используются только последние исходные значения поля, и заполняется только последнее новое поле. Мне нужен цикл, чтобы занять первое исходное поле и положить его в этом соответствующий новое поле, таким образом, что:

Если origFields = («NLCDV1», «NLCDV2» ...) и addedFields = («KM2_LC1», 'KM2_LC2' ...) Затем вычисление addField будет иметь соответствующее значение: 'KM2_LC1' = convert (где convert =! NLCDV1! * Cell) 'KM2_LC2' = convert (convert =! NLCDV2! * Cell) и т. д. для всех значений, которые могут существовать.

#User inputs the desired final units, loop through to find the desired units and calculates the new fields. 
unit = arcpy.GetParameterAsText(7) #Must be: SqMeter, SqKm, Acres, Hectares, SqMi, or SqFt. 

#User must know original units of raster, must be in Meters or Foot_US!!! 
for field in origFields: 

    if rastunit == "Meter": 
    #To make square meters final area unit. 
    if unit == "SqMeter": 
     arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3") 

    #To convert square meters into Square Kilometers. 
    elif unit == "SqKm": 
     arcpy.CalculateField_management(inputPoly, addField, convertsqmsqkm, "PYTHON_9.3") 

    #To convert square meters into Acres. 
    elif unit == "Acres": 
     arcpy.CalculateField_management(inputPoly, addField, convertsqmac, "PYTHON_9.3") 

    #To convert square meters into Hectares. 
    elif unit == "Hectares": 
     arcpy.CalculateField_management(inputPoly, addField, convertsqmhec, "PYTHON_9.3") 

    #To convert square meters into Square Miles. 
    elif unit == "SqMi": 
     arcpy.CalculateField_management(inputPoly, addField, convertsqmsqmi, "PYTHON_9.3") 

    #To convert square meters into Square Feet. 
    elif unit == "SqFt": 
     arcpy.CalculateField_management(inputPoly, addField, convertsqmsqft, "PYTHON_9.3") 
    else: 
     print arcpy.AddWarning("Ineligible unit provided.") 


    elif rastunit == "Foot_US": 
    #To make square feet final area unit. 
    if unit == "SqFt": 
     arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3") 

    else: 
    print "This raster has the following units:" +rastunit+ ". If not in Foot_US or Meters, please reproject the raster." 

Мне просто нужно выяснить, как получить соответствующее исходное поле в соответствии с новым добавленным полем. Я думал использовать что-то вроде zip (origField, addedField, calcs). Когда я сделал это, он дал мне следующий вывод:

(u'NLCDV1', 'KM2_LC1', '!NLCDV1! * 900.0') 
(u'NLCDV2', 'KM2_LC2', '!NLCDV2! * 900.0') 
(u'NLCDV3', 'KM2_LC3', '!NLCDV3! * 900.0') 
(u'NLCDV4', 'KM2_LC4', '!NLCDV4! * 900.0') 
(u'NLCDV5', 'KM2_LC5', '!NLCDV5! * 900.0') 
(u'NLCDV7', 'KM2_LC7', '!NLCDV7! * 900.0') 
(u'NLCDV8', 'KM2_LC8', '!NLCDV8! * 900.0') 
(u'NLCDV9', 'KM2_LC9', '!NLCDV9! * 900.0') 

Эти линии именно то, что мне нужно, но я не уверен, если я могу использовать такой вывод для заполнения полей, и даже если они могут быть использованы , Я новичок в python и очень новичок в zip, поэтому я не знаю, как их использовать.

Любая помощь с логикой будет принята с благодарностью, и любые предложения по очистке/повторному заказу приветствуются. Как я уже сказал, я очень начинаю, когда все это сказано. Когда у меня будет логика, я буду в порядке! Спасибо, что посмотрели, и извините, если мой код слишком сложный (не удивился бы, если это так).

+0

Пожалуйста упростить код и вопрос. Кроме того, отступы вашего кода выглядят беспорядочными. – martineau

+0

Я удалил большую часть кода и просто оставил цикл for. Я застрял. Надеюсь, это приятно. Отступы как работает отлично, когда я отлаживал его в PythonWin и весь мой скрипт запускался, чтобы уточнить. Он считывает растровые единицы, выберет правильную инструкцию if и затем выберет оператор if, который соответствует вводу пользователем элементов. – user2547367

ответ

1

Я (все еще) не уверен, я понимаю, что вы просите, но, возможно, это поможет:

origFields = (u'NLCDV1', u'NLCDV2', u'NLCDV3') 
addedFields = ('KM2_LC1', 'KM2_LC2', 'KM2_LC3') 
calcs = ('!NLCDV1! * 900.0', '!NLCDV2! * 900.0', '!NLCDV3! * 900.0') 

for orig, added, calc in zip(origFields, addedFields, calcs): 
    print '{!r}, {!r}, {!r}'.format(orig, added, calc) 

Выход:

u'NLCDV1', 'KM2_LC1', '!NLCDV1! * 900.0' 
u'NLCDV2', 'KM2_LC2', '!NLCDV2! * 900.0' 
u'NLCDV3', 'KM2_LC3', '!NLCDV3! * 900.0' 
+0

Большое вам спасибо! Работал как шарм. В следующий раз, когда у меня возникнет вопрос, я постараюсь сделать его более ясным. По-прежнему выяснять, как использовать жаргон Python в регулярном разговоре, кроме того, что все еще изучает логику. – user2547367