citec-spbu / city-view

0 stars 0 forks source link

Запрограммировать добавление слоя с отображаемой картой из OSM #26

Closed GeorgiySurkov closed 11 months ago

GeorgiySurkov commented 11 months ago

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

GeorgiySurkov commented 11 months ago

Лично я смог добавить карту с помощью вот этого типа источника.

Image

Можно начать пробовать запрограммировать добавление такого слоя.

WenFutao commented 11 months ago

Можете объяснить подробнее?

GeorgiySurkov commented 11 months ago

Нужно написать код на питоне, который будет добавлять слой с картой из OSM. На картинке выше я показал, как я добавил этот слой через графический интерфейс. В нашем финальном продукте нужно, чтобы эта карта добавлялась автоматически из нашего плагина. Можешь использовать питон консоль в qgis для проверки работы своего кода.

sevryukov commented 11 months ago

@GeorgiySurkov @WenFutao скорее всего эту задачу предстоит решить, но до неё было бы неплохо решить более простую (дабы получить опыт). Например, добавить в проект простой точечный слой с точкой по заранее заданным координатам. Если делать плагин (а не скрипт автоматизации), то более простой задачей будет создание простого плагина, который может ничего и не делать, но успешно регистрироваться в QGIS

GeorgiySurkov commented 11 months ago

@sevryukov, согласен, что сначала стоит сделать плагин, который будет регистрироваться в QGis и ничего не делать. А вот насчет точечного слоя не уверен. Этот слой с тайлами из OSM через gui создается элементарно. В конфигурации слоя просто вставляется шаблон ссылки, по которой получается каждый тайл. Не думаю, что из python интерфейса этот слой создается сложнее.

P.S. @WenFutao я у себя локально в настройках слоя использовал https://tile.openstreetmap.org/{z}/{x}/{y}.png. Можешь тоже попробовать с ним.

nermakovaa commented 11 months ago

@WenFutao привет! Тебе удалось решить задачу с добавлением слоя и отображением его на карту?

WenFutao commented 11 months ago

@nermakovaa написать такой скрипт по отдельности не сложно, я пытаюсь интегрировать функционал загрузки слоев карт OSM в только что созданный плагин. Если все пойдет гладко, я должен разобраться, как это сделать до сегодняшнего вечера.

nermakovaa commented 11 months ago

@WenFutao хорошо, я добавила в плагин https://github.com/webebers/city-view.git виджеты и запрос, который позволяет достать данные через overpass API (находится в test_plugin.py), однако я сталкиваюсь с проблемой отображения данных на карту в QGIS, может у тебя получится это сделать, я также пытаюсь решить эту проблему

WenFutao commented 11 months ago

@nermakovaa Я только что отправил код всего плагина, который автоматически добавляет слои плиток OSM в QGIS через плагин и отображает их на карте. Я попытался изменить код в соответствии с вашим вопросом, код выглядит следующим образом plugin.txt

WenFutao commented 11 months ago

@nermakovaa Я только что отправил код всего плагина, который автоматически добавляет слои плиток OSM в QGIS через плагин и отображает их на карте. Я попытался изменить код в соответствии с вашим вопросом, код выглядит следующим образом plugin.txt

Если моя работа не соответствует требованиям, пожалуйста, укажите мне на это, и я постараюсь исправиться как можно скорее.

nermakovaa commented 11 months ago

@nermakovaa Я только что отправил код всего плагина, который автоматически добавляет слои плиток OSM в QGIS через плагин и отображает их на карте. Я попытался изменить код в соответствии с вашим вопросом, код выглядит следующим образом plugin.txt

Если моя работа не соответствует требованиям, пожалуйста, укажите мне на это, и я постараюсь исправиться как можно скорее.

Хорошо, в ближайшее время постараюсь посмотреть и попробую у себя запустить, надеюсь, все будет работать

nermakovaa commented 11 months ago

@WenFutao у меня получилось запустить плагин локально, он добавляет карту OSM, теперь нам следует разобраться с тем как помимо карты добавить слой с какими-либо объектами (зданиями, дорогами) @GeorgiySurkov если у тебя есть идеи как обозвать эту задачу - можешь ее добавить, только мне кажется, что сперва нам необходимо куда-то данные сохранять, чтобы их потом подгружать как слой в qgis, что ты насчет этого думаешь? Я вижу такие действия: 1) создать запрос через overpass API (допустим СПБ и какой-то слой для загрузки) 2) преобразовать данные в geojson 3) сохранить их как файл в папку в том же проекте 4) забрать их из этой папки и визуализировать Можешь помочь это сделать, первые 2 пункта удалось выполнить, они лежат в репозитории, нужно разобраться с тем как их без ошибки визуализировать, либо подключить бд и в нее данные подгружать, но тут, кажется, нужно все в контейнер оборачивать, нет представления как это в проекте сделать

WenFutao commented 11 months ago

@nermakovaa Привет, так что сейчас цель - добавить кнопку или пункт меню в графический пользовательский интерфейс плагина QGIS. Когда пользователь нажимает на него, это должно вызвать функцию load_geojson_layer для загрузки и отображения слоя GeoJSON (с зданиями, дорогами). Я правильно понял? Кроме того, вы храните данные geojson локально?

nermakovaa commented 11 months ago

@WenFutao привет, я думаю мы должны попытаться добавить такое пользовательское окно

image

чтобы при нажатии на "Выбор города" пользователь мог выбрать из выпадающего списка город (для начала мы можем попробовать добавить два города - "Санкт-Петербург" "Москва", в будущем расширим этот перечень). Когда пользователь нажимает на город - обрабатывается запрос через overpass API (как пример) ''' [out:json]; area[name="Санкт-Петербург"]->.a; way(area.a)["building"]; /added by auto repair/ (._;>;); /end of auto repair/ out body; ''' после этого данные загружаются в qgis и визуализируются на карте, + в слоях появляется слой со зданиями Санкт-Петербурга (как в запросе ["building"]).

Вот в этом окне должен появиться слой со зданиями

image

nermakovaa commented 11 months ago

@WenFutao однако нам необходимо подумать как преобразовать данные, которые мы получаем от Overpass API, поскольку они поступают к нам в json и с ними не получается создать QgsVectorLayer.

WenFutao commented 11 months ago

@nermakovaa Я попробовал несколько способов преобразования geojson от Overpass API, но похоже, что на данный момент только использование GDAL относительно выполнимо. Я не обнаружил никаких проблем в своем коде, но после запуска плагина никакой реакции не происходит, мне еще нужно некоторое время, чтобы решить эту проблему.

nermakovaa commented 11 months ago

@WenFutao да, я пыталась решить эту проблему таким же способом, но я получаю ошибку

Image

на данный момент способ решения этой проблемы не нашла, также пытаюсь найти средство, которое позволит нам это выполнить.

GeorgiySurkov commented 11 months ago

можешь ее добавить, только мне кажется, что сперва нам необходимо куда-то данные сохранять, чтобы их потом подгружать как слой в qgis, что ты насчет этого думаешь?

@nermakovaa, привет

Я себя представляю нашу систему так, что при выборе города в интерфейсе плагина будут создаваться как минимум два слоя: тайловый с картой, который делал в этой задаче @WenFutao и векторный с топологией города. Как раз задачи по построению и визуализации топологии я завел и закрепил на себя #31 #25. Я их за сегодня сделаю.

nermakovaa commented 11 months ago

@GeorgiySurkov хорошо, правильно я понимаю, что ты хочешь добавить слои с дорогой, перекрестками и объектами недвижимости? При этом все это будет сохраняться в sqlite и оттуда читаться?

GeorgiySurkov commented 11 months ago

На тот момент, когда ты задала вопрос, я действительно хотел все напрямую хранить в sqlite бд с расширением spatialite. Но после вчерашних проб чтения и записи в spatialite из python, я решил начать прорабатывать способ работы только с geojson, но с преобразованием финального файла в geopackage/spatialite.

GeorgiySurkov commented 11 months ago

При этом я не считаю, что нам нуны будут слои с дорогой/перекрестками/объектами недвижимости, т.к. эти данные относительно хорошо визуализированы в тайловом слое с картой, которая делается в этой задаче. Я представляю, что наш плагин будет добавлять как минимум слой с визуализацией топологии города, слои с визуализациями вычисленных мер (коэфф кластеризации, betweeness...). Возможно что-то еще

nermakovaa commented 11 months ago

@GeorgiySurkov но ведь эти слои (с дорогой/перекрестками/объектами недвижимости) как раз содержат всю топологическую информацию о городе (в том числе пространственные отношения между этими объектами). Или я тебя неправильно поняла, и ты подразумеваешь под топологией все вышеперечисленное? И топология города в твоем понимании подразумевает набор этих слоев и отношений?

GeorgiySurkov commented 11 months ago

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

sevryukov commented 11 months ago

@GeorgiySurkov @nermakovaa коллеги, ваши комментарии солируют моему замечанию о том, что не определено то, что называется топологией. Я бы предложил в этой части ещё раз свериться с заказчиком.

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

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

nermakovaa commented 11 months ago

@GeorgiySurkov исходя из замечания Сергея Юрьевича, все-таки добавляем эти слои (с дорогой/перекрестками/объектами недвижимости) как векторные + топологию? Посмотри, пожалуйста, ТЗ с разделом "1.4. Функционал для визуализации городской топологии улиц" - все так? если нет, поправь его в соответствии с твоим пониманием. На данный момент я так плагин вижу, но может быть мы расходимся (как в ТЗ). Также добавь, пожалуйста, информацию о топологии (что она включает, какие атрибуты, что необходимо для ее построения).

*изначально, после последней встречи, мне казалось что мы должны получить для заданного региона/города (пользователь выбирает этот регион в плагине) некоторые слои, среди которых - слой дорог (с выбором дорог определенного типа), слой с объектами недвижимости (с выбором определенного типа) - все это в векторном представлении - как раз уже то что мы можем получить из запроса, преобразования в geojson и отображения на карту. Возможно в дальнейшем мы добавим топологию в виде графа для анализа, но мы вроде бы остановились на первой части. Разве не так? Думаю к демо-дню мы можем эту часть презентовать, если хотя бы ее в плагин добавим @GeorgiySurkov

GeorgiySurkov commented 11 months ago

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

Согласен с идеей показать на демо дне визуализацию выбранных слоев в интерфейсе плагина.

Понял, что у нас есть много расхождений в трактовке терминов и видении итоговой системы. Запишу свое видение итоговой системы завтра в ТЗ, дам посмотреть команде. После комментариев и правок от команды, свяжемся с Александром Юрьевичем.

sevryukov commented 11 months ago

@GeorgiySurkov FYI, в проект можно добавлять проект, но не делать видимым