Страницы

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

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

среда, 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!)
"""


Python в ArcGIS. Классификация с помощью словаря. 19

    Когда в скрипте необходимо создать переменную в зависимости от значения другой переменной обычно используют конструкции if / elif / else. На информатике подобное называют множественным ветвлением. Например:

"""
population = 437000
x = population
if  x > 5000000:
    city_id = 1
elif  x < 5000000 and x >= 3000000:
    city_id = 2
elif  x < 5000000 and x >= 3000000:
    city_id = 2
elif  x < 3000000 and x >= 1000000:
    city_id = 3
elif  x < 1000000 and x >= 500000:
    city_id = 4
elif  x < 500000 and x >= 250000:
    city_id = 5
elif  x < 250000 and x >= 100000:
    city_id = 6
elif  x < 100000 and x >= 10000:
    city_id = 7
elif  x < 10000:
    city_id = 8
else:
    print 'error'

"""
    В случае когда входное значение может принадлежать всей шкале, без специальных исключений, удобно использовать словарь, в котором ключи будут вычисляться. Конструкция выглядит наглядней, её легче читать и править:

"""
population = 437000
x = population
city_id = {
    x > 5000000: 1,
    x < 5000000 and x >= 3000000: 2,
    x < 3000000 and x >= 1000000: 3,
    x < 1000000 and x >= 500000: 4,
    x < 500000 and x >= 250000: 5,
    x < 250000 and x >= 100000: 6,
    x < 100000 and x >= 10000: 7,
    x < 10000: 8
}[True]
"""

четверг, 18 августа 2016 г.

Python в ArcGIS. Функции и передача параметров в них. 18

    Функция с позиционными параметрами:

"""
def func_1(a, b):
    print a, b

func_1(10, 20)
"""



    Функция с произвольным количеством аргументов:

"""
def func_2(*args):
    print type(args)
    print args

func_2(10, 20, 30, 40)
func_2([10, 20, 30, 40])
func_2(*[10, 20, 30, 40])
"""


    Функция с именованными аргументами:

"""
def func_3(a=10, b=20):
    print a, b

func_3()
func_3(100, 200)
func_3(100)
func_3(a=100, b=200)
func_3(b=200)
"""


    Функция с произвольным количеством именованных аргументов:

"""
def func_4(**kwargs):
    print kwargs

func_4()
func_4(b=1, d=2)
e = {'a1': 1, 'a2': 2}
func_4(**e)
"""


   Теперь глянем на пример всего вместе:

"""
def func_5(a, b, *args, **kwargs):
    print a, b, args, kwargs

func_5(1, 2)
func_5(1, 2, 3, 4)
func_5(1, 2, 3, 4, e=5, f=6, g=7)
"""


    В arcpy повсеместно используются функции с позиционными и именованными аргументами, также еще называемые обязательные и необязательные параметры соответственно. Необходимо учитывать данную особенность, знать какие значения принимают параметры по умолчанию.

"""
# AddField_management (in_table, field_name, field_type, {field_precision}, {field_scale}, {field_length}, {field_alias}, {field_is_nullable}, {field_is_required}, {field_domain})
# Инструмент имеет 3 обязательных параметра и 7 необязательных 
# про особенности параметров см. на официальном сайте ArcGIS

arcpy.AddField_management('table_1', 'name_1', 'TEXT')
arcpy.AddField_management('table_1', 'name_1', 'TEXT', '', '', '', '', '', '', '')
t = ('table_1', 'name_1', 'TEXT')
arcpy.AddField_management(*t)

arcpy.AddField_management('table_1', 'name_2', 'TEXT', field_length='255')
arcpy.AddField_management(field_name='name_2', field_length='255', field_type='TEXT', in_table='table_1')
arcpy.AddField_management('table_1', 'name_2', 'TEXT', '', '', '255', '', '', '', '')
w = ('table_1', 'name_2', 'TEXT')
arcpy.AddField_management(*w+('', '', '255'))

"""