Страницы

Добро пожаловать

< Выберите раздел для просмотра

четверг, 1 сентября 2016 г.

Python в ArcGIS 26. Динамичные параметры у инструментов Python Toolbox

    Чтобы создать входные параметра инструмента-скрипта таким образом, чтобы при вводе одного из них формировался список вариантов для другого (например выбрав в параметр "входной набор данных" некоторый feature class, при попытке заполнить следующий параметр "поле", скрипт сразу предлагал только названия полей из выбранного feature class).

    Рассмотрим простой пример. Приведу пример скрипта, которому на вход предлагается 2 объекта (океаны или материки) и в зависимости от выбора объекта предлагается выбрать их количество. Реализуется добавлением вариантов в функцию updateParameters класса Script1 (по названию скрипта). Строкой "parameters[0].filter.list = ["continents", "oceans"]" назначается список вариантов для первого параметра (нулевой по порядку в python), в следующей строке в зависимости от значения первого (нулевого) параметра выбирается список для второго (первого) - "parameters[1].filter.list = [[5, 6, 7], [3, 4, 5]][parameters[0].valueAsText == "oceans"]". Конструкция усложнена, чтобы быть написанной в короткой форме, равносильная общепринятая запись приводится в комментированном виде.







 

Python в ArcGIS 25. Запуск скриптов через Планировщик задач Windows.

    Чтобы запускать скрипты в определённый момент времени без участия пользователя, например в 03:29 каждый день, используется Планировщик задач Windows. 
    Подготовив скрипт, для него необходимо создать .bat файл (сохранить текстовый файл с необходимым расширением). Содержание которого должно включать, через пробел:
- путь к интерпретатору Python (python.exe);
- путь к исполняемому файлу (в данном случае python-скрипт);
- параметры для скрипта.

В качестве примера используем скрипт следующего содержания:
"""
from sys import argv

parameter_1 = argv[1]
parameter_2 = argv[2]

print "Number of %s is %s" % (parameter_1, parameter_2)
"""

    Чтобы запускать подобный скрипт в планировщике необходим bat-файл, например такого содержания (более подробно об написании пакетных файлов для windows см. в сети):

"""
C:\Python27\ArcGIS10.2\python.exe I:\Eugene_Projects\_SCRIPTS_\arcgis_script.py oceans 5
pause
"""
    Наличие команды "pause" не позволит закрыться окну командной строки после выполнения скрипта, и можно будет просмотреть сообщения о ходе выполнения и результатах.



среда, 31 августа 2016 г.

Python в ArcGIS. Комментирование и документирование строк. 24

     Важная часть написание кода это создание комментариев и строк документации.
    Создание комментариев осуществляется с помощью символа #, весь текст на строке после данного символа игнорируется интерпретатором: 

"""
# Calculate average mean
list_1 = [10, 20, 30]
print sum(list_1)*len(list_1)**-1
"""

    Создание строк документации сильно выручает, когда возвращаешься к давно созданному, когда передаёшь скрипт коллеге, когда просят создать описание для программ и др. Документирование выглядит следующим образом:

"""
# -*- coding:utf-8 -*-
def none_list(n):
    """
    n - any int number, n have to be > 0
    Возвращает список длиной n, в котором все элементам присвоено None.
>>> none_list(3)
[None, None, None]
>>> [none_list(n) for n in range(4)]
[[], [None], [None, None], [None, None, None]]
    >>> none_list(-1)
    Traceback (most recent call last):
      ...
    ValueError: n must be >= 0
    >>> none_list(5.3)
    Traceback (most recent call last):
      ...
    ValueError: n must be exact integer
"""
    if not n >= 0:
        raise ValueError("n must be >= 0")
    if isinstance(n, int):
        result = [None for i in range(n)]
    else:
        raise ValueError("n must be integer")
    return result
"""
    В интерпретаторе выглядит следующим образом:


    Обратите внимание на подсказку при использовании функции, всплывает пояснение насчёт параметров функции.
    Также в любой момент можно вызвать и ознакомиться со строками документации для некоторой функции/класс/модуля:


вторник, 30 августа 2016 г.

Python в ArcGIS. Создание простого инструмента-скрипта в ArcGIS Python Toolbox. 23

    Чтобы добавить в скрипт в Python Toolbox необходимо:

1. Нажмите правой кнопкой мыши на определённый Python Toolbox в ArcCatalog выберите "Edit".

2. Всё содержимое заменяется на следующий код:

"""
import arcpy


class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "Toolbox_2"
        self.alias = ""

        # List of tool classes associated with this toolbox
        self.tools = [Script1]

class Script1(object):
    def __init__(self):
        """Define the tool (tool name is the name of the class)."""
        self.label = "Script1"
        self.description = ""
        self.canRunInBackground = False

    def getParameterInfo(self):
        """Define parameter definitions"""
        param0 = arcpy.Parameter(
            displayName= u"Параметер 1".encode('cp1251'),
            name="parameter_1",
            datatype="String",
            parameterType="Required",
            direction="Input")
        param1 = arcpy.Parameter(
            displayName=u"Параметер 2".encode('cp1251'),
            name="parameter_2",
            datatype="String",
            parameterType="Required",
            direction="Input")
        parameters = [param0, param1]
        return parameters

    def isLicensed(self):
        """Set whether tool is licensed to execute."""
        return True

    def updateParameters(self, parameters):
        """Modify the values and properties of parameters before internal
        validation is performed.  This method is called whenever a parameter
        has been changed."""
        return

    def updateMessages(self, parameters):
        """Modify the messages created by internal validation for each tool
        parameter.  This method is called after internal validation."""
        return

    def execute(self, parameters, messages):
        """The source code of the tool."""
        arcpy.AddMessage("Number of %s is %s" % (parameters[0].valueAsText, parameters[1].valueAsText)))
        return
"""

3. В коде создаётся класс с название "Script1". В функции "getParameterInfo" настраиваются параметры, что их 2, что тип данных необходим "String", какие подписи использовать при вызове окошка инструмента и пр. Функции "isLicensed", "updateParameters", "updateMessages"  - без изменений. В "execute" помещается код, который должен непосредственно выполняться при приёме указанных параметров.





Python в ArcGIS. Создание простого инструмента-скрипта в ArcGIS ToolBox. 22

    Чтобы добавить скрипт в ArcGIS Toolbox необходимо:
1. Нажмите правой кнопкой мыши на определённый Toolbox в ArcCatalog выберите "Add script".


2. Заполните поля, выберите настройки, нажмите далее.
3. Выберите необходимый файл скрипта. В качестве примера я использую файл .py следующего содержания:

"""
from sys import argv
from arcpy import AddMessage

parameter_1 = argv[1]
parameter_2 = argv[2]

AddMessage("Number of %s is %s" % (parameter_1, parameter_2))
"""

4. Следующий шаг - установка параметров, если в вашем скрипте нет входных/выходных параметров можете завершать создание инструмента. В скрипте-примере присутствует два входных параметра*, соответственно и в инструменте должно два параметра и порядок совпадать с нумерацией в теле скрипта. Выберите входной тип данных, чаще всего используется 'String', чтобы избежать возможных несовместимостей. 


5. Завершаем создание инструмента-скрипта и запускаем его.



* В скрипте используются системные параметры, в arcpy есть свои операторы для установки входных и выходных параметров (см. GetParameter, GetParameterAsText, SetParameter, SetParameterAsText и др.).






понедельник, 29 августа 2016 г.

Python в ArcGIS. Запуск скриптов из командной строки. 21

    Создайте текстовый файл следующего содержания в некоторой директории, назовите его, допустим, "arcgis_script":

"""
from sys import argv

parameter_1 = argv[1]
parameter_2 = argv[2]

print "Number of %s is %s" % (parameter_1, parameter_2)
"""

   Сохраните его с расширением .py. Затем поднимитесь на один уровень каталога в проводнике вверх и нажмите на директории правой кнопкой мыши с зажатой клавишей Shift, в контекстном меню выберите "Открыть в командной строке".

    Далее необходимо ввести интерпретатор языка Python, который вы хотите использовать (в моём случае "C:\Python27\ArcGIS10.2\python.exe"), полный или относительный путь к файлу, который вы хотите запустить и параметры.





   

пятница, 19 августа 2016 г.

Python в ArcGIS. Приведение адресов к общему виду. 20

   Пусть поле с адресом называется 'Address'.  

    Отсечение индекса:
"""
# "625053, Тюменская область, город Тюмень, Восточный административный округ, ул. Николая Гондатти, д. 13 (МАОУ СОШ №92)"

", ".join(!Address!.split(', ')[1:])
"""

    Удаление элементов между запятыми, которые включают определённые символы, слова, например, 'административный округ':
"""
# "Тюменская область, город Тюмень, Восточный административный округ, ул. Николая Гондатти, д. 13 (МАОУ СОШ №92)"

def f(x, t=u'административный округ'):
    y =  x.split(', ')[:]
    for a in x.split(', '):
        if t in a:
            y.remove(a)
    return ", ".join(y)
f(!Address!)
"""

    Обычная замена символов, слов:

"""
!Address!.replace(u'г.', u'город')
"""

    Поиск потерянных пробелов около определённых слов:

"""
# "Тюменская область, город Тюмень, пр.Солнечный, д.24"
def f(x):
    try:
        y = x.split(u'пр.')
        if y[1][0] == u' ':
            a = x
        else:
            a = u"пр. ".join(y)
    except IndexError:
        a = x
    return a
f(!Address!)
"""

    Все буквы преобразуем в заглавные:

"""
!Address!.upper()
"""

    Удаляем лишние пробелы:

"""
# "Тюменская область, город Тюмень, ул.  Геологоразведчиков, д. 14"
u" ".join([j.replace(u' ', u'') for j in !ADDRESS!.split(u" ")])
# если пробелы не исчезают, попробуйте в аргументы оператора replace скопировать
# удаляемый символ напрямую
"""

    Локализация изменений с помощью положения в строке:

"""
# "Тюменская область, Ялутуровский район, д. Новый Кавдык, ул. Новая д.20"
# необходимо добавить запятую и пробел в обозначении дома
# но не поменять обозначение деревни
def f(x):
 a = x[:-7]
 b = x[-7:]
 c = b.replace(u' д.', u', д. ')
 return a+c

f(!Address!)
"""