LocationAllocationSolverProperties (arcpy.na)
Резюме
Предоставляет доступ к свойствам слоя сетевого анализа местоположений. Функция GetSolverProperties используется для получения объекта LocationAllocationSolverProperties из слоя сетевого анализа местоположений.
Обсуждение
Объект LocationAllocationSolverProperties предоставляет доступ для чтения и записи ко всем свойствам слоя сетевого анализа местоположений. Этот объект можно использовать для изменения нужных свойств анализа слоя местоположений, а соответствующий слой можно повторно рассчитать для получения необходимых результатов. Новый слой местоположений можно создать с помощью инструмента геообработки Преобразование слоя в размещение-распределение (Make Location-Allocation Layer). Получение объекта LocationAllocationSolverProperties из нового слоя местоположений позволяет повторно использовать существующий слой для последующего анализа, а не создавать новый слой для каждого анализа, что может замедлять работу.
После изменения свойства объекта LocationAllocationSolverProperties соответствующий слой можно использовать с другими функциями и инструментами геообработки. Обновлять слой для внесения изменения не требуется.
Свойства
Свойство | Объяснение | Тип данных |
accumulators (чтение и запись) | Дает возможность получать или задавать список сетевых атрибутов стоимости, сумма которых подсчитывается в ходе данного анализа. Пустой список ([]) означает, что не подсчитывается сумма ни для каких атрибутов стоимости. | String |
attributeParameters (чтение и запись) | Дает возможность получать или задавать параметризованные атрибуты для использования их в анализе. Это свойство возвращает словарь Python. Ключом в словаре является кортеж двух значений – имени атрибута и имени параметра. Значение каждого элемента в словаре является значением параметра. Параметризованные сетевые атрибуты используются для моделирования некоторого динамического аспекта значения атрибута. Например, туннель с ограничением высоты 12 футов может быть смоделирован с использованием параметра. В данном случае в качестве значения параметра следует указать высоту транспортного средства в футах. Если транспортное средство выше, чем 12 футов (3,7 м), ограничение будет оценено как верное (true), таким образом, проезд по туннелю будет запрещен. Подобным образом у моста может быть параметр, указывающий ограничение по весу. Попытка изменить непосредственно свойство attributeParameters не приведет к обновлению значений. Вместо этого следует всегда использовать для установки значений этого свойства новый объект словаря. Различие между этими подходами проиллюстрировано следующими двумя блоками кода.
| Dictionary |
defaultCapacity (чтение и запись) | Дает возможность получать или задавать емкость пунктов обслуживания по умолчанию, если параметр распределения положений problemType имеет значение MAXIMIZE_CAPACITATED_COVERAGE (Максимизировать зону охвата с учетом емкости). Для всех остальных типов задач этот параметр игнорируется. Пункты обслуживания имеют свойство Capacity (Емкость), причем, если для конкретного пункта это свойство не является null, то оно используется для этого пункта вместо параметра defaultCapacity. | Double |
facilitiesToFind (чтение и запись) |
Дает возможность получать или задавать количество пунктов обслуживания, положение которых определяется при расчете. Значение этого свойства игнорируется, если свойство problemType имеет значение MINIMIZE_FACILITIES (Минимизировать количество пунктов), поскольку в этом случае при расчете определяется, как разместить минимальное количество пунктов обслуживания для достижения максимальной зоны охвата. Значение свойства также игнорируется, когда свойство problemType имеет значение TARGET_MARKET_SHARE (Доля на целевом рынке) – в этом случае при расчете определяется минимальное количество пунктов обслуживания, требуемое для захвата определенной доли рынка. | Integer |
impedance (чтение и запись) | Дает возможность получать или задавать сетевой атрибут стоимости, используемый в качестве импеданса. | String |
impedanceCutoff (чтение и запись) | Дает возможность получать или задавать максимальный импеданс, при котором точка спроса может быть отнесена к пункту обслуживания. | Double |
impedanceParameter (чтение и запись) | Дает возможность получать или задавать значение параметра для уравнений, заданных свойством impedanceTransformation. Значение этого свойства игнорируется, если свойство impedanceTransformation имеет значение LINEAR (Линейное). Значение свойства должно быть ненулевое. | Double |
impedanceTransformation (чтение и запись) | Дает возможность получать или задавать уравнение для преобразования сетевой стоимости между пунктами обслуживания и точками спроса. Значение этого свойства вместе со значением свойства impedanceParameter задает, насколько сильно сетевой импеданс между пунктами обслуживания и точками спроса влияет на выбор пунктов при расчете. Список возможных значений следующий:
| String |
outputPathShape (чтение и запись) | Задает применение прямых линий для отображения результатов анализа распределения положений. Список возможных значений следующий:
| String |
problemType (чтение и запись) | Дает возможность получать или задавать тип задачи для расчета. Выбор типа задачи зависит от вида размещаемого пункта обслуживания. Различные типы пунктов обслуживания имеют различные приоритеты и ограничения. Список возможных значений следующий:
| String |
restrictions (чтение и запись) | Дает возможность получать или задавать список атрибутов ограничения, применяемых в ходе данного анализа. Пустой список ([]) означает, что в ходе анализа не применяются никакие атрибуты ограничения. | String |
solverName (только чтение) | Возвращает имя механизма расчета, на который ссылается слой Инструменты Network Analyst, использующийся для получения объекта свойств механизма расчета. Это свойство всегда возвращает строковое значение Location-Allocation Solver (Механизм расчета распределения положений), если доступ к нему осуществляется из объекта LocationAllocationSolverProperties. | String |
targetMarketShare (чтение и запись) | Дает возможность получать или задавать долю целевого рынка в процентах для расчета, если свойство problemType имеет значение TARGET_MARKET_SHARE (Доля на целевом рынке). Это процент от общего веса спроса, который должны удовлетворить пункты обслуживания решения. Механизм решения выбирает количество пунктов обслуживания, необходимое для обеспечения целевой доли рынка, заданной этим числовым значением. Любое значение, заданное в свойстве facilitiesToFind, будет игнорироваться. | Double |
timeOfDay (чтение и запись) | Дает возможность получать или задавать время и дату отправления. Время отправления может быть от пункта обслуживания или от точки спроса – в зависимости от заданного направления. Значение None (Нет) указывает на то, что дата и время не применяются. Вместо конкретной даты может быть задан день недели, при помощи следующих условных дат:
К примеру, если отправление на маршрут должно происходить в 8:00 в пятницу, следует указать значение datetime.datetime(1900, 1, 5, 8,0,0). | DateTime |
travelDirection (чтение и запись) | Задает направление движения между пунктами обслуживания и точками спроса при расчете сетевой стоимости. Список возможных значений следующий:
| String |
useHierarchy (чтение и запись) | Отвечает за использование атрибута иерархии при проведении анализа. Список возможных значений следующий:
| String |
uTurns (чтение и запись) | Дает возможность получать или задавать политику работы с разворотами в соединениях, которые могут возникать в ходе прохода по сети между остановками. Список возможных значений следующий:
| String |
Пример кода
Скрипт показывает, как изменить тип проблемы слоя сетевого анализа местоположений на Минимизировать пункты обслуживания (Minimize Facilities) и установить степень преобразования импеданса с параметром импеданса, равным 2. Предполагается, что слой местоположений Stores Coverage был создан в новом документе карты на учебного набора сетевых данных на территорию города Сан-Франциско.
#Get the location-allocation layer object from a layer named "Stores Coverage" in
#the table of contents
laLayer = arcpy.mapping.Layer("Stores Coverage")
#Get the solver properties object from the location-allocation layer
solverProps = arcpy.na.GetSolverProperties(laLayer)
#Update the properties for the location-allocation layer using the solver properties
#object
solverProps.problemType = "MINIMIZE_FACILITIES"
solverProps.impedanceTransformation = "POWER"
solverProps.impedanceParameter = 2
Скрипт демонстрирует, как выбрать оптимальные местоположения магазинов для получения наиболее развитой розничной сети, с помощью анализа местоположений. Сначала скрипт создает новый слой местоположений с нужными настройками анализа. После этого возможные размещения магазинов и центроиды групп блоков загружаются в качестве, соответственно, пунктов обслуживания и точек спроса. Рассчитанный анализ сохраняется в файл слоя. Два следующих анализа осуществляются путем изменения свойств анализа, используя объект LocationAllocationSolverProperties. После каждого расчета слой сохраняется как файл слоя. Скрипт использует учебные данные на территорию города Сан-Франциско. Детальное описание процесса находится в упражнении 9 учебника по Network Analyst. В то время как в руководстве описан для вас весь этот процесс для пользовательского интерфейса ArcMap, здесь содержится пример автоматизации таких же действий с помощью скрипта Python.
import arcpy
#Set up the environment
arcpy.env.overwriteOutput = True
arcpy.env.workspace = "C:/data/SanFrancisco.gdb"
arcpy.CheckOutExtension("network")
#Set up variables
networkDataset = "Transportation/Streets_ND"
outNALayerName = "NewStoreLocations"
inFacilities = "Analysis/CandidateStores"
requiredFacility = "Analysis/ExistingStore"
competitorFacility = "Analysis/CompetitorStores"
inDemandPoints = "Analysis/TractCentroids"
outputFolder = "C:/data/output/"
#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.
outNALayer = arcpy.na.MakeLocationAllocationLayer(networkDataset, outNALayerName,
"TravelTime","DEMAND_TO_FACILITY",
"MAXIMIZE_ATTENDANCE",3,5,
"LINEAR")
#Get the layer object from the result object. The location-allocation layer
#can now be referenced using the layer object.
outNALayer = outNALayer.getOutput(0)
#Get the names of all the sublayers within the location-allocation layer.
subLayerNames = arcpy.na.GetNAClassNames(outNALayer)
#Stores the layer names that we will use later
facilitiesLayerName = subLayerNames["Facilities"]
demandPointsLayerName = subLayerNames["DemandPoints"]
#Load the candidate store locations as facilities using default search
#tolerance and field mappings.
arcpy.na.AddLocations(outNALayer, facilitiesLayerName, inFacilities, "", "",
exclude_restricted_elements = "EXCLUDE")
#Load the tract centroids as demand points using default search tolerance. Use
#the field mappings to map the Weight property from POP2000 field.
demandFieldMappings = arcpy.na.NAClassFieldMappings(outNALayer,
demandPointsLayerName)
demandFieldMappings["Weight"].mappedFieldName = "POP2000"
arcpy.na.AddLocations(outNALayer,demandPointsLayerName ,inDemandPoints,
demandFieldMappings, "",
exclude_restricted_elements = "EXCLUDE")
#Solve the location-allocation layer
arcpy.na.Solve(outNALayer)
#Save the solved location-allocation layer as a layer file on disk with
#relative paths
outLayerFile = outputFolder + outNALayerName + ".lyr"
arcpy.management.SaveToLayerFile(outNALayer,outLayerFile,"RELATIVE")
#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.
fieldMappings = arcpy.na.NAClassFieldMappings(outNALayer, facilitiesLayerName)
fieldMappings["FacilityType"].defaultValue = 1
fieldMappings["Name"].mappedFieldName = "Name"
arcpy.na.AddLocations(outNALayer, facilitiesLayerName, requiredFacility,
fieldMappings, "", append = "APPEND",
exclude_restricted_elements = "EXCLUDE")
#Solve the location-allocation layer
arcpy.na.Solve(outNALayer)
#Save the solved location-allocation layer as a layer file on disk with
#relative paths
updatedNALayerName = "StoreExpansionScenario"
outNALayer.name = updatedNALayerName
outLayerFile = outputFolder + updatedNALayerName + ".lyr"
arcpy.management.SaveToLayerFile(outNALayer,outLayerFile,"RELATIVE")
#We need to resolve the previous scenario and locate new stores to
#maximize market share in light 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.
fieldMappings["FacilityType"].defaultValue = 2
arcpy.na.AddLocations(outNALayer, facilitiesLayerName, competitorFacility,
fieldMappings, "", append = "APPEND",
exclude_restricted_elements = "EXCLUDE")
#Get the LocationAllocationSolverProperties object from the location-allocation
#layer to modify the analysis settings for the layer.
solverProps = arcpy.na.GetSolverProperties(outNALayer)
#Set the problem type to Maximize Market Share, and impedance transformation to
#Power with an impedance parameter value of 2.
solverProps.problemType = "MAXIMIZE_MARKET_SHARE"
solverProps.impedanceTransformation = "POWER"
solverProps.impedanceParameter = 2
#Solve the location-allocation layer
arcpy.na.Solve(outNALayer)
#print the market share that was obtained
arcpy.AddMessage(arcpy.GetMessage(0))
#Change the name of the NA Layer
updatedNALayerName = "MaximizedMarketShareStoreLocations"
outNALayer.name = updatedNALayerName
#Save the solved location-allocation layer as a layer file on disk with
#relative paths
outLayerFile = outputFolder + updatedNALayerName + ".lyr"
arcpy.management.SaveToLayerFile(outNALayer,outLayerFile,"RELATIVE")
arcpy.AddMessage("Completed")