Доступ к выходным данным анализа

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

  • Сохраните результаты анализа в класс объектов методом export.
  • Прочитайте результаты методом searchCursor.
  • Получите результаты в формате Apache Arrow с помощью метода toArrowTable.
  • Сохраните результаты анализа в файл .zip, который можно использовать в других приложениях, например, в ArcGIS Navigator.
  • Сохраните результат анализа в файл слоя или пакет слоев в целях отладки.

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

Примечание:

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

Сохранение результатов в класс пространственных объектов

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

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


# Solve the analysis
result = route.solve()

# Save results to disk using the export method
output_feature_class = "C:/data/io.gdb/Routes"
result.export(arcpy.nax.RouteOutputDataType.Routes, output_feature_class)

Подробнее о методе export анализа маршрутов вы узнаете в разделе Методы документации объекта RouteResult.

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

Прочитайте результаты

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

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

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


# Solve the analysis
result = route.solve()

# Retrieve specific fields of interest using a searchCursor
for row in result.searchCursor(arcpy.nax.RouteOutputDataType.Routes, ["Name", "Total_Miles"]):
    # Retrieve the name and mileage for each route
    route_name = row[0]
    route_miles = row[1]
    # Print the route's name if the route's total mileage is greater than 10 miles
    if route_miles > 10:
        print(route_name)

Вы можете использовать метод searchCursor для считывания результатов анализа в фрейм данных pandas для дальнейшего анализа.

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


import pandas as pd

# Solve the analysis
result = route.solve()

# Read the results into a pandas dataframe
fields = ["Name", "Total_Miles"]
with result.searchCursor(arcpy.nax.RouteOutputDataType.Routes, fields) as cur:
    df = pd.DataFrame(cur, columns=fields)
# Do some further analysis...

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

Подсказка:

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

Подробнее о методе searchCursor анализа маршрутов вы узнаете в разделе Методы документации объекта RouteResult.

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

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

Получение результатов в формате Apache Arrow

Для анализа матрицы Источник-Назначение вы можете получить выходные данные Lines как объект таблицы Apache Arrow и сохранить результаты в файл с помощью метода toArrowTable. Apache Arrow может использоваться для эффективного хранения и чтения больших объемов данных и может легко работать с конвертацией между многими другими форматами данных, популярными в науке о данных.

Внимание:

toArrowTable доступен только для решателя матрицы Источник-Назначение.

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


# Solve the analysis
result = od_matrix.solve()

# Retrieve the Arrow table using the toArrowTable method
arrow_table = result.toArrowTable(
    arcpy.nax.OriginDestinationCostMatrixOutputDataType.Lines,
    ["OriginOID"]
)

# Count the number of destinations reached by each origin.
# The result is a pyarrow structured array.
counts = arrow_table["OriginOID"].value_counts()

# If desired, you can convert the Arrow table to a pandas dataframe
# or many other supported formats.
df = arrow_table.to_pandas(split_blocks=True, zero_copy_only=True)

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

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


# Solve the analysis
result = od_matrix.solve()

# Using the toArrowTable method to save the OD Cost Matrix result permanently to a file.
result.toArrowTable(
    arcpy.nax.OriginDestinationCostMatrixOutputDataType.Lines,
    ["OriginOID", "DestinationOID", "Total_Time", "Total_Distance"],
    os.path.join(output_folder, "ODLines.arrow")
)

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


import pyarrow

# Read the data from the file
with pyarrow.memory_map(os.path.join(output_folder, "ODLines.arrow"), 'r') as source:
    batch_reader = pyarrow.ipc.RecordBatchFileReader(source)
    table_from_file = batch_reader.read_all()

# Create a pandas dataframe using the records from the memory-mapped file using zero copy
df = table_from_file.to_pandas(split_blocks=True, zero_copy_only=True)
# Do some further analysis...

При работе с очень большими наборами данных вам может потребоваться использовать параметр max_batch_size для предотвращения ошибок нехватки памяти при записи результатов анализа. Этот параметр указывает максимальное количество записей, включаемых в один пакет записей в выходной таблице Arrow. Когда таблица Arrow или файл, содержащие несколько пакетов записей, преобразуются в другой формат, например фрейм данных pandas, вы не сможете выполнить чтение с нулевой копией всей таблицы или файла. При чтении с нулевым копированием к данным можно получить доступ без дополнительных затрат на сериализацию для загрузки их в ОЗУ. Чтобы добиться такого поведения чтения с нулевым копированием, вашему коду может потребоваться обрабатывать по одному пакету записей за раз.

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


# Solve the analysis
result = od_matrix.solve()

# Using the toArrowTable method to save the OD Cost Matrix result permanently to a file.
# Use max_batch_size to prevent memory errors.
out_arrow_file = os.path.join(output_folder, "ODLines.arrow")
arrow_table = result.toArrowTable(
    arcpy.nax.OriginDestinationCostMatrixOutputDataType.Lines,
    ["OriginOID", "DestinationOID", "Total_Time", "Total_Distance"],
    out_arrow_file,
    max_batch_size=1000000  # Limit the output batches to one million records
)

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


import pyarrow

# Process the OD Cost Matrix results in batches
with pyarrow.memory_map(os.path.join(output_folder, "ODLines.arrow"), 'r') as source:
    batch_reader = pyarrow.ipc.RecordBatchFileReader(source)
    for i in range(batch_reader.num_record_batches):
        rb = batch_reader.get_batch(i)
        # Convert this record batch to a pandas dataframe using zero copy
        df = rb.to_pandas(split_blocks=True, zero_copy_only=True)
        # Do some further analysis...

Узнайте больше о методе toArrowTable для анализа матрицы Источник-Назначение в разделе Методы документации объекта OriginDestinationCostMatrixResult.

Изучите полный список типов выходных данных анализа и их схемы для анализа матрицы Источник-Назначение

Получение .zip файла данных маршрута

Для анализа Маршрут, Ближайший пункт обслуживания, Задача выбора маршрута транспорта можно экспортировать результат в файл данных маршрута .zip. Файл .zip можно опубликовать как слой маршрутов в ArcGIS Online или ArcGIS Enterprise с помощью инструмента Опубликовать как слои маршрутов.

Элемент слоя маршрута можно использовать в разных приложениях, например, в ArcGIS Navigator, чтобы предоставить маршруты для полевых сотрудников, на панели Путевых листов Map Viewer Classic для дальнейшей настройки маршрута, содержащегося в слое маршрута и в ArcGIS Pro для создания нового аналитического слоя маршрута из слоя маршрута.

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


# Solve the analysis
result = route.solve()

# Export the results to a route data .zip file
out_zip = "C:/data/RouteData.zip"
result.saveRouteData(out_zip)

# Share the route data zip file as route layers to your portal
arcpy.nax.ShareAsRouteLayers(
    out_zip,
    summary='Tuesday restaurant inspection routes', 
    tags='Tuesday',
    route_name_prefix='TuesdayRestaurants', 
    portal_folder_name='RouteLayers',
    share_with='MYGROUPS',
    groups='Drivers'
)
Внимание:

Для успешного запуска метода saveRouteData для свойства allowSaveRouteData объекта механизма расчета должно быть задано значение True.

Подробнее о методе saveRouteData анализа маршрутов вы узнаете в разделе Методы документации объекта RouteResult.

Сохранение файла слоя или пакета

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

Вы можете сохранить либо в файл слоя .lyr для ArcGIS Desktop или ArcGIS Pro, либо в пакет слоев .lpkx, предназначенный только для ArcGIS Pro. Выходной тип зависит от расширения файла, использованного при задании параметра file_name метода. Пакет слоев содержит данные анализа, но не содержит источник сетевых данных.

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

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

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


# Solve the analysis
result = route.solve()

# Save the results to a layer package for debugging purposes
out_lpkx = "C:/data/RouteAnalysis.lpkx"
result.saveAsLayerFile(out_lpkx)
Примечание:

Для успешного запуска метода saveAsLayerFile для свойства allowSaveLayerFile объекта механизма расчета должно быть задано значение True.

Подробнее о методе saveAsLayerFile анализа маршрутов вы узнаете в разделе Методы документации объекта RouteResult.