LocationAllocationSolverProperties

Сводка

Предоставляет доступ к свойствам слоя сетевого анализа местоположений. Функция GetSolverProperties используется для получения объекта LocationAllocationSolverProperties из слоя сетевого анализа размещения-распределения.

Описание

Объект LocationAllocationSolverProperties предоставляет доступ для чтения и записи ко всем свойствам слоя сетевого анализа местоположений. Этот объект можно использовать для изменения нужных свойств анализа слоя местоположений, а соответствующий слой можно повторно рассчитать для получения необходимых результатов. Новый слой размещения-распределения можно создать с помощью инструмента геообработки Создать слой анализа Размещения-распределения. Получение объекта LocationAllocationSolverProperties из нового слоя местоположений позволяет повторно использовать существующий слой для последующего анализа, а не создавать слой для каждого анализа, что может замедлять работу.

После изменения свойств объекта LocationAllocationSolverProperties соответствующий слой можно немедленно использовать с другими функциями и инструментами геообработки. Обновлять слой для внесения изменения не требуется.

Свойства

ВладениеОбъяснениеТип данных
accumulators
(чтение и запись)

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

String
attributeParameters
(чтение и запись)

Дает возможность получать или задавать параметризированные атрибуты для использования их в анализе. Это свойство возвращает словарь Python. Ключом в словаре является кортеж двух значений – имени атрибута и имени параметра. Значение каждого элемента в словаре является значением параметра.

Параметризованные сетевые атрибуты используются для моделирования некоторого динамического аспекта значения атрибута. Например, туннель с ограничением высоты 12 футов может быть смоделирован с использованием параметра. В этом случае высоту транспорта в футах нужно указать как значение параметра. Если транспортное средство выше 12 футов (3,7 м), то это ограничение будет оценено как True, ограничивающее, таким образом, проезд по туннелю. Аналогично у моста может быть параметр, указывающий ограничение по весу.

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

Не стоит изменять свойство attributeParameters на месте; этот метод кодировки не будет работать.

solverProps.attributeParameters[('HeightRestriction', 'RestrictionUsage')] = "PROHIBITED"

Измените свойство attributeParameters используя новый объект словарь.

params = solverProps.attributeParameters params[('HeightRestriction', 'RestrictionUsage')] = "PROHIBITED"
solverProps.attributeParameters = params
Если слой сетевого анализа не имеет параметризованных атрибутов, это свойство вернет значение None.

Dictionary
defaultCapacity
(чтение и запись)

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

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

Double
facilitiesToFind
(чтение и запись)

Дает возможность получать или задавать количество пунктов обслуживания, положение которых определяется при расчете. Значение этого свойства игнорируется, если для свойства problemType выбрано значение MINIMIZE_FACILITIES, поскольку в этом случае при расчете определяется, как разместить минимальное количество пунктов обслуживания для достижения максимальной зоны охвата. Значение свойства также игнорируется, когда свойство problemType имеет значение TARGET_MARKET_SHARE, потому что в этом случае при расчете определяется минимальное количество пунктов обслуживания, требуемое для захвата определенной доли рынка.

Integer
impedance
(чтение и запись)

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

String
impedanceCutoff
(чтение и запись)

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

Double
impedanceParameter
(чтение и запись)

Дает возможность получать или задавать значение параметра для уравнений, определяемых в свойстве impedanceTransformation. Значение этого свойства игнорируется, если свойство impedanceTransformation имеет значение LINEAR. Значение свойства должно быть ненулевое.

Double
impedanceTransformation
(чтение и запись)

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

  • LINEARПреобразованный сетевой импеданс между пунктом обслуживания и точкой спроса – то же самое, что и импеданс кратчайшего сетевого пути между ними. При определении этого значения для свойства impedanceParameter всегда будет использоваться one, а любые значения свойства impedanceParameter игнорируется.
  • POWERПреобразованный сетевой импеданс между пунктом обслуживания и точкой спроса равен импедансу кратчайшего сетевого пути, возведенному в степень, заданную в значении свойства impedanceParameter. Этот вариант используется с положительными значениями свойства impedanceParameter для придания ближайшим пунктам обслуживания большего веса.
  • EXPONENTIALПреобразованный сетевой импеданс между пунктом обслуживания и точкой спроса равен математической константе e, возведенной в степень, определенной в импедансе кратчайшего сетевого пути, умноженному на значение свойства impedanceParameter. Этот вариант используется с положительными значениями свойства impedanceParameter для придания ближайшим пунктам обслуживания крайне высокого веса.
String
outputPathShape
(чтение и запись)

Контролирует применение прямых линий для отображения результатов анализа Размещение-Распределение. Список возможных значений следующий:

  • NO_LINESВ ходе анализа доля в качестве выходных данных не создается никакая форма. Это удобно при большом количестве точек спроса или пунктов обслуживания, когда необходимо получить только табличные данные.
  • STRAIGHT_LINESБудут построены прямые линии, соединяющие пункты обслуживания с отнесенными к ним точками спроса.
String
problemType
(чтение и запись)

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

  • MINIMIZE_IMPEDANCEЭтот параметр решает задачу размещения склада. Он выбирает набор пунктов обслуживания таким образом, чтобы сумма взвешенного импеданса (спрос в точке расположения, умноженный на импеданс пути до ближайшего пункта обслуживания) была минимальной. Эта задача часто называется задачей P-медианы.
  • MAXIMIZE_COVERAGEЭтот параметр решает задачу размещения пожарной части. Он выбирает пункты обслуживания таким образом, чтобы все или большинство точек спроса находились в пределах заданного порога импеданса.
  • MAXIMIZE_CAPACITATED_COVERAGE Этот параметр решает задачу размещения для пунктов обслуживания с конечной емкостью. Он выбирает пункты обслуживания таким образом, чтобы все или большинство точек спроса могли обслуживаться без превышения мощности любого из пунктов обслуживания. Помимо учета мощности он выбирает пункты обслуживания таким образом, чтобы итоговая сумма взвешенных импедансов (спрос, который был назначен пункту обслуживания, умноженный на импеданс до или от пункта обслуживания) была минимальной.
  • MINIMIZE_FACILITIESЭтот параметр решает задачу размещения пожарной части. Он выбирает минимальное количество пунктов обслуживания, необходимое для покрытия всех или большинства точек спроса в пределах заданного импеданса.
  • MAXIMIZE_ATTENDANCEЭтот параметр позволяет решать задачу размещения магазинов, где доля спроса, размещенная на ближайшем пункте обслуживания, сокращается с удалением от пункта обслуживания. Выбирается набор пунктов обслуживания, удовлетворяющий максимальный распределенный спрос. Спрос за пределами заданного порога импеданса не влияет на выбранный набор пунктов обслуживания.
  • MAXIMIZE_MARKET_SHAREЭтот параметр решает задачу размещения конкурирующих пунктов обслуживания. При решении задачи пункты обслуживания выбираются таким образом, чтобы обеспечивалась наибольшая доля рынка в зоне присутствия конкурентов. Для определения доли спроса для каждого пункта обслуживания используется модель притягательности. Выбирается набор пунктов обслуживания, удовлетворяющих максимальный распределенный спрос.
  • TARGET_MARKET_SHAREЭтот параметр решает задачу размещения конкурирующих пунктов обслуживания. При решении задачи пункты обслуживания выбираются таким образом, чтобы обеспечить заданную целевую долю рынка в зоне присутствия конкурентов. Для определения доли спроса для каждого пункта обслуживания используется модель притягательности. При решении задачи выбирается минимальное количество пунктов обслуживания, обеспечивающих заданную целевую долю рынка.
String
restrictions
(чтение и запись)

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

String
solverName
(только чтение)

Возвращает название механизма расчета, на который ссылается слой Network Analyst, использующийся для получения объекта свойств механизма расчета. Это свойство всегда возвращает строковое значение Location-Allocation Solver, если доступ к нему осуществляется из объекта LocationAllocationSolverProperties.

String
targetMarketShare
(чтение и запись)

Дает возможность получать или задавать долю целевого рынка в процентах для расчета, если для свойства problemType было задано значение TARGET_MARKET_SHARE. Это процент от общего веса спроса, который должны удовлетворить пункты обслуживания решения. Механизм решения выбирает количество пунктов обслуживания, необходимое для обеспечения целевой доли рынка, заданной этим числовым значением. Любое значение, заданное в свойстве facilitiesToFind, будет игнорироваться.

Double
timeOfDay
(чтение и запись)

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

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

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

К примеру, если отправление на маршрут должно происходить в 8:00 утра в пятницу, следует указать значение datetime.datetime(1900, 1, 5, 8,0,0).

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

DateTime
timeZoneUsage
(чтение и запись)

Указывает часовой пояс параметра timeOfDay.

  • GEO_LOCALЗначение параметра timeOfDay относится к часовому поясу, в котором находятся пункты обслуживания или точки спроса. Если были выбраны время и дата для параметра timeOfDay и для travelDirection выбрано FACILITY_TO_DEMAND, то это будет часовой пояс пунктов обслуживания. Если при тех же параметрах для параметра travelDirection выбрано DEMAND_TO_FACILITY, то это будет часовой пояс пунктов обслуживания.
  • UTCЗначения параметра timeOfDay определяются в формате Всемирного координированного времени (UTC). Используйте эту опцию, если хотите провести анализ для конкретного времени, например текущего, но не знаете, в каком часовом поясе будут находиться пункты обслуживания или точки спроса.

При выполнении анализа размещения-распределения, охватывающего несколько часовых поясов, применяются следующие правила:

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

String
travelDirection
(чтение и запись)

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

  • FACILITY_TO_DEMANDНаправление движения от пункта обслуживания к точкам спроса.
  • DEMAND_TO_FACILITYНаправление движения от точек спроса к пунктам обслуживания.
String
travelMode
(только чтение)

Доступ к режиму движения устанавливается для слоя сетевого анализа как объект arcpy.na.TravelMode.

Object
useHierarchy
(чтение и запись)

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

  • USE_HIERARCHY Для анализа используется атрибут иерархии. Применение иерархии приводит при расчете к предпочтению ребер высшего порядка по сравнению с ребрами низшего порядка. Расчеты с иерархией выполняются быстрее, и они могут использоваться для моделирования предпочтений водителя, который скорее выберет для проезда автостраду, нежели местную дорогу – даже если это приведет к увеличению длины пути. Эта опция применима только в том случае, если в наборе сетевых данных, на который ссылается слой сетевых данных Network Analyst, имеется атрибут иерархии. Для выбора этой опции также может использоваться значение True.
  • NO_HIERARCHYДля анализа атрибут иерархии не используется. Расчет без применения иерархии дает точный маршрут для набора сетевых данных. Для выбора этой опции также может использоваться значение False.
String
uTurns
(чтение и запись)

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

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

Обзор метода

МетодОбъяснение
applyTravelMode (travel_mode)

Обновляет свойства анализа слоя network analyst на основе объекта режима передвижения. После этого обновленный слой network analyst может быть рассчитан для завершения анализа.

Методы

applyTravelMode (travel_mode)
ParameterОбъяснениеТип данных
travel_mode

Переменная, ссылающаяся на объект режима передвижения, который был получен на основе слоя сетевых данных. Список объектов режима передвижения можно получить, вызвав функцию arcpy.na.GetTravelModes.

Object

При создании слоя network analyst он получит значения по умолчанию для всех своих свойств анализа. Отдельные свойства анализа можно обновлять с помощью объекта свойств механизма расчета, полученного из слоя network analyst. Режим перемещения сохраняет предопределенный набор настроек анализа, который помогает выполнять определенные виды анализа – например, режим передвижения пешком сохраняет настройки анализа, необходимые для выполнения по-временного анализа передвижения пешим ходом.

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

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

Если параметр travel_mode не привязан к объекту режима передвижения или строке, возникает исключительная ситуация TypeError. Если параметр travel_mode привязан к строке, но строка не может быть внутренне конвертирована в строковое представление объекта режима передвижения, возникает исключительная ситуация ValueError.

Пример кода

Пример 1 LocationAllocationSolverProperties (рабочий процесс)

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

# Name: LocationAllocationSolverProperties_workflow_01.py
# Description: Test three different scenarios for optimizing the locations of
#              new stores based on customer and competitor locations. Use the
#              LocationAllocationSolverProperties object to update an existing
#              Location-Allocation layer before re-running the analysis.
# Requirements: Network Analyst Extension

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

try:
    #Check out the Network Analyst extension license

    #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 = "Location_Allocation"
    scenario1_output = "NewStoreLocations"
    scenario2_output = "StoreExpansionScenario"
    scenario3_output = "MaximizedMarketShareStoreLocations"
    facilities = os.path.join(input_gdb, "Analysis", "CandidateStores")
    required_facility = os.path.join(input_gdb, "Analysis", "ExistingStore")
    competitor_facility = os.path.join(input_gdb, "Analysis", "CompetitorStores")
    demand_points = os.path.join(input_gdb, "Analysis", "TractCentroids")

    # --- Scenario 1: Select the best three locations for stores

    #Create a new Location-Allocation layer. In this case, the demand travels to
    #the facility. We wish to find 3 potential store locations out of all the
    #candidate store locations using the maximize attendance model.
    result_object = arcpy.na.MakeLocationAllocationAnalysisLayer(network,
                                            layer_name, "Driving Time",
                                            "TO_FACILITIES",
                                            "MAXIMIZE_ATTENDANCE", cutoff=5,
                                            number_of_facilities_to_find=3,
                                            decay_function_type="LINEAR")
    
    #Get the layer object from the result object. The Location-Allocation layer
    #can now be referenced using the layer object.
    layer_object = result_object.getOutput(0)
    
    #Get the names of all the sublayers within the location-allocation layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Store the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]
    demand_points_layer_name = sublayer_names["DemandPoints"]
    #Get the facilities sublayer object to use later
    facilities_sublayer = layer_object.listLayers(facilities_layer_name)[0]
    
    #Load the candidate store locations as facilities using default search
    #tolerance and field mappings.
    arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities, "",
                                                                            "")
    
    #Load the tract centroids as demand points using default search tolerance.
    #Use the field mappings to map the Weight property from POP2000 field.
    demand_field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    demand_points_layer_name)
    demand_field_mappings["Weight"].mappedFieldName = "POP2000"
    arcpy.na.AddLocations(layer_object, demand_points_layer_name, demand_points,
                          demand_field_mappings, "")
    
    #Solve the location-allocation layer
    arcpy.na.Solve(layer_object)
        
    #Save the facilities sublayer of the solved Location-Allocation layer as a 
    #feature class
    arcpy.management.CopyFeatures(facilities_sublayer, scenario1_output)
    
    # --- Scenario 2: Assuming the three stores selected previously have already
    # been built, select the best locations for two more stores
    
    #We need to re-solve the previous scenario as a store-expansion scenario, in
    #which we will start with an existing store and optimally locate two
    #additional stores.
    #Load the existing store location as the required facility. Use the field
    #mappings to set the facility type to requried. We need to append this
    #required facility to existing facilities.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    facilities_layer_name)
    field_mappings["FacilityType"].defaultValue = 1
    field_mappings["Name"].mappedFieldName = "Name"
    arcpy.na.AddLocations(layer_object, facilities_layer_name, required_facility,
                          field_mappings, "", append="APPEND")
    
    #Solve the location-allocation layer
    arcpy.na.Solve(layer_object)
        
    #Save the facilities sublayer of the solved Location-Allocation layer as a 
    #feature class
    arcpy.management.CopyFeatures(facilities_sublayer, scenario2_output)
    
    # --- Scenario 3: Re-run the previous scenario with additional information:
    #the locations of competing stores.
    
    #Load the competitor store locations as the competitor facilities. Use the
    #field mappings to set the facility type to Competitor. We need to append
    #these competitor facilities to existing facilities.
    field_mappings["FacilityType"].defaultValue = 2
    arcpy.na.AddLocations(layer_object, facilities_layer_name,
                          competitor_facility, field_mappings, "",
                          append="APPEND")
    
    #Get the LocationAllocationSolverProperties object from the 
    #Location-Allocation layer to modify the analysis settings for the layer.
    solver_props = arcpy.na.GetSolverProperties(layer_object)
    
    #Set the problem type to Maximize Market Share, and impedance transformation
    #to Power with an impedance parameter value of 2.
    solver_props.problemType = "MAXIMIZE_MARKET_SHARE"
    solver_props.impedanceTransformation = "POWER"
    solver_props.impedanceParameter = 2
    
    #Solve the location-allocation layer
    arcpy.na.Solve(layer_object)
    
    #print the market share that was obtained
    print(arcpy.GetMessage(0))
    
    #Save the facilities sublayer of the solved Location-Allocation layer as a 
    #feature class
    arcpy.management.CopyFeatures(facilities_sublayer, scenario3_output)
    
    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 occured on line %i" % tb.tb_lineno)
    print(str(e))
ApplyTravelMode, пример 2 (окно Python)

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

#Get the location-allocation layer object from a layer named
#"Location-Allocation" in the map
doc = arcpy.mp.ArcGISProject('current')
map_obj = doc.listMaps()[0]
la_layer = map_obj.listLayers('Location-Allocation')[0]

#Get the Trucking Time travel mode from the network dataset
desc = arcpy.Describe(la_layer)
travel_modes = arcpy.na.GetTravelModes(desc.network.catalogPath)
trucking_mode = travel_modes["Trucking Time"]

#Apply the travel mode to the analysis layer
solver_properties = arcpy.na.GetSolverProperties(la_layer)
solver_properties.applyTravelMode(trucking_mode)