Перейти к содержанию
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 эмодзи.

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

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

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

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