Этот код предназначен для использования с данными полигона, к которым прилагаются счетчики растровых ячеек. Например, если растр является растительным покровом, для каждого типа растительного покрова и столбца соответствующей ячейки в каждом полигоне будет указан столбец. Этот результат исходит из среды геопространственного моделирования, поскольку 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, поэтому я не знаю, как их использовать.
Любая помощь с логикой будет принята с благодарностью, и любые предложения по очистке/повторному заказу приветствуются. Как я уже сказал, я очень начинаю, когда все это сказано. Когда у меня будет логика, я буду в порядке! Спасибо, что посмотрели, и извините, если мой код слишком сложный (не удивился бы, если это так).
Пожалуйста упростить код и вопрос. Кроме того, отступы вашего кода выглядят беспорядочными. – martineau
Я удалил большую часть кода и просто оставил цикл for. Я застрял. Надеюсь, это приятно. Отступы как работает отлично, когда я отлаживал его в PythonWin и весь мой скрипт запускался, чтобы уточнить. Он считывает растровые единицы, выберет правильную инструкцию if и затем выберет оператор if, который соответствует вводу пользователем элементов. – user2547367