Присоединить события (Location Referencing)

Доступно с лицензией Location Referencing.

Краткая информация

Присоединяет записи событий из таблицы, слоя или класса объектов к имеющемуся классу объектов событий LRS.

Примечание:

Если целевым слоем является слой сервиса объектов, результаты проверки записываются в файл в директории ArcGIS Server. По умолчанию этот файл автоматически очищается через 10 минут, этого может быть недостаточно для обработки всех проверок и их записи в рабочую станцию, запускающую ArcGIS Pro. При больших загрузках данных рекомендуется настроить параметр максимальный возраст файла как минимум на 1 час. Вы можете отредактировать серверную директорию в ArcGIS Server Manager, чтобы настроить этот параметр.

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

  • Для запуска инструмента необходим набор данных LRS.

  • Значение параметра Входное событие может быть таблицей, слоем или классом объектов.

  • Значение параметра Целевое событие должно быть слоем или классом объектов, зарегистрированным с LRS.

  • Наборы выборки и определяющие запросы для значения параметра Целевое событие будут игнорироваться.

  • Этот инструмент поддерживает точечные и линейные объекты. Тип объекта в параметрах Входное событие и Целевое событие должен совпадать.

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

    • Если записи Входных событий содержат пустые поля RouteID и заполненные поля RouteName, события могут быть добавлены с помощью поля RouteName. RouteID затем автоматически генерируются поля для этих добавленных событий.
    • Если записи Входных событий имеют заполненные поля RouteID и RouteName, события будут добавлены с помощью поля RouteID.
  • Сопоставление полей FromDate и ToDate не является обязательным для параметра Тип загрузки опции Добавить. Поддерживаются следующие сценарии:

    • Если поля FromDate и ToDate не сопоставлены, добавленное событие будет иметь такую же дату начала, как и у активного временного среза маршрута, а дата окончания будет иметь значение null.
    • Если поле FromDate сопоставлено, а поле ToDate не сопоставлено, добавленное событие будет иметь значение null для даты окончания.
    • Если поле FromDate не сопоставлено, а поле ToDate сопоставлено, инструмент вернет ошибку.
    • Для связанных линейных событий инструмент сначала определяет самый последний временной срез по всем маршрутам, имеющим один и тот же идентификатор линии. Затем дата начала последнего временного среза маршрута будет назначена в качестве даты начала добавленного события, а дата окончания будет иметь значение null.
    Примечание:

    Если вы не сопоставляете поле ToDate или оба поля FromDate и ToDate, то это поле или поля необходимо удалить из списка полей в параметре Список полей.

  • Если параметр Построить GUID идентификаторов загруженных событий отмечен, либо не сопоставляйте поле EventID в параметре Сопоставить поле, либо убедитесь, что в поле EventID входных событий находятся значения null. Если поле EventID в исходной записи события заполнено, а параметр Построить GUID идентификаторов загруженных событий включен, значение в поле EventID записи исходного события будет загружено в целевое событие.

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

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

  • Этот инструмент поддерживает предотвращение конфликтов и будет пытаться получать и передавать блокировки.

  • Когда включено предотвращение конфликтов, поддерживаются следующие функции:

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

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

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

  • Калибровка маршрута на маршрутах с реальными промежутками влияет на присоединенные события следующими способами:

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

  • Вы можете использовать файл .csv в формате ASCII для присоединения событий, когда он используется вместе с файлом инициализации (schema.ini), который задает разделенные запятыми поля в файле .csv. Схема файла инициализации должна содержать следующее:

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

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

    schema.ini
    
    [source_events.csv]
    Format=CSVDelimited
    ColNameHeader=True
    Col1=FromDate Date
    Col2=ToDate Date
    Col3=RouteID Text width 255
    Col4=RouteName Text width 255
    Col5=FromMeasure Double
    Col6=ToMeasure Double
    Col7=RdType Long
    Col8=EventID Text width 50

    Дополнительные сведения о добавлении таблицы ASCII или таблицы в текстовом файле

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

    Параметр Создать формы больше не поддерживается.

Параметры

ПодписьОписаниеТип данных
Входное событие

Исходные записи событий для присоединения.

Table View
Целевое событие

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

Feature Layer
Список полей

Управляет тем, как атрибутивная информация в полях входного события будет переноситься в целевое событие.

Поскольку записи исходных событий будут добавляться к существующему целевому событию, у которого есть предопределенная схема (определения полей), добавление или удаление полей из целевого события невозможно. Хотя вы можете задать правила слияния для каждого выходного поля, инструмент игнорирует эти правила.

Field Mappings
Тип загрузки
(Дополнительный)

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

  • ДобавитьЗаписи исходных событий будут присоединены к указанному целевому событию.
  • Исключить перекрытияЗаписи исходных событий будут присоединены к указанному целевому событию, а любые записи, которые имеют то же измерение или временные перекрытия, что и присоединенные события, станут устаревшими. Если присоединенное событие закрывает указанную запись целевого события, целевая запись события будет удалена. Используйте эту опцию только для линейных событий.
  • Исключить по ID события.Записи исходных событий будут присоединены к указанному целевому событию, а любые записи, которые имеют такие же ID события и временные перекрытия, что и присоединенные события, станут устаревшими. Если присоединенное событие закрывает целевую запись события с таким же ID события, целевая запись события будет удалена.
  • Заменить по ID событияЗаписи исходных событий будут присоединены к указанному целевому событию, а любые записи, которые имеют тот же ID события, что и присоединенные события, будут заменены.
String
Построить GUID идентификаторов загруженных событий
(Дополнительный)

Определяет, будут ли генерироваться ID событий для присоединяемых записей исходных событий. Генерация ID событий будет применяться только к записям исходных событий со значением null в поле Event ID.

  • Отмечено - Для присоединяемых записей исходных событий будут генерироваться ID событий.
  • Не отмечено - Для присоединяемых записей исходных событий ID событий генерироваться не будут. Это значение по умолчанию
Boolean
Создать формы
(Дополнительный)
Примечание:

Этот параметр более не поддерживается.

Boolean
Присоединить события к доминирующим маршрутам
(Дополнительный)

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

  • Отмечено - исходные записи событий будут присоединяться к доминирующим маршрутам.
  • Не отмечено - исходные записи событий будут присоединяться к маршрутам, заданным во входном наборе данных, независимо от доминирования маршрутов. Это значение по умолчанию

Этот параметр работает со всеми опциями Тип загрузки: Добавить, Исключить наложения, Исключить событие по ID и Заменить событие по ID.

Boolean
Присоединить даже при наличии блокировок предотвращения конфликтов
(Дополнительный)

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

  • Отмечено — События будут добавлены даже при наличии блокировок предотвращения конфликтов.
  • Не отмечено — События не будут добавлены при наличии блокировок предотвращения конфликтов. Это значение по умолчанию

Этот параметр доступен только в том случае, если в наборе данных LRS включено предотвращение конфликтов.

Внимание:

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

Boolean

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

ПодписьОписаниеТип данных
Выходное целевое событие

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

Feature Layer
Выходной файл результатов

Текстовый файл, в котором подробно описаны изменения, внесенные инструментом.

Text File

arcpy.locref.AppendEvents(in_dataset, in_target_event, field_mapping, {load_type}, {generate_event_ids}, {generate_shapes}, {append_to_dominant_route}, {bypass_conflict_prevention})
ИмяОписаниеТип данных
in_dataset

Исходные записи событий для присоединения.

Table View
in_target_event

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

Feature Layer
field_mapping

Управляет тем, как атрибутивная информация в полях входного события будет переноситься в целевое событие.

Поскольку записи исходных событий будут добавляться к существующему целевому событию, у которого есть предопределенная схема (определения полей), добавление или удаление полей из целевого события невозможно. Хотя вы можете задать правила слияния для каждого выходного поля, инструмент игнорирует эти правила.

Для задания этого параметра можно использовать класс FieldMappings.

Field Mappings
load_type
(Дополнительный)

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

  • ADDЗаписи исходных событий будут присоединены к указанному целевому событию.
  • RETIRE_OVERLAPSЗаписи исходных событий будут присоединены к указанному целевому событию, а любые записи, которые имеют то же измерение или временные перекрытия, что и присоединенные события, станут устаревшими. Если присоединенное событие закрывает указанную запись целевого события, целевая запись события будет удалена. Используйте эту опцию только для линейных событий.
  • RETIRE_BY_EVENT_IDЗаписи исходных событий будут присоединены к указанному целевому событию, а любые записи, которые имеют такие же ID события и временные перекрытия, что и присоединенные события, станут устаревшими. Если присоединенное событие закрывает целевую запись события с таким же ID события, целевая запись события будет удалена.
  • REPLACE_BY_EVENT_IDЗаписи исходных событий будут присоединены к указанному целевому событию, а любые записи, которые имеют тот же ID события, что и присоединенные события, будут заменены.
String
generate_event_ids
(Дополнительный)

Определяет, будут ли генерироваться ID событий для присоединяемых записей исходных событий. Генерация ID событий будет применяться только к записям исходных событий со значением null в поле Event ID.

  • GENERATE_EVENT_IDSID событий для присоединяемых записей исходных событий будут генерироваться.
  • NO_GENERATE_EVENT_IDSID событий для присоединяемых записей исходных событий генерироваться не будут. Это значение по умолчанию
Boolean
generate_shapes
(Дополнительный)
Примечание:

Этот параметр более не поддерживается.

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

Задает, будут ли записи in_dataset добавляться к доминирующим маршрутам, если существует конкуренция маршрутов.

  • APPEND_TO_DOMINANT_ROUTEИсходные записи событий будут присоединяться к доминирующим маршрутам.
  • NO_APPEND_TO_DOMINANT_ROUTEИсходные записи событий будут присоединяться к маршрутам, заданным во входном наборе данных, независимо от доминирования маршрутов. Это значение по умолчанию

Этот параметр работает со всеми опциями load_type: ADD, RETIRE_OVERLAPS, RETIRE_BY_EVENT_ID и REPLACE_BY_EVENT_ID.

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

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

  • BYPASS_CONFLICT_PREVENTIONСобытия будут добавлены даже при наличии блокировок предотвращения конфликтов.
  • NO_BYPASS_CONFLICT_PREVENTIONСобытия не будут добавлены при наличии блокировок предотвращения конфликтов. Это значение по умолчанию

Этот параметр доступен только в том случае, если в наборе данных LRS включено предотвращение конфликтов.

Внимание:

Обход блокировок предотвращения конфликтов может привести к повреждению данных или неожиданному поведению. Подумайте о возможных последствиях и создайте резервную копию базы данных перед запуском инструмента с этим параметром с заданной опцией BYPASS_CONFLICT_PREVENTION.

Boolean

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

ИмяОписаниеТип данных
out_target_event

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

Feature Layer
out_details_file

Текстовый файл, в котором подробно описаны изменения, внесенные инструментом.

Text File

Пример кода

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

Демонстрирует использование функции AppendEvents в окне Python для присоединения записей событий в существующий класс объектов событий.

# Name: AppendEvents_ex1_pro.py
# Description: Append event records into an existing Location Referencing event feature class.
# Requires: ArcGIS Location Referencing

# Set current workspace
arcpy.env.workspace= r"C:\Pipeline.gdb"

# Set tool variables
# Source Event Table in fgdb
in_dataset = "PTMS_Add"

# Target Event Feature Class in fgdb
in_target_event = "LRSE_PTMS"

#Map fields between target and source
field_mapping = r'AADT "AADT" true true false 4 Long 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,AADT,-1,-1;YEAR_ "YEAR_" true true false 2 Short 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,YEAR_,-1,-1;Cosite "Cosite" true true false 6 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Cosite,0,6;Classd "Classd" true true false 3 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Classd,0,3;SECTION_ "SECTION_" true true false 8 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,SECTION_,0,8;COMM "COMM" true true false 254 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,COMM,0,254;Active "Active" true true false 1 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Active,0,1;Sitetype "Sitetype" true true false 11 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Sitetype,0,11;KFCTR "KFCTR" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,KFCTR,-1,-1;DFCTR "DFCTR" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,DFCTR,-1,-1;TFCTR "TFCTR" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,TFCTR,-1,-1;LOCATION "LOCATION" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,LOCATION,-1,-1;FromDate "FromDate" true true false 8 Date 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,FromDate,-1,-1;ToDate "ToDate" true true false 8 Date 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,ToDate,-1,-1;EventID "EventID" true true false 50 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,EventID,0,50;RouteName "RouteName" true true false 255 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,RouteName,0,255'
load_type = "ADD"
generate_event_ids = "NO_GENERATE_EVENT_IDS"
generate_shapes = "GENERATE_SHAPES"
append_to_dominant_route = "NO_APPEND_TO_DOMINANT_ROUTE"
bypass_conflict_prevention = "NO_BYPASS_CONFLICT_PREVENTION" 

# Execute the tool
arcpy.locref.AppendEvents(in_dataset, in_target_event, field_mapping, load_type, generate_event_ids, None, append_to_dominant_route, bypass_conflict_prevention)
AppendEvents, пример 2 (автономный скрипт)

Демонстрирует использование функции AppendEvents в отдельном скрипте Python для присоединения записей событий в существующий класс объектов событий. События добавляются к доминирующим маршрутам.

# Name: AppendEvents_StandAlonePython_Example.py
# Description: Append event records into an existing event feature class.
# Requires: ArcGIS Location Referencing

# Import arcpy module
import arcpy

# Check out license
arcpy.CheckOutExtension("LocationReferencing")

# Set tool variables
# Source Event Table in fgdb
in_dataset = r"C:\Pipeline.gdb\LRS\PTMS_Add"

# Target Event Feature Class in fgdb
in_target_event = r"C:\Pipeline.gdb\LRS\LRSE_PTMS"

#Map fields between target and source
field_mapping = r"AADT \"AADT\" true true false 4 Long 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,AADT,-1,-1;YEAR_ \"YEAR_\" true true false 2 Short 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,YEAR_,-1,-1;Cosite \"Cosite\" true true false 6 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Cosite,0,6;Classd \"Classd\" true true false 3 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Classd,0,3;SECTION_ \"SECTION_\" true true false 8 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,SECTION_,0,8;COMM \"COMM\" true true false 254 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,COMM,0,254;Active \"Active\" true true false 1 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Active,0,1;Sitetype \"Sitetype\" true true false 11 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,Sitetype,0,11;KFCTR \"KFCTR\" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,KFCTR,-1,-1;DFCTR \"DFCTR\" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,DFCTR,-1,-1;TFCTR \"TFCTR\" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,TFCTR,-1,-1;LOCATION \"LOCATION\" true true false 8 Double 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,LOCATION,-1,-1;FromDate \"FromDate\" true true false 8 Date 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,FromDate,-1,-1;ToDate \"ToDate\" true true false 8 Date 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,ToDate,-1,-1;EventID \"EventID\" true true false 50 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,EventID,0,50;RouteName \"RouteName\" true true false 255 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,RouteName,0,255"
load_type = "REPLACE_BY_EVENT_ID"
generate_event_ids = "NO_GENERATE_EVENT_IDS"
generate_shapes = "GENERATE_SHAPES"
append_to_dominant_route = "APPEND_TO_DOMINANT_ROUTE"
bypass_conflict_prevention = "NO_BYPASS_CONFLICT_PREVENTION"

# Execute the tool
arcpy.locref.AppendEvents(in_dataset, in_target_event, field_mapping, load_type, generate_event_ids, None, append_to_dominant_route, bypass_conflict_prevention)

# Check in license
arcpy.CheckInExtension("LocationReferencing")
AppendEvents, пример 3 (автономный скрипт)

Демонстрирует использование функции AppendEvents в отдельном скрипте Python для присоединения записей событий к сервису объектов.

# Name: AppendEvents_Pro_Ex3.py
# Description: Append events using a feature service. It is recommended to work in a version and post to the default version.
# Requires: ArcGIS Location Referencing

# Import arcpy module
import arcpy

# Check out license
arcpy.CheckOutExtension("LocationReferencing")

# Set tool variables
in_dataset = r"C:\LocationReferencing\LR.gdb\LRS\LineEvent"
field_mapping = r'FROMDATE "From Date" true true false 8 Date 0 0,First,#,C:\LocationReferencing\LR.gdb\LRS\LineEvent,FROMDATE,-1,-1;TODATE "To Date" true true false 8 Date 0 0,First,#,C:\LocationReferencing\LR.gdb\LRS\LineEvent,TODATE,-1,-1;EVENTID "Event ID" true true false 50 Text 0 0,First,#,C:\LocationReferencing\LR.gdb\LRS\LineEvent,EVENTID,0,50;ROUTEID "Route ID" true true false 255 Text 0 0,First,#,C:\LocationReferencing\LR.gdb\LRS\LineEvent,ROUTEID,0,255;RouteName "RouteName" true true false 255 Text 0 0,First,#,C:\Pipeline.gdb\LRS\PTMS_Add,RouteName,0,255;FROMMEASURE "From Measure" true true false 0 Double 0 0,First,#,C:\LocationReferencing\LR.gdb\LRS\LineEvent,FROMMEASURE,-1,-1;TOMEASURE "To Measure" true true false 0 Double 0 0,First,#,C:\LocationReferencing\LR.gdb\LRS\LineEvent,TOMEASURE,-1,-1'
load_type = "ADD"
generate_event_ids = "NO_GENERATE_EVENT_IDS"
generate_shapes = "GENERATE_SHAPES"
append_to_dominant_route = "NO_APPEND_TO_DOMINANT_ROUTE"
bypass_conflict_prevention = "NO_BYPASS_CONFLICT_PREVENTION"

# Target event is in a feature service. Sign in to portal is required to access the feature service. 
arcpy.SignInToPortal('https://yourdomain.com/portal', 'username', 'password')

# Map the target event from the feature service. In the feature service, 34 corresponds to the target event.
in_target_event = r"https://yourdomain.com/server/rest/services/FeatureServiceName/FeatureServer/34"

# Execute the tool
arcpy.locref.AppendEvents(in_dataset, in_target_event, field_mapping, load_type, generate_event_ids, None, append_to_dominant_route, bypass_conflict_prevention)

# Check in license
arcpy.CheckInExtension("LocationReferencing")

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

  • Basic: Обязательно ArcGIS Location Referencing (ArcGIS Pipeline Referencing или ArcGIS Roads and Highways)
  • Standard: Обязательно ArcGIS Location Referencing (ArcGIS Pipeline Referencing или ArcGIS Roads and Highways)
  • Advanced: Обязательно ArcGIS Location Referencing (ArcGIS Pipeline Referencing или ArcGIS Roads and Highways)

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