Вопрос или проблема
После редактирования дорожной сети в QGIS для добавления недостающих дорог и их привязки к существующим маршрутам, R не распознает эти дополнения для маршрутизации. В QGIS мои редактирования маршрутизируются правильно с помощью инструмента Кратчайший путь, но сохранение в виде ESRI shapefile или GPKG и импорт в R не сохраняет связность.
У меня есть дорожная сеть (https://ecat.ga.gov.au/geonetwork/srv/eng/catalog.search#/metadata/64058) в виде shapefile. Я хочу использовать ее для решения задачи маршрутизации TSP. Однако в ней не хватает некоторых дорог, которые мне нужны для доступа к некоторым интересным местам, поэтому я добавил больше дорог, следуя этому методу:
- импортировать дорожный shapefile в QGIS
- в слое дорог я добавил новые дороги с помощью инструмента Добавить линейный объект
- я использовал Привязать геометрии к слою с допустимой ошибкой 50 м, предпочитая ближайшую точку, вставлял дополнительные вершины, где это необходимо
- Исправить геометрии
- Удалить нулевые геометрии
- Разделить линиями
В результате слой выглядит так, как я ожидал. Когда я использую Кратчайший путь (от точки до точки), он может проложить маршрут к моим интересным местам вдоль новых дорог:
фрагмент кратчайшего маршрута к проблемной точке вдоль новых дорог
Однако, когда я сохраняю его как ESRI shapefile или GPKG, а затем импортирую в R, он все равно неправильно маршрутизирует через новые дороги, используя st_network_cost
или st_network_paths
:
маршрут, созданный в R, не ведет к целевой точке
Я сделал воспроизводимый пример своей проблемы в R здесь: https://github.com/eilishmcmaster/netowork_problem
Какова причина этой проблемы в R и как мне заставить его учитывать новые дороги?
Я пытался соединить близлежащие несоединенные узлы в R (создать новые границы между несоединенными узлами на расстоянии менее 10 м), но это не помогло.
Буду признателен за любую помощь, я все еще новичок в работе с геопространственными данными.
Ответ или решение
Проблема с маршрутизацией в геопространственном анализе может быть достаточно сложной, особенно в ситуации, когда данные из одной программы не интегрируются должным образом в другую. В вашем случае существует ряд возможных причин, по которым функция st_network_cost
в R не распознает изменения, сделанные в QGIS, даже если визуально все выглядит корректно. Давайте рассмотрим возможные решения.
Анализ проблемы
-
Проверка на наличие геометрических ошибок: Несмотря на то, что вы использовали инструменты QGIS, такие как "Fix Geometries" и "Remove Null Geometries", убедитесь, что в конечном слое нет оставшихся геометрических ошибок. Используйте инструмент "Check Geometries" для выявления возможных проблем.
-
Конвертация форматов: Шейп-файлы и GPKG имеют свои особенности. Если вы сохраняете данные в формате ESRI Shapefile, помните о том, что этот формат ограничен определенной длиной имени поля и поддерживает лишь некоторое количество типов геометрий. Рекомендуется использовать формат GPKG, который более удобен для сложных данных.
-
Векторные связи и топология: Проверьте, правильно ли установлены связи между вершинами (нодами). В R функция
st_network_cost
опирается на корректное определение узлов и связей (ребер) в сети. В QGIS у вас могло произойти неявное создание связей через инструменты, а в R нужно явно указывать их.
Решения и рекомендации
-
Экспорт структуры данных: Перед экспортом из QGIS убедитесь, что атрибуты, отвечающие за идентификацию узлов и рёбер, корректно указаны. Вы можете добавить идентификаторы для новых объектов.
-
Использование пакетов R: Убедитесь, что вы используете правильные функции для работы с сетью — пакеты
sf
иstplanr
могут предложить полезные инструменты для маршрутизации и работы с сетевыми данными. Проверьте, правильно ли заданы параметры в ваших функциях, например, вst_as_sf
перед имплементациейst_network_cost
. -
Топологическая проверка: Возможно, стоит проверить топологию сети с помощью функции
st_is_valid
, чтобы убедиться в правильности структуры данных. Если данные показывают ненормальные значения, используйтеst_make_valid
, чтобы исправить это. -
Документация и примеры: Поскольку вы упомянули, что у вас есть репозиторий с воспроизводимым примером, убедитесь, что в вашем коде точно указаны все параметры и проверьте все вызовы, связанные с
st_network_cost
иst_network_paths
. Лучше всего задать базовые примеры, чтобы изолировать проблему. -
Обработка узлов: Если вы уже пытались соединить близкие узлы, возможно, следует использовать функцию
st_snap
для лучшей интеграции новых и старых рёбер.
Заключение
Проблема, с которой вы столкнулись, часто бывает результатом несовместимости между инструментами для работы с геоданными. Следуя вышеописанным рекомендациям и уделяя внимание деталям, вы сможете устранить проблему с маршрутизацией. Напоминаем, что документация и активное сообщество, например, на GitHub, могут помочь вам в поиске специфичных решений.
Если у вас есть дополнительные вопросы или необходима помощь в конкретной части кода, пожалуйста, дайте знать!