Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Рендеринг тайлов карты OSM с возможностью скроллинга / 13 сообщений из 13, страница 1 из 1
01.04.2015, 20:46
    #38924260
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
Подскажите, какие у кого мысли, как можно сделать самым простым способом, но в тоже время оптимальный алгоритм.

Имеется приложение VB.NET/C# (WinForms), оно загружает с сервера OpenStreetMap тайлы, теперь их нужно отрисовать. Также нужно, чтобы была возможность как в картах Яндекса/Гугла скроллить мышью.

В первой версии было всё статично, пользователь мог нажимая на "перекрестие" двигаться в 4 направления. Тайлы загружались и рисовались по порядку:


1231X.YX+1.YX+2.Y2X.Y+1 X+1.Y+1X+2.Y+13X.Y+2X+1.Y+2X+2.Y+2

Для того, чтобы можно было осуществлять навигацию мышью, вижу такой способ:
1) Нужно создать объект типа Image, будет подложкой для карты, которую условно нужно разбить на "квадраты".
2) Каждый логический квадрат должен иметь адрес X,Y - номер тайла. Имеются методы перевода гео-координат в номера тайлов и обратно.
3) Подложка имеет больший размер, чем область где будет вывод карты.
4) При захвате MouseDown - берём изображение,
5) при MouseMove - перерисовываем постоянно на форме нашу подложку, где Top и Left куда рисуем, будут координатами где сейчас мышь (итого, будет эффект, что объект двигается на форме),
6) далее при MouseUp - мы должны как-то определить что край подложки уже близко, и нужно запросить новые данные, перерисовать подложку, и расположить её по координатам так... чтобы её центр был, там где мы отпустили при перетаскивании.

Вообщем как-то объяснил...


Ещё не хочется оперативку сильно напрягать, поэтому слишком большую подложку сделать не получится.
А вы какие способы видите? WPF не интересует. Есть и готовые контролы, но не хочется брать чужое, хоть оно и продвинутое во всех отношениях
...
Рейтинг: 0 / 0
02.04.2015, 07:08
    #38924400
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
если в MouseDown начинаем, а в MouseUp смотрим, не надо ли еще подгрузить чего, то автоматически размер фонового битмапа по каждой стороне равен двойному размеру окна, иначе нужно проверять на незагруженные тайлы прямо в MouseMove
...
Рейтинг: 0 / 0
04.04.2015, 16:05
    #38927061
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
VSVLAD,

а как ты из маленьких тайлов делаешь большую картинку?

там два сткроллинга можно делать,

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

то второй, при которой требуется замена тайлов



я пока делаю TablePanelLayout
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1121129&msg=17432568
и пытаюсь её двигать.
...
Рейтинг: 0 / 0
04.04.2015, 19:50
    #38927108
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
tchingiz,

Пока что, создал большую картинку, где Width * 3 и Height * 3 от размера видимой части карты. Большую карту-подложку, двигаю внутри окна-просмотра карты. Потом, как только узнаём, что уже скоро края карты-подложки, запрашиваем новые тайлы (все).
Начинаю вызывать метод, передавать ему X и Y номера тайла, будет (пока что говноглючит) примерно так. Псевдокод:

Код: vbnet
1.
2.
3.
4.
5.
For W = 0 To PadMap.Width Step 256
    For H = 0 To PadMap.Height Step 256
        ThreadPool.QueueUserWorkItem(LoadTile, new Data(W, H, .., .., ..))
    Next
Next


Далее, ловлю событие когда тайл загрузился из сети или из файла (используется кеширование), начинаю отрисовывать его в том логическом квадратике на большой-карте подложке, в тех координатах, в которых он был запрошен.... Пока что не спеша для удовольствия делаю проект, но чую уже багов там вагон. Например, блокировка карты-подложки нужна, когда один поток его отрисовывает, другой должен ждать.

Возможно конечно сделать очередь, в которую потоки будут запихивать тайлы/битмапы, а потом основной поток формы будет часто (не в реальном времени) брать из очереди и отрисовывать на подложке. Пока ещё не знаю
...
Рейтинг: 0 / 0
04.04.2015, 20:34
    #38927130
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
вот я и спрашиваю как, например, из четырех тайлов-картинок сделать ОДНУ картинку
в четыре раза больше.
я это умею делать через openCV, а сишарпом (дотнетом) не умею
...
Рейтинг: 0 / 0
04.04.2015, 20:36
    #38927132
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
курсор с зажатой рукой( который чтото тащит) как называется, кстати?
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=233227&msg=17474115
...
Рейтинг: 0 / 0
04.04.2015, 20:42
    #38927136
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
1)кстати, сами тайлы качаются быстро (<10 секунд), может нет нужды городить вторую нитку для их подкачки.

2)Мне кажется рисовать надо из основной нитки, само рисование при наличии тайла в оперативной памяти не тянет времени(<1 сек), а блокировать надо твою очередь, которую будет
наполнять фоновая нитка.
...
Рейтинг: 0 / 0
04.04.2015, 20:42
    #38927137
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
tchingizиз четырех тайлов-картинок сделать ОДНУ картинку
Первая версия проекта тут: http://rghost.ru/8L9w8XYyM
Там будет пример загрузки нескольких тайлов, и отрисовка на PictureBox, т.е. 1 картинка будет.
...
Рейтинг: 0 / 0
04.04.2015, 20:56
    #38927146
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
у меня бейсика нету

где место в программе, в котором

новые тайлы

params.TileBitmap = New Bitmap(responseStream)

файл OpenStreetMap.vb строка 66

укладываются в твой пинчебокс pbMap?


Me.pbMap.BackColor = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer))
Me.pbMap.Location = New System.Drawing.Point(8, 8)
Me.pbMap.Name = "pbMap"
Me.pbMap.Size = New System.Drawing.Size(776, 480)
Me.pbMap.TabIndex = 0
Me.pbMap.TabStop = False
...
Рейтинг: 0 / 0
04.04.2015, 21:18
    #38927156
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
tchingiz,

Здесь собственно и рисуется, на C# выглядит так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void OSM_TileLoaded(TileInfo TileObject)
{
    int stepX = Math.Abs(ViewBoxTile.X - TileObject.X);
    int stepY = Math.Abs(ViewBoxTile.Y - TileObject.Y);
    
    Graphics g = pbMap.CreateGraphics();
    g.DrawImage(TileObject.TileBitmap, stepX * 256, stepY * 256);
}


В TileObject - классе есть свойства TileBitmap - сам тайл, X и Y и Zoom. Создаём объект типа Graphics, на контроле pbMap, и получаем ссылку. Далее вызываем метод DrawImage, передаём тайл-картинку, и X и Y координаты где отрисовать. (немного выше stepX и stepY - это я получал смещение, чтобы нарисовать тайлы в нужном мне порядке)
...
Рейтинг: 0 / 0
04.04.2015, 21:56
    #38927165
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
сенкс
авторDrawImage, передаём тайл-картинку, и X и Y координаты где отрисовать.

я это не знал,
а где то в коде ты конвертишь из png в bmp?
...
Рейтинг: 0 / 0
04.04.2015, 22:28
    #38927173
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
tchingiz,

Нет, конвертировать не нужно. Класс Bitmap (это не значит, то он хранит только bmp), этот класс хранит различные растры: jpeg, png, gif и др. Если с графикой вы не работали в .NET, почитайте статейки/книжечки по Graphics/Bitmap/Image. Там много методов для рисования
...
Рейтинг: 0 / 0
04.04.2015, 23:14
    #38927202
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рендеринг тайлов карты OSM с возможностью скроллинга
ок
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Рендеринг тайлов карты OSM с возможностью скроллинга / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]