Apache Arrow в ArcGIS

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

Основное представление табличных данных в Arrow - это таблица Arrow. Таблица Arrow – это двухмерное табличное представление, в котором столбцы являются разделенными массивами Arrow. Интерфейсом для Arrow в Python является PyArrow. Дополнительные сведения см. в документации Apache Arrow и библиотека PyArrow.

Таблицы и данные пространственных объектов

Вы можете преобразовывать таблицы и классы объектов в таблицу Arrow, используя функцию TableToArrowTable в модуле доступа к данным (arcpy.da).

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

import arcpy

infc = r'C:\data\usa.gdb\cities'
arrow_table = arcpy.da.TableToArrowTable(infc)

Чтобы преобразовать таблицу Arrow в таблицу или класс объектов, используйте инструмент Копировать строки или Копировать объекты.

Создать класс пространственных объектов из таблицы Arrow.

outfc = arcpy.management.CopyFeatures(arrow_table, r'C:\data\usa.gdb\cities_new')

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

Схема

Таблицы Arrow должны следовать определенной схеме, чтобы их можно было распознать инструментом геообработки. Схема состоит из полей идентификатора объекта и геометрии, их типов данных и сопутствующих метаданных. Метаданные хранятся в виде объекта в кодировке JSON.

Поле идентификатора объекта должно иметь тип данных PyArrow int64 со следующей парой метаданных ключ/значение:

{
    'esri.oid': 'esri.int64'
}

Пример определения поля, содержащего идентификаторы объектов.

pyarrow.field(
    "OBJECTID",
    pyarrow.int64(),
    metadata={'esri.oid': 'esri.int64'}
)

Столбец геометрии должен иметь тип данных PyArrow binary или string, в зависимости от кодировки данных геометрии. Кодировка геометрии указана в метаданных под ключом esri.encoding. Список поддерживаемых кодировок геометрии:

  • EsriShape и Well Known Binary (WKB) для binary полей
  • EsriJSON, GeoJSON Well Known Text (WKT) для string полей

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

{
    'esri.encoding': '<EsriShape, EsriJSON, GeoJSON, WKB, or WKT>',
    'esri.sr_wkt': '<a WKT coordinate system string>'
}

Пример определения поля геометрии, содержащего бинарную геометрию Esri Shape с пространственной привязкой GCS North American 1983.

f = pyarrow.field(
    "SHAPE",
    pyarrow.binary(),
    metadata={
        'esri.encoding': 'EsriShape',
        'esri.sr_wkt': 'GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",' \
        'SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],'         \
        'UNIT["Degree",0.0174532925199433]];-400 -400 1000000000;-100000 10000;'         \
        '-100000 10000;8.98315284119521E-09;0.001;0.001;IsHighPrecision'
    }
)

При использовании таблицы Arrow в качестве входных данных для инструмента геообработки, для которого требуется класс пространственных объектов или векторный слой, необходимо правильно указать столбец геометрии, чтобы инструменты геообработки могли распознавать данные геометрии. Если он не указан должным образом, инструмент не работает. В особом случае, когда геометрия имеет тип EsriShape, ключ esri.encoding можно не указывать. Хотя поддерживаются различные форматы геометрии, EsriShape рекомендуется для передачи геометрии без потерь и с максимальной производительностью. Поле Object ID в настоящее время не используется инструментами геообработки и является необязательным. Если в таблице Arrow нет поля Object ID, поле Object ID будет создано автоматически во время геообработки. Чтобы просмотреть текущую схему таблицы Arrow, используйте свойство schema таблицы.

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

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

import arcpy
import pyarrow as pa

# Get spatial reference
sr = arcpy.SpatialReference(3857)  #WGS 1984 Web Mercator (auxiliary sphere)

# Specify fields for schema
fields = [
    pa.field('OBJECTID', pa.int64(), metadata={'esri.oid': 'esri.in64'}),
    pa.field("SHAPE", pa.string(), metadata={'esri.encoding': 'WKT', 'esri.sr_wkt': sr.exportToString()}),
    pa.field('NAME', pa.string()),
    pa.field('STATE', pa.string()),
    pa.field('POP2010', pa.int32()),
]
# Specify data (smallest and largest major US city)
arrays = [
    pa.array([1, 2]),
    pa.array([
        'POINT (-8238770.1834999993 4969744.1656000018)', 
        'POINT (-8078649.3640999999 5506675.5481000021)',
    ]),
    pa.array(['New York City', 'Montpelier']),
    pa.array(['NY', 'VT']),
    pa.array([8175133,  7855]),
]

# Create Arrow table from data and schema
patable = pa.Table.from_arrays(
    arrays=arrays,
    schema=pa.schema(fields)
)

# Convert Arrow table to geodatabase table
cities = arcpy.management.CopyRows(
    patable, r'C:\data\usa.gdb\smallest_largest_city')

Конвертация типов

При преобразовании таблицы или класса пространственных объектов в таблицу Arrow с помощью функции TableToArrowTable типы данных в столбцах созданной таблицы Arrow (объекты pyarrow.ChunkedArray) определяются по типам полей входной таблицы или входного класса объектов.

Тип поляТип данных PyArrowМетаданные

Short

int16

Long

int32

Float

float

Double

double

Текст

string

Дата

date64

Object ID

int64

{b'esri.oid': b'esri.in64'}

Геометрия

binary

{b'esri.encoding': b'EsriShape', b'esri.sr_wkt: b'<Spatial Reference WKT (string)>'}

Поля других типов, не перечисленные выше, включая поля растра и BLOB, не конвертируются и будут удалены.

Примечание:

Текстовые поля обрезаются до 5000 символов при преобразовании в таблицу Arrow.

При преобразовании таблицы Arrow в таблицу или класс объектов с помощью инструмента геообработки типы полей выходной таблицы или класса объектов определяются типами данных столбцов входной таблицы Arrow. Поле Object ID будет автоматически добавлено в выходную таблицу или класс объектов.

Тип данных PyArrowМетаданныеТип поля

bool

Short

int8

Short

int16

Short

int32

Long

int64

Double

uint8

Short

uint16

Long

uint32

Double

uint64

Double

float32

Float

float64

Double

string

Текст

utf8

Текст

date32

Дата

date64

Дата

int64

b'esri.oid': b'esri.in64'

Object ID

binary

{'esri.encoding': <b'EsriShape' or b'WKB'>, b'esri.sr_wkt: b'<Spatial Reference WKT>'}

Геометрия

string

{'esri.encoding': <b'EsriJSON', b'GeoJSON', or b'WKT'>, b'esri.sr_wkt: b'<Spatial Reference WKT>'}

Геометрия

Все типы данных Arrow, не перечисленные выше, не будут преобразованы и будут удалены.