|
|
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
Подскажите, какие у кого мысли, как можно сделать самым простым способом, но в тоже время оптимальный алгоритм. Имеется приложение 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 не интересует. Есть и готовые контролы, но не хочется брать чужое, хоть оно и продвинутое во всех отношениях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 20:46 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
если в MouseDown начинаем, а в MouseUp смотрим, не надо ли еще подгрузить чего, то автоматически размер фонового битмапа по каждой стороне равен двойному размеру окна, иначе нужно проверять на незагруженные тайлы прямо в MouseMove ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 07:08 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
VSVLAD, а как ты из маленьких тайлов делаешь большую картинку? там два сткроллинга можно делать, первый - перемещать картинку в окне, а если требуется выход за картинку, то второй, при которой требуется замена тайлов я пока делаю TablePanelLayout http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1121129&msg=17432568 и пытаюсь её двигать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 16:05 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
tchingiz, Пока что, создал большую картинку, где Width * 3 и Height * 3 от размера видимой части карты. Большую карту-подложку, двигаю внутри окна-просмотра карты. Потом, как только узнаём, что уже скоро края карты-подложки, запрашиваем новые тайлы (все). Начинаю вызывать метод, передавать ему X и Y номера тайла, будет (пока что говноглючит) примерно так. Псевдокод: Код: vbnet 1. 2. 3. 4. 5. Далее, ловлю событие когда тайл загрузился из сети или из файла (используется кеширование), начинаю отрисовывать его в том логическом квадратике на большой-карте подложке, в тех координатах, в которых он был запрошен.... Пока что не спеша для удовольствия делаю проект, но чую уже багов там вагон. Например, блокировка карты-подложки нужна, когда один поток его отрисовывает, другой должен ждать. Возможно конечно сделать очередь, в которую потоки будут запихивать тайлы/битмапы, а потом основной поток формы будет часто (не в реальном времени) брать из очереди и отрисовывать на подложке. Пока ещё не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 19:50 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
вот я и спрашиваю как, например, из четырех тайлов-картинок сделать ОДНУ картинку в четыре раза больше. я это умею делать через openCV, а сишарпом (дотнетом) не умею ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 20:34 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
курсор с зажатой рукой( который чтото тащит) как называется, кстати? http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=233227&msg=17474115 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 20:36 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
1)кстати, сами тайлы качаются быстро (<10 секунд), может нет нужды городить вторую нитку для их подкачки. 2)Мне кажется рисовать надо из основной нитки, само рисование при наличии тайла в оперативной памяти не тянет времени(<1 сек), а блокировать надо твою очередь, которую будет наполнять фоновая нитка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 20:42 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
tchingizиз четырех тайлов-картинок сделать ОДНУ картинку Первая версия проекта тут: http://rghost.ru/8L9w8XYyM Там будет пример загрузки нескольких тайлов, и отрисовка на PictureBox, т.е. 1 картинка будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 20:42 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
у меня бейсика нету где место в программе, в котором новые тайлы 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 20:56 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
tchingiz, Здесь собственно и рисуется, на C# выглядит так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. В TileObject - классе есть свойства TileBitmap - сам тайл, X и Y и Zoom. Создаём объект типа Graphics, на контроле pbMap, и получаем ссылку. Далее вызываем метод DrawImage, передаём тайл-картинку, и X и Y координаты где отрисовать. (немного выше stepX и stepY - это я получал смещение, чтобы нарисовать тайлы в нужном мне порядке) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 21:18 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
сенкс авторDrawImage, передаём тайл-картинку, и X и Y координаты где отрисовать. я это не знал, а где то в коде ты конвертишь из png в bmp? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 21:56 |
|
||
|
Рендеринг тайлов карты OSM с возможностью скроллинга
|
|||
|---|---|---|---|
|
#18+
tchingiz, Нет, конвертировать не нужно. Класс Bitmap (это не значит, то он хранит только bmp), этот класс хранит различные растры: jpeg, png, gif и др. Если с графикой вы не работали в .NET, почитайте статейки/книжечки по Graphics/Bitmap/Image. Там много методов для рисования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 22:28 |
|
||
|
|

start [/forum/topic.php?fid=16&gotonew=1&tid=1341050]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
7ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 449ms |

| 0 / 0 |
