Задание входных данных анализа

Один из важнейших этапов выполнения сетевого анализа с использованием объектов механизма расчета модуля arcpy.nax - загрузка данных. В данном разделе описывается, как правильно задавать входные данные для анализа.

Входные данные можно загрузить следующими способами:

  • С помощью метода load объекта механизма расчета можно загрузить существующие класс объектов, таблицу или слой.
  • С помощью метода insertCursor объекта механизма расчета можно вставлять данные.

Примечание:

В этом разделе в качестве примера приводится анализ области обслуживания, однако представленные здесь сведения можно применить к любому типу сетевого анализа.

Загрузка входных данных с помощью метода load

Если ваши входные данные уже находятся в классе пространственных объектов, таблице, наборе объектов или наборе записей, самый быстрый способ их использования в анализе - метод load. Метод load добавляет содержимое имеющихся входных данных в класс сетевого анализа.

В следующем фрагменте кода показано, как загрузить объекты из класса пространственных объектов с помощью метода load при выполнении анализа области обслуживания:


input_facilities = "C:/data/io.gdb/FireStations"
service_area.load(arcpy.nax.ServiceAreaInputDataType.Facilities, input_facilities)

Подробнее о методе load анализа Области обслуживания вы узнаете в разделе Методы документации объекта механизма решения ServiceArea.

Использование соответствия полей для сохранения полей ваших входных данных

У каждого класса сетевого анализа своя схема, а значения всех входных полей могут оказаться важными для вашего анализа. Однако имена полей, поддерживаемых входным классом сетевого анализа, могут не совпадать с именами полей входного набора данных. Воспользуйтесь методом fieldMappings для получения разницы. Воспользуйтесь fieldMappings для сопоставления поля входных данных с поддерживаемым свойством входного класса сетевого анализа.

Например, рассмотрим анализ зоны обслуживания, используемый для определения области, достижимой в пределах 10-минутного времени отклика от ряда пожарных депо. Хотя большая часть этих 10 минут приходится на время, потраченное на дорогу от пожарного депо до места происшествия, пожарным также требуется время и на надевание средств защиты и подготовку пожарного автомобиля, прежде чем они смогут покинуть станцию и начать движение. Входящий класс объектов Facilities механизма расчета Области обслуживания содержит поле AdditionalTime, которое можно использовать для моделирования этого необходимого для подготовки отрезка времени.

У ваших входных данных может быть поле, содержащее дополнительное время, но называющееся по-другому, например, TurnoutTime.Вы можете использовать сопоставление полей, чтобы сопоставить поле TurnoutTime с полем AdditionalTime. При запуске метода load с этими данными поле AdditionalTime входного класса Facilities будет заполнено значениями, содержащимися в вашем поле TurnoutTime.

Метод fieldMappings генерирует словарь NAClassFieldMappings, в котором ключи являются именами поддерживаемых свойств класса сетевого анализа (например, AdditionalTime), а значения - объектами NAClassFieldMap, которые можно использовать для установки желаемого поведения сопоставления. Вы можете сопоставить свое поле TurnoutTime со свойством AdditionalTime, получив свойство AdditionalTime из словаря и установив свойство mappedFieldName связанного объекта NAClassFieldMap для поля TurnoutTime.

Вы можете также задать значение по умолчанию с помощью свойства defaultValue. Это значение будет использовано для любого пункта обслуживания (в данном случае, для пожарного депо), значение в поле TurnoutTime которого будет равно null. Помните, что можно задать свойство defaultValue для любого поля, даже если вы не зададите значение mappedFieldName, чтобы оно соответствовало значению в поле ваших данных.

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


input_facilities = "C:/data/io.gdb/FireStations"

# Construct a field mapping object
field_mappings = service_area.fieldMappings(arcpy.nax.ServiceAreaInputDataType.Facilities)

# Map the TurnoutTime field from your input data to the Service Area Facilities
# class's AdditionalTime property
field_mappings["AdditionalTime"].mappedFieldName = "TurnoutTime"

# Set a default of one minute of additional time in case the TurnoutTime field
# has a null value
field_mappings["AdditionalTime"].defaultValue = 1

# Load your input data using the field mappings
service_area.load(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    input_facilities,
    field_mappings
)

Подробнее о методе fieldMappings анализа Области обслуживания вы узнаете в разделе Методы документации объекта механизма решения ServiceArea.

Изучите полный список полей, поддерживаемых каждым входным классом анализа Области обслуживания

Вставка входных данных методом insertCursor

Если ваши входные данные представляют собой нечто иное, чем класс пространственных объектов или слой, например, это файл .csv с широтами и долготами или результаты какого-то другого анализа, вы можете напрямую вставить эти записи в свой сетевой анализ, используя метод insertCursor. Этот метод отличается от arcpy.da.InsertCursor, но работает схожим образом.

При создании вами курсора нужно указать, в каких поддерживаемых входных полях нужно задать значения, в параметре field_names. После создания вами курсора вставляйте строки по одной методом insertRow объекта курсора. Для большей части входных классов сетевого анализа вам необходимо задать геометрию входных данных посредством одного из поддерживаемых токенов геометрии. К примеру, токен SHAPE@ позволяет вам передать входные данные с помощью объектов geometry. Вы можете использовать токен SHAPE@XY для передачи кортежа координат X и Y в системе координат сетевого источника данных, используемого для анализа.

В следующем фрагменте кода показано, как нужно вставлять пункты обслуживания Области обслуживания методом insertCursor. В этом примере используется токен SHAPE@XY для вставки местоположений пунктов обслуживания по их широтам и долготам.


# Define fields to use with the insertCursor
fields = ["Name", "AdditionalTime", "SHAPE@XY"]

# Construct the insertCursor for the desired input type using the fields
# specified
with service_area.insertCursor(arcpy.nax.ServiceAreaInputDataType.Facilities, fields) as cur:
    # Insert rows. The lists of values inserted match the designated fields.
    cur.insertRow(["Fire Station 1", 1, (-117.10191118199998, 32.634351493000054)])
    cur.insertRow(["Fire Station 2", 1, (-116.97970607599996, 32.56210221400005)])
    cur.insertRow(["Fire Station 3", 2.5, (-116.97141447099995, 32.654230331000065)])
    cur.insertRow(["Fire Station 4", 1.5, (-117.00762504, 32.70097640100005)])

В следующем фрагменте кода показано, как нужно вставлять пункты обслуживания Области обслуживания методом insertCursor. В этом примере в соответствии с широтами и долготами создаются точечные геометрии, которые затем вставляются с помощью токена SHAPE@.


sr_wgs84 = arcpy.SpatialReference(4326)

# Input data with latitude and longitude values specified in WGS84 coordinates
input_data = [
    ["Fire Station 1", 1, -117.10191118199998, 32.634351493000054],
    ["Fire Station 2", 1, -116.97970607599996, 32.56210221400005],
    ["Fire Station 3", 2.5, -116.97141447099995, 32.654230331000065],
    ["Fire Station 4", 1.5, -117.00762504, 32.70097640100005]
]

# Define fields to use with the insertCursor
fields = ["Name", "AdditionalTime", "SHAPE@"]

# Construct the insertCursor for the desired input type using the fields
# specified
with service_area.insertCursor(arcpy.nax.ServiceAreaInputDataType.Facilities, fields) as cur:
    for input_pt in input_data:
        # Construct a PointGeometry object for the point using the
        # correct spatial reference
        pt_geom = arcpy.PointGeometry(
            arcpy.Point(input_pt[2], input_pt[3]), sr_wgs84)

        # Insert the data using its shape
        cur.insertRow([input_pt[0], input_pt[1], pt_geom])

В следующем фрагменте кода показано, как нужно вставлять пункты обслуживания Области обслуживания методом insertCursor. В этом примере вставляются строки из файла .csv.

В коде предполагается, что данные, хранящиеся в файле .csv, содержат название пункта обслуживания, дополнительное время, долготу и широту - аналогично списку в предыдущем примере.


# Define fields to use with the insertCursor
fields = ["Name", "AdditionalTime", "SHAPE@XY"]

# Open the .csv file and construct a reader using the csv module
with open(in_csv, "r") as f:
    reader = csv.reader(f)
    # Read the headers and don't try to insert this row
    headers = next(reader)
    # Construct the insertCursor for the desired input type using the fields
    # specified
    with service_area.insertCursor(
        arcpy.nax.ServiceAreaInputDataType.Facilities,
        fields
    ) as cur:
        # Iterate through the CSV file's rows and insert them as facilities
        for row in reader:
            cur.insertRow(
                [row[0], float(row[1]), (float(row[2]), float(row[3]),)]
            )

Подробнее о методе insertCursor анализа Области обслуживания вы узнаете в разделе Методы документации объекта механизма решения ServiceArea.

Подробнее об объекте SolverInsertCursor

Изучите полный список полей, поддерживаемых каждым входным классом анализа Области обслуживания

Размещение входные объектов в сети

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

Дополнительные сведения о полях местоположения сети и способе размещения входных данных в сети

Объекты механизма расчета arcpy.nax содержат некоторые свойства, контролирующие размещение объектов для всех входных данных анализа.

Свойство searchSources определяет, какие сетевые источники можно использовать для поиска, и, кроме того, позволяет задать выражение SQL, ограничивающее поиск только объектами источника сети, соответствующими определенным характеристикам. Например, вы можете настроить анализ на размещение входных данных на улицах, но не на линиях общественного транспорта и запретить размещение входных данных на объектах улиц с определенными значениями класса дороги.

Свойствами searchTolerance и searchToleranceUnits задается максимальный допуск поиска для расположения входных объектов в сети. Если в пределах этого расстояния поиска не найдено ни одного допустимого сетевого местоположения, входной объект считается не размещенным и не может быть использован в анализе.

Подробнее об этих параметрах для анализа Области обслуживания вы узнаете в разделе Свойства документации объекта механизма расчета ServiceArea.

Управление поведением размещения отдельно для каждого входного класса

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

Используйте метод setLocateSettingsOverrides для настройки поведения размещения отдельных входных классов, переопределяя параметры анализа по умолчанию.

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


# Set default search tolerance and search sources for all analysis inputs
service_area.searchTolerance = 200
service_area.searchToleranceUnits = arcpy.nax.DistanceUnits.Feet
service_area.searchSources = [["Streets", ""], ["Streets_ND_Junctions", ""]]

# Set a search query for the input facilities only to prevent locating
# on highway ramps (designated, in this example, as ROAD_CLASS 3). This query
# will not apply to other inputs, such as barriers.
sources = [["Streets", "ROAD_CLASS <> 3"], ["Streets_ND_Junctions", ""]]
service_area.setLocateSettingsOverrides(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    search_sources=sources
)

Подробнее о методе анализа Области обслуживания вы узнаете в разделе Методы документации объекта механизма решения ServiceArea.

Использование предварительно рассчитанных полей сетевого местоположения

Хотя входные данные добавляются к анализу с использованием методов load и insertCursor, сетевые местоположения не вычисляются до тех пор, пока анализ не будет выполнен с использованием метода solve. Однако можно воспользоваться сетевыми местоположениями, задав поля сетевого местоположения в load или insertCursor. Это сэкономит время в процессе расчета и может ускорить общий анализ, если вы собираетесь использовать одни и те же входные местоположения несколько раз.

Более подробно о предварительно вычислении сетевых местополложений.

При использовании предварительно рассчитанных полей сетевого положения в некоторых случаях может потребоваться задать для свойства allowAutoRelocate значение False. Если для этого свойства задано значение True, входные данные, расположенные в частях сети, которые ограничены выбранным режимом передвижения или заблокированы барьерами, автоматически перемещаются в процессе решения, чтобы обеспечить доступность всех местоположений. Во многих случаях такое поведение вам подойдет, но если вы хотите использовать предварительно рассчитанные поля сетевого местоположения точно так, как они отображаются во входных данных, вы можете задать для свойства allowAutoRelocate значение False.

Использование предварительно рассчитанных полей сетевого местоположения с помощью метода load

Чтобы использовать при загрузке данных поля сетевого местоположения, сначала нужно создать методом fieldMappings соответствия полей. Задайте для параметра use_location_fields метода fieldMappings значение True. Это позволит включить поля сетевого местоположения в словарь NAClassFieldMappings, возвращаемый методом.

Если у предварительно рассчитанных полей сетевого местоположения входных данных имена стандартные, вам не нужно сопоставлять свои поля. Они будут автоматически сопоставлены с полями местоположения входного класса при создании словаря NAClassFieldMappings, и они будут использоваться при выполнении анализа, если вы используете такие сопоставления полей при вызове метода load. Если у полей вашего местоположения нестандартные имена, вы можете сопоставить их, как и любые другие входные поля.

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


# Network locations have been precalculated for these inputs
# using the Calculate Locations tool. The feature class
# includes the network location fields:
# SourceID, SourceOID, PosAlong, SideOfEdge
input_facilities = "C:/data/io.gdb/FireStations"

# Construct a field mapping object with network location fields
field_mappings = service_area.fieldMappings(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    use_location_fields=True
)

# Load your input data using the field mappings
# Location fields are included automatically because
# of the field mappings.
service_area.load(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    input_facilities,
    field_mappings
)

Использование предварительно рассчитанных полей сетевого местоположения с помощью метода insertCursor

Для использования предварительно вычисленных полей сетевого местоположения при вставке данных методом insertCursor включите эти поля в параметр field_names при вызове метода insertCursor. Можно задать значения в этих полях, как и в любом другом поле, при вставке строк.

Подсказка:

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

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


# Define fields to use with the insertCursor
fields = ["Name", "SHAPE@XY", "SourceID", "SourceOID", "PosAlong", "SideOfEdge"]

# Define input data with network location fields
# The latitude and longitude are not strictly necessary because the inputs
# have already been located on the network.
input_data = [
    ["Fire Station 1", (-117.10191118199998, 32.634351493000054), 1, 9533, 0.5, 2],
    ["Fire Station 2", (-116.97970607599996, 32.56210221400005), 1, 7629, 0.33, 1],
    ["Fire Station 3", (-116.97141447099995, 32.654230331000065), 1, 2309, 1.0, 1],
    ["Fire Station 4", (-117.00762504, 32.70097640100005), 1, 9016, 0.62, 1]
]

# Insert the facilities
with service_area.insertCursor(arcpy.nax.ServiceAreaInputDataType.Facilities, fields) as cur:
    for input_pt in input_data:
        cur.insertRow(input_pt)

Включение пользовательских полей во входных данных анализа

В некоторых случаях вам может понадобиться включить в сетевой анализ дополнительные поля, которые не соответствуют ни одному из поддерживаемых свойств сетевого анализа. Например, если вы моделируете зону покрытия пожарными депо, вы можете включить число грузовиков, базирующихся на каждой из пожарных станций. Эта информация не будет использоваться непосредственно для сетевого анализа, но позже она будет использована в отчетах. Можно включить такие дополнительные поля во входные данные сетевого анализа, и эти поля обычно передаются в выходные данные анализа. Например, дополнительные поля входного класса Facilities Области обслуживания будут также включены в выходной класс ServiceAreaResult объекта Facilities.

Подсказка:

Воспользуйтесь методом fieldNames для подтверждения того, что пользовательские поля были успешно добавлены во входной класс анализа. Подробнее о методе fieldNames анализа Области обслуживания вы узнаете в разделе Методы документации объекта механизма решения ServiceArea.

Включение пользовательских полей при использовании метода load

При выполнении загрузки класса пространственных объектов или слоя в свой анализ методом load воспользуйтесь методом fieldMappings параметра list_candidate_fields, чтобы включить не используемые по умолчанию поля ваших входных данных. Этот параметр поддерживает список объектов поля, получаемых из загружаемого класса объектов или слоя. Все содержащиеся в этом списке поля будут включены в словарь сопоставления полей, и когда вы воспользуетесь этими сопоставлениями полей методом load, во входные данные анализа будут включены все поля.

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


input_facilities = "C:/data/io.gdb/FireStations"

# Construct a field mapping object
# Use the list_candidate_fields parameter to include non-default custom fields
# from the input
field_mappings = service_area.fieldMappings(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    list_candidate_fields=arcpy.ListFields(input_facilities)
)

# Load your input data using the field mappings
service_area.load(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    input_facilities,
    field_mappings
)

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


input_facilities = "C:/data/io.gdb/FireStations"
extra_fields = [f for f in arcpy.ListFields(input_facilities) if f.name == "NumTrucks"]

# Construct a field mapping object
# Use the list_candidate_fields parameter to include non-default custom fields 
# from the input
field_mappings = service_area.fieldMappings(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    list_candidate_fields=extra_fields
)

# Load your input data using the field mappings
service_area.load(
    arcpy.nax.ServiceAreaInputDataType.Facilities,
    input_facilities,
    field_mappings
)

Включение пользовательских полей при использовании метода insertCursor

Если вы вставляете данные методом insertCursor непосредственно во входные данные анализа, вы должны сначала добавить во входной класс желаемые поля, не используемые по умолчанию, с помощью метода addFields. После добавления нужных полей вы можете включить их в параметр field_names при вызове метода insertCursor и вставить значения как обычно.

Подробнее о методе addFields анализа Области обслуживания вы узнаете в разделе Методы документации объекта механизма решения ServiceArea.

В следующем фрагменте кода показано, как добавить поле, отличное от поля по умолчанию, с помощью метода addFields, и вставить строки со значениями для этого поля посредством метода insertCursor.


# Add a custom field called NumTrucks to the Service Area Facilities input class
field_definitions = [["NumTrucks", "SHORT"]]
service_area.addFields(arcpy.nax.ServiceAreaInputDataType.Facilities, field_definitions)

# Define fields to use with the insertCursor
fields = ["Name", "NumTrucks", "AdditionalTime", "SHAPE@XY"]
# Construct the insertCursor for the desired input type using the fields specified
with service_area.insertCursor(arcpy.nax.ServiceAreaInputDataType.Facilities, fields) as cur:
    # Insert rows. The lists of values inserted match the designated fields.
    cur.insertRow(["Fire Station 1", 1, 1, (-117.10191118199998, 32.634351493000054)])
    cur.insertRow(["Fire Station 2", 2, 1, (-116.97970607599996, 32.56210221400005)])
    cur.insertRow(["Fire Station 3", 4, 2.5, (-116.97141447099995, 32.654230331000065)])
    cur.insertRow(["Fire Station 4", 2, 1.5, (-117.00762504, 32.70097640100005)])