Size: a a a

OpenStreetMap Беларусь

2020 April 06

AC

Arkadi Chubrik in OpenStreetMap Беларусь
LLlypuk82
Приветствую, Аркадий. А можете вкратце рассказать о новых возможностях, получаемых благодаря вашей утилите? Чтобы более-менее понятно для «неискушённого» в программировании и обработке данных (скажем, для человека, который хочет сконвертировать себе карту для навигатора и т. п.)
Сейчас попробую... )
источник

AC

Arkadi Chubrik in OpenStreetMap Беларусь
Приветствую всех!

Хочу рассказать вам о моей утилите на C# — https://github.com/chubrik/OsmDataKit
Она была создана во время работы над проектами https://toponim.by/ и https://toponym.org/
Основное назначение утилиты в том, чтобы из базы OSM-PBF делать выборки объектов по спискам ID или по фильтрам, а в ответ получать не плоский набор данных, а полные древовидные структуры со всеми вложенными объектами.

Простой пример из жизни.
Мне нужно отрисовать идеальный контур границы Беларуси на сайте. Для этого нужно получить все точечные «ноды» с их координатами. Нам известен ID границы в OSM: https://www.openstreetmap.org/relation/59065 Но в базе граница страны представлена сложным образом. Это объект «отношение», состоящий из множества «путей» и других «отношений», которые в свою очередь состоят из таких же сущностей и т. д. В сумме мы имеем 7-кратную вложенность объектов, описывающих границу Беларуси. Моя утилита позволяет одним простым запросом получить сразу всю полную объектную модель. Достаточно «натравить» её на единственный ID. Выглядит это так:

var border = OsmService.LoadCompleteObjects(
       pathToPbf, new GeoRequest(null, null, 59065));

Более сложный пример из жизни.
Нужно получить все населённые пункты. Запрос может быть долгий, поэтому я могу его прокешировать в файл, чтобы в дальнейшем легко отлаживать проектный код без повторных ожиданий:

var populated = OsmService.LoadCompleteObjects(
       pathToPbf,
       cacheName: "populated",
       i => ((i.Tags.ContainsKey("place") &&
                 !i.Tags.Contains("place", "locality")) ||
                 i.Tags.ContainsKey("old_place") ||
                 i.Tags.ContainsKey("abandoned:place") ||
                 i.Tags.Contains("landuse", "residential")) &&
                 GeoHelper.TitleRu(i) != null);

Существует официальная утилита OsmSharp — https://github.com/OsmSharp/core и неё режим CompleteStream, у которого заявлен похожий функционал. Но есть непреодолимые проблемы, делающие использование официальной утилиты невозможным:
• Даже при работе с одной страной запросто забьётся вся ваша оперативка. А если нужен весь мир?
• Малейшее нарушение целостности базы — крэш, и вы ничего не получите. А мелкие нарушения целостности неизбежно присутствуют.
• Построение запроса очень сложное, нужно продумать и отфильтровать все элементы, которые ПОТЕНЦИАЛЬНО могут оказаться в результирующем объекте. Любая ваша ошибка — крэш.

Преимущества моей утилиты:
• Экономия оперативки. Даже если вы работаете с целыми континентами, это не проблема.
• Устойчивость к нарушению целостности базы. Если у гео-объекта потерялась «нода», вы всё равно получите полноценные данные, с которыми можно работать.
• Высокоуровневые запросы. Утилита сама разбирается, как ей достать все необходимые части того, что вы просите.
• Возможность кеширования запросов. Достаточно придумать запросу какое-то имя.
источник

M

Maksibon🇺🇦 in OpenStreetMap Беларусь
Тут есть человек с ником "Asumarin" на OSM?
источник

AC

Arkadi Chubrik in OpenStreetMap Беларусь
источник

NM

Notna M in OpenStreetMap Беларусь
Maksibon🇺🇦
Тут есть человек с ником "Asumarin" на OSM?
@akudelka ваш коллега
источник

АК

Алексей Куделька in OpenStreetMap Беларусь
Наш сотрудник, расскажите в чем проблема
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
Arkadi Chubrik
Приветствую всех!

Хочу рассказать вам о моей утилите на C# — https://github.com/chubrik/OsmDataKit
Она была создана во время работы над проектами https://toponim.by/ и https://toponym.org/
Основное назначение утилиты в том, чтобы из базы OSM-PBF делать выборки объектов по спискам ID или по фильтрам, а в ответ получать не плоский набор данных, а полные древовидные структуры со всеми вложенными объектами.

Простой пример из жизни.
Мне нужно отрисовать идеальный контур границы Беларуси на сайте. Для этого нужно получить все точечные «ноды» с их координатами. Нам известен ID границы в OSM: https://www.openstreetmap.org/relation/59065 Но в базе граница страны представлена сложным образом. Это объект «отношение», состоящий из множества «путей» и других «отношений», которые в свою очередь состоят из таких же сущностей и т. д. В сумме мы имеем 7-кратную вложенность объектов, описывающих границу Беларуси. Моя утилита позволяет одним простым запросом получить сразу всю полную объектную модель. Достаточно «натравить» её на единственный ID. Выглядит это так:

var border = OsmService.LoadCompleteObjects(
       pathToPbf, new GeoRequest(null, null, 59065));

Более сложный пример из жизни.
Нужно получить все населённые пункты. Запрос может быть долгий, поэтому я могу его прокешировать в файл, чтобы в дальнейшем легко отлаживать проектный код без повторных ожиданий:

var populated = OsmService.LoadCompleteObjects(
       pathToPbf,
       cacheName: "populated",
       i => ((i.Tags.ContainsKey("place") &&
                 !i.Tags.Contains("place", "locality")) ||
                 i.Tags.ContainsKey("old_place") ||
                 i.Tags.ContainsKey("abandoned:place") ||
                 i.Tags.Contains("landuse", "residential")) &&
                 GeoHelper.TitleRu(i) != null);

Существует официальная утилита OsmSharp — https://github.com/OsmSharp/core и неё режим CompleteStream, у которого заявлен похожий функционал. Но есть непреодолимые проблемы, делающие использование официальной утилиты невозможным:
• Даже при работе с одной страной запросто забьётся вся ваша оперативка. А если нужен весь мир?
• Малейшее нарушение целостности базы — крэш, и вы ничего не получите. А мелкие нарушения целостности неизбежно присутствуют.
• Построение запроса очень сложное, нужно продумать и отфильтровать все элементы, которые ПОТЕНЦИАЛЬНО могут оказаться в результирующем объекте. Любая ваша ошибка — крэш.

Преимущества моей утилиты:
• Экономия оперативки. Даже если вы работаете с целыми континентами, это не проблема.
• Устойчивость к нарушению целостности базы. Если у гео-объекта потерялась «нода», вы всё равно получите полноценные данные, с которыми можно работать.
• Высокоуровневые запросы. Утилита сама разбирается, как ей достать все необходимые части того, что вы просите.
• Возможность кеширования запросов. Достаточно придумать запросу какое-то имя.
Выглядит как библиотека для C#. Для tool надо бы человеческий интерфейс.
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
В смысле UI.
источник

L

LLlypuk82 in OpenStreetMap Беларусь
Arkadi Chubrik
Приветствую всех!

Хочу рассказать вам о моей утилите на C# — https://github.com/chubrik/OsmDataKit
Она была создана во время работы над проектами https://toponim.by/ и https://toponym.org/
Основное назначение утилиты в том, чтобы из базы OSM-PBF делать выборки объектов по спискам ID или по фильтрам, а в ответ получать не плоский набор данных, а полные древовидные структуры со всеми вложенными объектами.

Простой пример из жизни.
Мне нужно отрисовать идеальный контур границы Беларуси на сайте. Для этого нужно получить все точечные «ноды» с их координатами. Нам известен ID границы в OSM: https://www.openstreetmap.org/relation/59065 Но в базе граница страны представлена сложным образом. Это объект «отношение», состоящий из множества «путей» и других «отношений», которые в свою очередь состоят из таких же сущностей и т. д. В сумме мы имеем 7-кратную вложенность объектов, описывающих границу Беларуси. Моя утилита позволяет одним простым запросом получить сразу всю полную объектную модель. Достаточно «натравить» её на единственный ID. Выглядит это так:

var border = OsmService.LoadCompleteObjects(
       pathToPbf, new GeoRequest(null, null, 59065));

Более сложный пример из жизни.
Нужно получить все населённые пункты. Запрос может быть долгий, поэтому я могу его прокешировать в файл, чтобы в дальнейшем легко отлаживать проектный код без повторных ожиданий:

var populated = OsmService.LoadCompleteObjects(
       pathToPbf,
       cacheName: "populated",
       i => ((i.Tags.ContainsKey("place") &&
                 !i.Tags.Contains("place", "locality")) ||
                 i.Tags.ContainsKey("old_place") ||
                 i.Tags.ContainsKey("abandoned:place") ||
                 i.Tags.Contains("landuse", "residential")) &&
                 GeoHelper.TitleRu(i) != null);

Существует официальная утилита OsmSharp — https://github.com/OsmSharp/core и неё режим CompleteStream, у которого заявлен похожий функционал. Но есть непреодолимые проблемы, делающие использование официальной утилиты невозможным:
• Даже при работе с одной страной запросто забьётся вся ваша оперативка. А если нужен весь мир?
• Малейшее нарушение целостности базы — крэш, и вы ничего не получите. А мелкие нарушения целостности неизбежно присутствуют.
• Построение запроса очень сложное, нужно продумать и отфильтровать все элементы, которые ПОТЕНЦИАЛЬНО могут оказаться в результирующем объекте. Любая ваша ошибка — крэш.

Преимущества моей утилиты:
• Экономия оперативки. Даже если вы работаете с целыми континентами, это не проблема.
• Устойчивость к нарушению целостности базы. Если у гео-объекта потерялась «нода», вы всё равно получите полноценные данные, с которыми можно работать.
• Высокоуровневые запросы. Утилита сама разбирается, как ей достать все необходимые части того, что вы просите.
• Возможность кеширования запросов. Достаточно придумать запросу какое-то имя.
Глянул https://toponim.by/ , попробовал «-лес». Почему-то в выборку не попал ни один из трёх навскидку припомненных мною леса, оформленных как place=locality 🧐
источник

АК

Алексей Куделька in OpenStreetMap Беларусь
Maksibon🇺🇦
Тут есть человек с ником "Asumarin" на OSM?
Подскажите что случилось
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
У меня знакомый долго искал, чем надёжно из OSM в Блендер можно объекты экпортировать. Был один инструмент, но странный.
источник

AC

Arkadi Chubrik in OpenStreetMap Беларусь
Anatoli Babenia
Выглядит как библиотека для C#. Для tool надо бы человеческий интерфейс.
Можете это пояснить? Что значит «для tool» и какой должен быть интерфейс.
источник

NM

Notna M in OpenStreetMap Беларусь
Anatoli Babenia
У меня знакомый долго искал, чем надёжно из OSM в Блендер можно объекты экпортировать. Был один инструмент, но странный.
Для блендера вроде плагин недавно релизнули?
источник

M

Maksibon🇺🇦 in OpenStreetMap Беларусь
Алексей Куделька
Наш сотрудник, расскажите в чем проблема
Сотрудник в Рокетдата?
Если так, то все нормально.
Интересовал вопрос с доставкой gipermall на картах osm, но он решился.
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
Notna M
Для блендера вроде плагин недавно релизнули?
А недавно - это сколько?
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
Arkadi Chubrik
Можете это пояснить? Что значит «для tool» и какой должен быть интерфейс.
Ну, мне лично хотелось бы из командной строки получать административные контуры РБ.
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
Ещё есть идея по мониторингу состояния баскетбольных площадок в Минске. Это тоже CI/CD, но кроме экспорта информации из OSM, надо ещё уметь хранить историческую информацию по этом площадкам.
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
Я, честно, не помню уже, когда их доставал, в каком виде информация хранилась. По-моему был полигон с меткой, но возможно была точка.
источник

AC

Arkadi Chubrik in OpenStreetMap Беларусь
Anatoli Babenia
Ну, мне лично хотелось бы из командной строки получать административные контуры РБ.
Т. е. к моей утилите вам ещё хочется видеть CLI-пакет? Надо подумать, командная строка же сильно ограничена, и вы не сможете в ней выразить сложный фильтр в запросе, как в моём втором примере кода.
источник

AB

Anatoli Babenia in OpenStreetMap Беларусь
Arkadi Chubrik
Т. е. к моей утилите вам ещё хочется видеть CLI-пакет? Надо подумать, командная строка же сильно ограничена, и вы не сможете в ней выразить сложный фильтр в запросе, как в моём втором примере кода.
Не факт, что мне это поможет. Я пока другим занимаюсь. Просто для меня есть принципиальная разница между утилитой и библиотекой. Утилиту я могу пощупать без знаний языка, а библиотека полезна только программистам.
источник