Создать слой области обслуживания (Network Analyst)

Сводка

Создает слой сетевого анализа области обслуживания и задает свойства анализа. Слой сетевого анализа области обслуживания необходим для определения зоны доступности в пределах данного порога импеданса вокруг местоположения пункта обслуживания.

Прежние версии:

Это устаревший инструмент. Это функция была передана инструменту Создать слой анализа области обслуживания.

Использование

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

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

Синтаксис

arcpy.na.MakeServiceAreaLayer(in_network_dataset, out_network_analysis_layer, impedance_attribute, {travel_from_to}, {default_break_values}, {polygon_type}, {merge}, {nesting_type}, {line_type}, {overlap}, {split}, {excluded_source_name}, {accumulate_attribute_name}, {UTurn_policy}, {restriction_attribute_name}, {polygon_trim}, {poly_trim_value}, {lines_source_fields}, {hierarchy}, {time_of_day})
ParameterОбъяснениеТип данных
in_network_dataset

Набор сетевых данных, для которого выполняется анализ области обслуживания.

Network Dataset Layer
out_network_analysis_layer

Имя создаваемого слоя области обслуживания.

String
impedance_attribute

Стоимостный атрибут, который будет использован в качестве импеданса в анализе.

String
travel_from_to
(Дополнительный)

Указывает направление движения от или до пункта обслуживания.

  • TRAVEL_FROMОбласть обслуживания создается в направлении от пункта обслуживания.
  • TRAVEL_TOОбласть обслуживания создается в направлении к пункту обслуживания.

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

String
default_break_values
(Дополнительный)

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

Для создания концентрических областей можно использовать несколько полигональных границ. Например, для нахождения 2-, 3- и 5-минутной областей обслуживания для одного пункта обслуживания необходимо задать "2 3 5" в качестве значений параметра ограничения по умолчанию (числа 2, 3 и 5 следует разделить пробелами).

String
polygon_type
(Дополнительный)

Задает количество создаваемых полигонов.

  • SIMPLE_POLYSСоздает генерализированные полигоны, которые генерируются быстрее и достаточно точны, если не учитывать особые требования. Используется по умолчанию.
  • DETAILED_POLYSСоздает подробные полигоны, которые точно моделируют области облуживания и могут содержать островки недоступных областей. Этот вариант требует больше времени на вычисление.
  • NO_POLYSВыключает создание полигонов в случаях, когда желательно использовать линейное отображение областей обслуживания.

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

String
merge
(Дополнительный)

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

  • NO_MERGEСоздает отдельные полигоны для каждого пункта обслуживания. Полигоны могут накладываться друг на друга.
  • NO_OVERLAPСоздает отдельные полигоны для каждого пункта обслуживания. Полигоны не накладываются друг на друга.
  • MERGE Объединяет полигоны нескольких пунктов обслуживания с общими граничными значениями.
String
nesting_type
(Дополнительный)

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

  • RINGSНе включает область с меньшим граничным значением. Создает полигоны между соседними граничными значениями. Этот параметр можно использовать для поиска областей между граничными значениями.
  • DISKS Используется для создания полигонов от пункта обслуживания до граничного значения. Например, при создании 5- и 10-минутных областей обслуживания 10-минутная область будет включать 5-минутную. Этот параметр можно использовать для определения всей области между пунктом обслуживания и граничным значением.
String
line_type
(Дополнительный)

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

  • NO_LINESНе создавать линии. Используется по умолчанию.
  • TRUE_LINESЛинии создаются без измерений.
  • TRUE_LINES_WITH_MEASURESЛинии создаются с измерениями. Значения размеров генерируются на основе значений импеданса для каждой границы; при этом промежуточные значения интерполируются. Не используйте этот параметр, если вам необходимо ускорить расчеты.
String
overlap
(Дополнительный)

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

  • OVERLAP Включать отдельные линейные объекты для каждого пункта обслуживания, если пункты обслуживания имеют совпадающие области обслуживания.
  • NON_OVERLAP Включать каждую линию области обслуживания не более одного раза ми связывать с ближайшим пунктом обслуживания (наименьший импеданс).
Boolean
split
(Дополнительный)
  • SPLITДелить каждую линию между двумя границами на две линии – по одной для каждой области. Этот параметр необходим для обозначения линий области обслуживания разрывами. В противном случае используйте параметр NO_SPLIT. Это повысит производительность вычислений.
  • NO_SPLITЛинии не делятся на границах областей обслуживания. Используется по умолчанию.
Boolean
excluded_source_name
[excluded_source_name,...]
(Дополнительный)

Задает список сетевых источников, исключаемых в процессе создания полигонов. Геометрия используемых элементов от исключенных источников не включается в полигоны.

Это позволяет исключить некоторые сетевые источники из процесса создания полигонов, например, если из-за них полигоны имеют неправильную форму или данные не согласуются с анализом области обслуживания. Допустим, при создании времени движения для области обслуживания в мультимодальной сети (автодороги + железные дороги) необходимо исключить железные дороги, чтобы точно определить области, доступные для автотранспорта.

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

String
accumulate_attribute_name
[accumulate_attribute_name,...]
(Дополнительный)

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

Для каждого из накопленных атрибутов стоимости к маршрутам, рассчитанным алгоритмом решения, добавляется параметр Total_[Impedance].

String
UTurn_policy
(Дополнительный)

Определяет правила разворотов, которые будут использоваться на перекрестках. Разрешение разворотов подразумевает возможность развернуться на перекрестке и продолжить движение назад по той же улице. Учитывая, что перекрестки бывают с улицами и тупиками, разные транспортные средства могут разворачиваться на одних перекрестках, но не могут – на других; это зависит от того, является ли данный перекресток пересечением с улицей или с тупиком. Чтобы учесть это, поведение при развороте неявно определяется числом ребер, которые соединяются с соединением, т.е. валентностью соединения. Ниже приведены допустимые значения для данного параметра; каждое из них сопровождается описанием значения в терминах валентности соединения.

  • ALLOW_UTURNSРазвороты разрешены в соединениях с любым количеством смежных ребер. Это значение используется по умолчанию.
  • NO_UTURNSРазвороты запрещены во всех соединениях, вне зависимости от их валентности. Однако, даже если эта опция выбрана, развороты в сетевых положениях по-прежнему разрешены, но вы можете запретить развороты в отдельных сетевых положениях с помощью свойства местоположения CurbApproach.
  • ALLOW_DEAD_ENDS_ONLYРазвороты запрещены во всех соединениях, кроме тех, у которых имеется только одно смежное ребро (тупик).
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLYРазвороты запрещены в соединениях с ровно двумя смежными ребрами, но разрешены на перекрестках (в соединениях с тремя смежными ребрами или более) и в тупиках (соединениях с ровно одним смежным ребром). Часто сети имеют избыточные соединения в середине сегмента дороги. Эта опция позволяет запретить развороты транспортных средств в таких местах.

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

String
restriction_attribute_name
[restriction_attribute_name,...]
(Дополнительный)

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

String
polygon_trim
(Дополнительный)
  • TRIM_POLYSУсекает полигоны до области в пределах заданного расстояния от границ. Это может быть необходимо, если сеть является очень разреженной, и вы не хотите, чтобы область обслуживания охватывала территории, не содержащие пространственных объектов
  • NO_TRIM_POLYSНе усекать полигоны.
Boolean
poly_trim_value
(Дополнительный)

Используется для указания расстояния, в пределах которого полигон обрезается. Параметр включает значение и единицу измерения расстояния. По умолчанию задано значение 100 метров.

Linear Unit
lines_source_fields
(Дополнительный)
  • LINES_SOURCE_FIELDS Добавляет к линиям областей обслуживания поля SourceID, SourceOID, FromPosition и ToPosition для хранения сведений об исходных пространственных элементах, используемых в анализе. Это помогает объединять результаты линий области обслуживания с исходными данными.
  • NO_LINES_SOURCE_FIELDSНе добавляет к линиям областей обслуживания поля SourceID, SourceOID, FromPosition и ToPosition.
Boolean
hierarchy
(Дополнительный)
  • USE_HIERARCHYПри анализе будет использоваться атрибут иерархии. Применение иерархии приводит при расчете к предпочтению ребер высшего порядка по сравнению с ребрами низшего порядка. Расчеты с иерархией выполняются быстрее, и они могут использоваться для моделирования предпочтений водителя, который скорее выберет для проезда автостраду, нежели местную дорогу – даже если это приведет к увеличению длины пути. Данная опция доступна, если входной набор сетевых данных имеет атрибут иерархии.
  • NO_HIERARCHYПри анализе не будет использоваться атрибут иерархии. Если иерархия не используется, то результатом является область обслуживания, измеренная вдоль всех ребер набора сетевых данных независимо от уровня иерархии.

Параметр не используется, если в наборе сетевых данных, используемом для выполнения анализа, не задан атрибут иерархии.

Boolean
time_of_day
(Дополнительный)

Время отправления или прибытия для пункта обслуживания слоя области обслуживания. Интерпретация этого значения (прибытие или отправление) зависит от того, какое направление движения задано – от пункта обслуживания или к нему.

  • Представляет время отправления, если для параметра Движение от или к пункту обслуживания выбрано значение TRAVEL_FROM.
  • Представляет время прибытия, если Движение от или к пункту обслуживания задано как TRAVEL_TO.

Если выбран атрибут импеданса на основе трафика, то решение будет создано с учетом заданных динамических условий трафика в указанное время дня. Дату и время можно указать в виде 5/14/2012 10:30 AM.

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

  • Сегодня – 12/30/1899
  • Воскресенье – 12/31/1899
  • Понедельник – 1/1/1900
  • Вторник – 1/2/1900
  • Среда – 1/3/1900
  • Четверг – 1/4/1900
  • Пятница – 1/5/1900
  • Суббота – 1/6/1900

Повторяя один и тот же анализ, но с разными значениями времени суток, можно увидеть, как изменяется доступность пункта обслуживания с течением времени. Например, пятиминутная область обслуживания вокруг пожарной части может быть большой рано утром, затем уменьшаться в часы пик, снова увеличиваться и так далее.

Date

Производные выходные данные

NameОбъяснениеТип данных
output_layer

Только что созданный слой сетевого анализа.

Слой Network Analyst

Пример кода

MakeServiceAreaLayer, пример 1 (окно Python)

Запуск инструмента с использованием только необходимых параметров.

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeServiceAreaLayer(network, "FireStationCoverage", "TravelTime")
MakeServiceAreaLayer, пример 2 (окно Python)

Выполните инструмент с использованием всех параметров.

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeServiceAreaLayer(network, "WarehouseCoverage", "DriveTime",
                                "TRAVEL_FROM", "5 10 15", "SIMPLE_POLYS", 
                                "NO_OVERLAP", "RINGS", "TRUE_LINES",
                                "NON_OVERLAP", "NO_SPLIT",
                                ["Metro_Lines", "Transfer_Stations",
                                "Transfer_Street_Station"],
                                ["Meters", "DriveTime"], "ALLOW_DEAD_ENDS_ONLY",
                                ["Oneway"], "NO_TRIM_POLYS", "",
                                "LINES_SOURCE_FIELDS")
MakeServiceAreaLayer, пример 3 (рабочий процесс)

В следующем автономном скрипте Python показано, как с помощью инструмента MakeServiceAreaLayer можно создавать 1-, 2- и 3-минутные области обслуживания вокруг пожарной части.

# Name: MakeServiceAreaLayer_Workflow.py
# Description: Generate 1-,2-,3- minute service areas around fire stations and
#              save the results to a layer file on disk. The service area
#              polygons can be used to visualize the areas that do not have
#              adequate coverage from the fire stations
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import os

try:
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "FireStationCoverage"
    impedance = "TravelTime"
    facilities = os.path.join(input_gdb, "Analysis", "FireStations")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new service area layer. We wish to generate the service area
    #polygons as rings, so that we can easily visualize the coverage for any
    #given location. We also want overlapping polygons as we can determine the
    #number of fire stations that cover a given location. We use hierarchy to
    #speed up the time taken to create the polygons. We will specify these
    #options while creating the new service area layer.
    result_object = arcpy.na.MakeServiceAreaLayer(network, layer_name,
                                    impedance, "TRAVEL_FROM", "1 2 3",
                                    "DETAILED_POLYS", "NO_MERGE", "RINGS")

    #Get the layer object from the result object. The service layer can now be
    #referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the service area layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]

    #Load the fire stations as facilities using default field mappings and
    #default search tolerance
    arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities, "",
                                                                            "")

    #Solve the service area layer
    arcpy.na.Solve(layer_object)

    #Save the solved service area layer as a layer file on disk
    layer_object.saveACopy(output_layer_file)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print(("An error occurred on line %i" % tb.tb_lineno))
    print((str(e)))
MakeServiceAreaLayer, пример 4 (рабочий процесс)

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

# Name: MakeServiceAreaLayer_Workflow2.py
# Description: Generate 3-minute service areas around fire stations at several
#               times of day to compare coverage differences due to varying
#               traffic conditions. Save the results to a feature class on disk.
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import os, datetime

try:
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "FireStationCoverage"
    out_featureclass = os.path.join(output_dir, "Output.gdb",
                                                        "FireStationCoverage")
    impedance = "TravelTime"
    facilities = os.path.join(input_gdb, "Analysis", "FireStations")
    times_of_day = [datetime.datetime(2014, 9, 25, 7, 0, 0),
                    datetime.datetime(2014, 9, 25, 12, 30, 0),
                    datetime.datetime(2014, 9, 25, 17, 30, 0),
                    datetime.datetime(2014, 9, 25, 21, 0, 0)]

    #Create a new service area layer.
    result_object = arcpy.na.MakeServiceAreaLayer(network, layer_name,
                                                impedance, "TRAVEL_FROM", "3",
                                                "DETAILED_POLYS", "NO_MERGE",
                                                hierarchy = "NO_HIERARCHY")

    #Get the layer object from the result object. The service area layer can
    #now be referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the service area layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]
    polygons_layer_name = sublayer_names["SAPolygons"]

    #The input data has a field for FireStationID that we want to transfer to
    #our analysis layer. Add the field, and then use field mapping to transfer
    #the values.
    arcpy.na.AddFieldToAnalysisLayer(layer_object, facilities_layer_name,
                                                    "FireStationID", "TEXT")
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    facilities_layer_name)
    field_mappings["FireStationID"].mappedFieldName = "FireStationID"

    #Load the fire stations as facilities.
    arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities,
                            field_mappings, "",
                            exclude_restricted_elements = "EXCLUDE")

    # Add fields to the output Polygons sublayer for later use.
    arcpy.na.AddFieldToAnalysisLayer(layer_object, polygons_layer_name,
                                        "FireStationID", "TEXT")
    arcpy.na.AddFieldToAnalysisLayer(layer_object, polygons_layer_name,
                                        "TimeOfDay", "TEXT")

    #Get sublayers to work with later
    facilities_sublayer = layer_object.listLayers(facilities_layer_name)[0]
    polygons_sublayer = layer_object.listLayers(polygons_layer_name)[0]

    #Get the Service Area Layer's solver properties. This can be used to
    #set individual properties later without re-creating the layer.
    solver_properties = arcpy.na.GetSolverProperties(layer_object)

    #Solve the Service Area for each time of day in the time list
    for t in times_of_day:

        print("Calculating service area for time of day: ", t)

        #Use the solver properties to set the time of day for the solve
        solver_properties.timeOfDay = t

        #Solve the service area layer
        arcpy.na.Solve(layer_object)

        #Transfer the FireStationID field from the input Facilities to the
        #output Polygons
        arcpy.management.AddJoin(polygons_sublayer, "FacilityID",
                                        facilities_sublayer, "ObjectID")
        #The joined fields are qualified by the feature class name of the joined
        #table, so determine the feature class names
        field_qualifier_pol = os.path.basename(polygons_sublayer.dataSource)
        target_field_name = "%s.FireStationID" % field_qualifier_pol
        field_qualifier_fac = os.path.basename(facilities_sublayer.dataSource)
        expression = "!%s.FireStationID!" % field_qualifier_fac
        arcpy.management.CalculateField(polygons_sublayer, target_field_name,
                                        expression, "PYTHON")
        arcpy.management.RemoveJoin(polygons_sublayer)

        #Populate the TimeOfDay field in the output feature class
        expression = '"' + str(t) + '"'
        arcpy.management.CalculateField(polygons_sublayer, "TimeOfDay",
                                            expression, "PYTHON")

        #Append the polygons to the output feature class. If this was the first
        #solve, create the feature class.
        if not arcpy.Exists(out_featureclass):
            arcpy.management.CopyFeatures(polygons_sublayer, out_featureclass)
        else:
            arcpy.management.Append(polygons_sublayer, out_featureclass)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))

Информация о лицензиях

  • Basic: Да
  • Standard: Да
  • Advanced: Да

Связанные разделы