Отображение кэша sasplanet в timage32

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Отображение кэша sasplanet в timage32

Сообщение adminsamara » 04 янв 2017, 20:30

1)Как отобразить кэш sasplanet в timage32?
2)Не могу нигде найти формулу на яндекс, на гугл делаю так, но все равно чтото не получается, не пойму как отображаются тайлы сначало в буфере потом в image32...
пробую так, код ваш смотрел, кое как скомпилировал =)
Код: Выделить всё
procedure TForm1.Image321MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer; Layer: TCustomLayer);
begin
X_LIVE:=X;
Y_LIVE:=Y;
lat := -(y/c)*180 + 90;
lon := (x/c)*360 -180;
Title_x:=floor((a/2) + Lon * a / 360);
Title_y:=floor((a/2) - 0.5 * ln((1+sin(Lat))/(1-sin(Lat))) * a/(2*pi));
// z:=sin(lat*(pi/180));
z:=strtofloat(Combobox1.Text);
Capture_X.Caption:=inttostr(X);
Capture_Y.Caption:=inttostr(Y);
Capture_lat.Caption:=floattostr(lat);
Capture_lon.Caption:=floattostr(lon);
Capture_Title_x.Caption:=floattostr(Title_x);
Capture_Title_y.Caption:=floattostr(Title_y);

pyt_k_kartam:='C:\SAS.Planet.Release.160707\cache';
result:=pyt_k_kartam+'\yanarodscheme2015\z'+floattostr(z)+'\'+ floattostr((Title_x) / 1024)+'\x'+floattostr(Title_x)+'\'+ floattostr((Title_x) / 1024)+'\y'+floattostr(Title_x)+'.png';
Capture_result.Caption:=result;

if fileexists(result)=true then begin

//Image1.Picture.LoadFromFile(result);
//Image321.Canvas.Draw(Title_x*255,Title_y*255,Image1.Picture.Graphic);

end
else
Memo1.lines.add(result+' файл отсутствует');

end;

Какая процедура отвечает за отображение тайлов?
adminsamara
Новичок
 
Сообщения: 4
Зарегистрирован: 04 янв 2017, 20:13
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.

Re: Отображение кэша sasplanet в timage32

Сообщение DJ VK » 05 янв 2017, 03:18

А зачем так сложно если нужно просто отрисовать карту?
Title_x*255,Title_y*255 - уж больно громоздкие цифры.
1. Попробуй создать промежуточный буфер, подобно тому, как это делается при двойной буферизации (при анимации).
Пусть он не приязан к реальным тайловым координатам. Итак фоновый буфер размером в несколько тайлов в ширину и высоту, можно с небольшим запасом.
Центральная часть буфера - размер видимого рисунка на экране. Буфер больше его или равен.
также надо создать кэш открытых тайлов, штук на 100-200. прикрыть крит. секцией чтение и запись.
и фоновые потоки для загрузки тайлов и отрисовки буфера.
2. Определяемся с координатами карты. центр карты (= буфера) задан в географических координатах. переводим в тайловые для данной проекции и получам список тайлов со смещениями покрывающий видимую область. список даем фоновому загрузчику. По мере прогрузки тайлов он кладет их в кэш. в виде TpngObject или TImage (или другой класс).
3. каждый загруженный тайл дает команду отрисовки. По ней фоновый поток отрисовки буфера рисует draw тайл по нужному смещению на канвасе буфера (канвас потоковраждебен - буфер надо защитить от конфликта доступа). сообщает о необходимости отрисовки основной форме.
4. основная форма отрисовывает центр буфера на канвас изображения формы (copyrect) по флагу из потока отрисовки.
Движение карты - считаем сдвиг в пикселах. Быстро отриовываем тайлы из кэша с новым смещением в буфер и говорим форме срисовать подвинутый (copy rect) буфер.
Считаем, не затронул ли сдвиг новые тайлы и тайлы в кэше. Если да, то уже не нужные тайлы (уехали с этого места) высвобождаем из кэша. Нужныек тайлы в спсиок и в поток загрузки - они по мере загрузки прорисуются в нужные места по краю буфера (см. пункт 2).

За это сообщение автора DJ VK поблагодарил:
adminsamara (05 янв 2017, 08:09)
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1467
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 298 раз.


Вернуться в Раздел для разработчиков программы SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron