Перейти к содержанию
Fire Monkey от А до Я

[Android] [XE7] Какой компонент выбрать для карты?


brunnengi

Рекомендуемые сообщения

Здравствуйте.

Хочу загнать карту в приложение. Т.е. сделать ПринтСрин нескольких участков, слить их в одно изображение в фотошопе, а потом иметь возможность просматривать на смартфоне под android. Что бы можно было пальцами приблизить, подвигать карту.

Какой компонет посоветуете?

Ссылка на комментарий
  • Администраторы
  1. Компонента, который умеет масштабировать изображение и перемещать изображение пальцем, нету. Поэтому такой придется сделать самостоятельно.
  2. Я бы не стал брать TImage за основу, так как на всех мобильных платформах у TBitmap есть ограничение на максимально допустимый размер. Он равен максимально допустимому размеру текстуры на текущем устройстве и зависит от возможностей телефона. А так как исходник карты может быть очень большим, то карта просто не поместиться в TBitmap.
  3. Чтобы хранить большее изображение нужно использовать TBitmapSurface.
  4. Самый лучший вариант это хранение карты по частям и до загрузка требуемых частей по мере прокручивания карты и изменении масштаба. При таком подходе можно будет части хранить в  TBitmap и использовать отрисовку штатным способом TCanvas.DrawBitmap. Если части больше не отображаются, то их можно будет выгружать, чтобы не занимать лишнюю память.
Ссылка на комментарий

 

  1. ...
  2. ... Он равен максимально допустимому размеру текстуры на текущем устройстве...
  3. ...
  4. ...

 

 

А как узнать этот самый максимально допустимый размер?

 

Я посоветовал TImage, потому что сам решил аналогичную задачу (только у меня была не карта, а изображение с web-камеры) используя именно его. И проблем пока не замечено. Но с учетом Ваших пояснений я начинаю думать, а не переделать ли мне это на TBitmapSurface.

Ссылка на комментарий
  • Администраторы

Как узнать поддерживаемый максимально допустимы размер изображения в TBitmap?

Смысл переписывать имеет, если вам нужно загружать очень большие изображения, где-то более 2-3 Mb.

 

P.S. На Windows с DirectX 10, размер вообще 64 Mb

Ссылка на комментарий

 

  1. ...
  2. ...
  3. Чтобы хранить большее изображение нужно использовать TBitmapSurface.
  4. Самый лучший вариант это хранение карты по частям и до загрузка требуемых частей по мере прокручивания карты и изменении масштаба. При таком подходе можно будет части хранить в  TBitmap и использовать отрисовку штатным способом TCanvas.DrawBitmap. Если части больше не отображаются, то их можно будет выгружать, чтобы не занимать лишнюю память.

 

 

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

Одна карта слитая в один jpg файл, с 20 кратным увеличением вести 70МБ, причем там не все ее части ещё в нормальном качестве, большая часть еще смазана.

Значит итоговая будет весит куда больше.

 

Теперь по алгоритму вопросы.

Эту карту одним файлом надо загнать в TBitmapSurface? Потом подгружать из него в TBitmap?

И как организовать прокрутку с одновременном подгрузкой?

И что делать если мне надо что бы масштаб стал другим, .т.е увидеть зону не с 20 кратным приближением а с 14 кратным допустим?

Мне надо еще и такую карту залить? Или если уже храниться карта в хорошем разрешении этого можно избежать?

 

P.S. 

У меня на телефоне показало 4096. Это 4096 его именно? Высота картинки в pixels?

Ссылка на комментарий
  • 2 недели спустя...
  • Администраторы

Это значит, что картинка должна быть не более 4096 х 4096.

 

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

Ссылка на комментарий
  • 4 недели спустя...

Здравствуйте, я тоже хочу сделать карту но поверх картографических рисунков нужно добавить векторные графики как например дорогу и еще вы посоветовали TBitmapSurface что это как с ним работать? 

Ссылка на комментарий
  • 4 месяца спустя...
  • Администраторы

В XE8 добавлен новый компонент TMapView, который позволяет отобразить карту в вашем приложении и не только. Поддерживаемые платформы: Android и iOS.

Ссылка на комментарий
  • 9 месяцев спустя...

 

В XE8 добавлен новый компонент TMapView, который позволяет отобразить карту в вашем приложении и не только. Поддерживаемые платформы: Android и iOS.

 

 

Ярослав, Вы забыли указать, что компонент допускает в бесплатном варианте до 1000 сессий, потом он не будет работать.

Ссылка на комментарий

masmat, что за ограничение значит 1000 сессий? О чем вы? Речь про сам компонент или про ограничения сервиса Google Maps?

В компоненте TMapView можно использовать только карту Google Map, другие не удавалось подключить (пробовал в XE 8.1)

Так вот, по лицензионной политике Google при превышении порога в 1000 запросов (не помню то ли в день, то ли в месяц) карта работать перестанет. Нужно будет покупать лицензию.

Так было на октябрь 2015 года. Может сейчас политика Google изменилась, нужно уточнять.

Ссылка на комментарий

Во-первых, сам компонент здесь ни при чем.

Во-вторых, ограничение 1000 бесплатных запросов (а не сессий) в день касается Google Places API for Android, а не самого Google Maps Android API

Пруфлинк https://developers.google.com/maps/pricing-and-plans/?hl=ru

Ссылка на комментарий

Rusland абсолютно прав, я делал более 1000 запросов за сутки.  Google Maps Android API не имеет ограничений в бесплатной версии.

Делал карты ещё до появления MapView. Использовал TWebbrowser :mellow:

А так же PaintBox для загрузки локальных карт в формате OZI

Как по мне, PaintBox удобнее Image

Ссылка на комментарий
Черновой вариант, использую в Windows. На сколько адаптировано к Android не знаю, не компилил


procedure TMap.FullScreen(Image:TImage;Tile:TOSMTile);
var
  I: Byte;
  j: Integer;
  BMPTile, BMPImage:TBitmap;
  rctIn, rctOut:TRectF;
  S:String;
begin
  rctOUT:= TRectF.Create(0,0,255,255);
  BMPImage  := TBitmap.Create;
  BMPImage.Width    := Round(Image.Width);
  BMPImage.Height   := Round(Image.Height);
  BMPTile := TBitmap.Create;
  if not DirectoryExists(FPathTile+IntToStr(Tile.Zoom)) then
    ForceDirectories(FPathTile+IntToStr(Tile.Zoom));
  for I := 1 to FTileWidth do
    for j := 1 to FTileHeight do
    begin
      S:= FPathTile+format('%d\%d\%d.png',[Tile.Zoom,Tile.TileX+i-1,Tile.TileY+j-1]);
      while  Assigned(FHTTP) and not FileExists(S)  do
      begin
        if not DirectoryExists(FPathTile+IntToStr(Tile.Zoom)+'\'+IntToStr(Tile.TileX+i-1)) then
          ForceDirectories(FPathTile+IntToStr(Tile.Zoom)+'\'+IntToStr(Tile.TileX+i-1));
        LoadURLToFile(S, 'http://b.tile.openstreetmap.org/'+format('%d/%d/%d.png',[Tile.Zoom,Tile.TileX+i-1,Tile.TileY+j-1]), FHTTP);
      end;
      if FileExists(S) then
      begin
        rctIn := TRectF.Create(256*(i-1),256*(j-1),256*(i),256*(j));
        BMPTile.LoadFromFile(S);
        BMPImage.Canvas.BeginScene();
        BMPImage.Canvas.DrawBitmap(BMPTile,rctOut,rctIn,100,True);
//        BMPImage.Canvas.Fill.Kind := TBrushKind.None;
//        BMPImage.Canvas.DrawRect(TRectF.Create(0,0,FScreenWidth, FScreenHeight),0, 0, AllCorners, 100);
        BMPImage.Canvas.EndScene;
      end

    end;
    Image.Bitmap:= TBitmap.Create;
    Image.Bitmap.Clear($FFFFFFFF);
    Image.Bitmap.Assign(BMPImage);
end;

Изменено пользователем Alexander
Ссылка на комментарий

Идея была в следующем. В TImage не помещалась карта(состоящая из тайлов) большого размера. Поэтому был разработан алгоритм: на TScrollBox размещались TImage. Размер TImage(экран) чуть больше видимой области TScrollBox и кратный 256 пикселям(размер тайла). Затем экран заполнялся тайлами в соответствии с координатами. Таким образом, получалась большая карта и плавный скрол с инерцией

Изменено пользователем Alexander
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...