Один из важнейших этапов выполнения сетевого анализа с использованием объектов механизма расчета модуля 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 анализа Области обслуживания вы узнаете в разделе Методы документации объекта механизма решения ServiceArea.
Подробнее об объекте SolverInsertCursor
Изучите полный список полей, поддерживаемых каждым входным классом анализа Области обслуживания
Размещение входные объектов в сети
Входные данные вашего сетевого анализа редко точно совпадают с геометрией улиц дорожной сети. Когда вы выполняете сетевой анализ, механизм расчета должен определить точное положение в сети, используемой для анализа, которое будет соответствовать представлению каждого входного местоположения.
Дополнительные сведения о полях местоположения сети и способе размещения входных данных в сети
Объекты механизма расчета arcpy.nax содержат некоторые свойства, контролирующие размещение объектов. Например, можно задать допуск расстояния поиска с помощью свойств searchTolerance и searchToleranceUnits или задать поисковый запрос с помощью свойства searchQuery, чтобы ограничить исходные объекты сети, соответствующие определенным характеристикам. Кроме того, при определении местоположения входных данных учитываются режим передвижения объекта анализа и барьеры. Входные данные не размещаются на ребрах и соединениях, которые ограничены режимом передвижения или любыми барьерами, включенными в анализ. Подробнее о параметрах searchTolerance, searchToleranceUnits и searchQuery анализа Области обслуживания вы узнаете в разделе Свойства документации объекта механизма расчета ServiceArea.
Использование предварительно рассчитанных полей сетевого местоположения
Хотя входные данные добавляются к анализу с использованием методов load и insertCursor, сетевые местоположения не вычисляются до тех пор, пока анализ не будет выполнен с использованием метода solve. Однако можно воспользоваться сетевыми местоположениями, задав поля сетевого местоположения в load или insertCursor. Это сэкономит время в процессе расчета и может ускорить общий анализ, если вы собираетесь использовать одни и те же входные местоположения несколько раз.
Подробнее о вычислении сетевых местоположений
Использование предварительно рассчитанных полей сетевого местоположения с помощью метода load
Чтобы использовать при загрузке данных поля сетевого местоположения, задайте для параметра use_location_fields метода load значение True. Это позволит включить поля сетевого местоположения в словарь NAClassFieldMappings, возвращаемый методом load. Затем поля сетевого местоположения можно сопоставить, как любые другие входные поля.
Если у предварительно рассчитанных полей сетевого местоположения входных данных имена полей стандартные, вам не нужно сопоставлять свои поля. Они будут автоматически сопоставлены с полями местоположения входного класса при создании словаря NAClassFieldMappings, и они будут использоваться при выполнении анализа, если вы используете такие сопоставления полей при вызове метода load.
Использование предварительно рассчитанных полей сетевого местоположения с помощью метода insertCursor
Для использования предварительно вычисленных полей сетевого местоположения при вставке данных методом insertCursor включите эти поля в параметр field_names при вызове метода insertCursor. Можно задать значения в этих полях, как и в любом другом поле, при вставке строк.
Подсказка:
При вставке строк с использованием полей сетевого местоположения вам не надо задавать геометрию входных данных любым из специальных токенов геометрии. Механизм расчета использует геометрию для вычисления сетевых местоположений, но в этом нет необходимости, если эти местоположения уже определены.
Включение пользовательских полей во входных данных анализа
В некоторых случаях вам может понадобиться включить в сетевой анализ дополнительные поля, которые не соответствуют ни одному из поддерживаемых свойств сетевого анализа. Например, если вы моделируете зону покрытия пожарными депо, вы можете включить число грузовиков, базирующихся на каждой из пожарных станций. Эта информация не будет использоваться непосредственно для сетевого анализа, но позже она будет использована в отчетах. Можно включить такие дополнительные поля во входные данные сетевого анализа, и эти поля обычно передаются в выходные данные анализа. Например, дополнительные поля входного класса 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)])