SASGIS

Веб-картография и навигация

Склеивание большого кол-ва тайлов

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

Склеивание большого кол-ва тайлов

Сообщение Cowa » 04 дек 2008, 01:48

Создал отдельную тему для тех, кому остро необходимо склеивать много тайлов.
Надеюсь, эта утилита вам поможет. Результат склейки - файл BMP. Максимум, что можно склеить - 256х256 тайлов, при этом BMP-файл не должен превышать 2Gb.

Версия TilesMerge_0.9.2 от 3.12.08
Изменения ( после первой пробы -http://sasgis.org/forum/viewtopic.php?f=2&t=21&st=0&sk=t&sd=a&start=50#p1797)
- слегка оптимизирован алгоритм
- небольшие изменения в интерфейсе
- добавлено создание файла привязки .map (спасибо feya)

Маленькое пояснение: по выделенной области тайлы не обрезаются, а берутся целиком. Т.е область выделения округляется до тайла.
Кому интересен алгоритм, прошу сюда:http://sasgis.org/forum/viewtopic.php?f=2&t=21&st=0&sk=t&sd=a&start=10#p1253

Новая версия TilesMerge_0.9.3 от 8.12.08
Изменения:
- добавлена возможность изменить цвет фона
- теперь перечень карт всегда полный (считывается из maps.ini)
- добавлен второй алгоритм создания файла bmp. Программе требуется больше памяти (в зависимости от размера формируемого файла не должна превышать 50 Mb). Зато работает в 2-3 раза быстрее.
- добавлена возможность вставлять координаты из буфера обмена.
Вложения
TilesMerge_0.9.3.part1.rar
(200 KiB) Скачиваний: 486
TilesMerge_0.9.3.part2.rar
(80.68 KiB) Скачиваний: 461
Последний раз редактировалось Cowa 09 дек 2008, 00:15, всего редактировалось 2 раз(а).
Cowa
Постигающий Дао
 
Сообщения: 173
Зарегистрирован: 23 авг 2008, 01:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение zed » 05 дек 2008, 14:22

Можно несколько пожеланий?
1. Добавить тип кэша GoogleMV
2. Добавить возможность ввода координат в цифровом виде: 52.45654, -145.2564
3. Расширить число поддерживаемых типов карты
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение Cowa » 05 дек 2008, 20:42

zed
1. С GoogleMV не работал и не знаю структуру кеша. Тем более, что утилитку делал исключительно для SAS.Планеты.
2. В принципе реально.
3. Не вопрос. Какие папки еще отобразить?

И вообще, утилитка является, так скажем, временной мерой, feya обещал сделать со временем.
feya писал(а):Сделаю я всохранение в бмп и геотиф, даже присылали мне ужо давно код готовый да вместе с винтом накрылся. Ну да там ничего сложного сделаем.

Да и как-то я заметил, что эта функция склейки является достаточно редко используемой, судя по кол-ву скачиваний.
Cowa
Постигающий Дао
 
Сообщения: 173
Зарегистрирован: 23 авг 2008, 01:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение zed » 05 дек 2008, 21:24

С GoogleMV не работал и не знаю структуру кеша.

Структура: CachePath\Zoom\qrst.jpg - т.е. для данного зума все файлы лежат в одной папке, qrst - имена в старом формате GoogleMaps
Тем более, что утилитку делал исключительно для SAS.Планеты

Я использую в SAS кэш формата GoogleMV (хоть с GoogleMV ни разу и не работал) - просто формат кэша более интуитивно понятен
Какие папки еще отобразить?

Все :)
И вообще, утилитка является, так скажем, временной мерой, feya обещал сделать со временем.

Может, стоит помочь автору исходниками, глядишь, ускорится процесс добавления функции в SAS.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение Cowa » 06 дек 2008, 00:47

Ладно, над кешем GoogleMV надо подумать.
zed писал(а): Какие папки еще отобразить?

Все :)

Это не ответ. Я использую достаточно старую версию SAS.Планеты. А карты добавляются очень быстро. Я использую только гугл и яндекс. Так что меня интересуют названия папок с картами.
zed писал(а):Может, стоит помочь автору исходниками

Думаю, что у него это уже сделано или почти сделано. Если еще нет - для автора ничего не жалко. Но еще раз повторю - наверное, не более чем десяти пользователям программы нужна эта функция. А есть и другие проблемы, которые нужно решать.
Cowa
Постигающий Дао
 
Сообщения: 173
Зарегистрирован: 23 авг 2008, 01:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение zed » 06 дек 2008, 01:27

Список папок:
    border\
    Both\
    Both1\
    contur\
    eatlas\
    gumap\
    ksmap\
    kssat\
    land\
    landmff\
    map\
    mars\
    moon\
    multimap\
    nasadem\
    nasaos\
    nasasat\
    OpLay\
    osmmap\
    Pano_KML\
    sat\
    sky\
    vemap\
    vesat\
    water\
    Wiki\
    WikiMap\
    yahyb\
    yamap\
    yasat\
    yhhyb\
    yhmap\
    yhsat\
А вообще, наверное лучше просто сделать доступным выбор папки из OpenDialog: "Открыть папку", тогда пользователь сам укажет папку с конкретным кэшем
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение Cowa » 06 дек 2008, 02:03

zed писал(а):Список папок:

М-да, многовато получилось. А что интересно будем клеить из Pano_KML\ или из Wiki\. Нужны папки с КАРТАМИ.
zed писал(а):А вообще, наверное лучше просто сделать доступным выбор папки из OpenDialog: "Открыть папку", тогда пользователь сам укажет папку с конкретным кэшем

.... а потом выбирать с какой проекцией рассчитывать координаты? Не лучший вариант. Ладно, выберу папки сам.
Cowa
Постигающий Дао
 
Сообщения: 173
Зарегистрирован: 23 авг 2008, 01:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение zed » 06 дек 2008, 02:26

Понятно, что папки с картами - просто привёл полный список.
А проекций-то всего-ничего - пара меркаторов и широта/долгота - не слишком трудный выбор
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение Cowa » 09 дек 2008, 00:01

Новая версия TilesMerge_0.9.3 - добавил на первую страницу.
Cowa
Постигающий Дао
 
Сообщения: 173
Зарегистрирован: 23 авг 2008, 01:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Вопрос по BMP

Сообщение feya » 22 дек 2008, 11:33

Вот есть такой код:
Код: Выделить всё
unit bmpUtil;

interface


type
  bmFileHeader = record   {заголовок файла}
    //Typf : word;        {сигнатура }
    Size : longint;     {длина файла в байтах}
    Res1 : word;        {зарезервировано}
    Res2 : word;        {зарезервировано}
    OfBm : longint;     {смещение изображения в байтах (1078) = $36}
  end;
  bmInfoHeader = record   {информационный заголовок}
    Size : longint;       {длина заголовка в байтах (40) = $28}
    Widt : longint;       {ширина изображения (в точках)}
    Heig : longint;       {высота изображения (в точках)}
    Plan : word;          {число плоскостей (1)}
    BitC : word;          {глубина цвета (бит на точку) (8)}
    Comp : longint;       {тип компрессии (0 - нет)}
    SizI : longint;       {размер изображения в байтах}
    XppM : longint;       {горизонтальное разрешение}
                {(точек на метр - обычно 0)}
    YppM : longint;       {вертикальное разрешение}
                {(точек на метр - обычно 0)}
    NCoL : longint;       {число цветов}
                {(если максимально допустимое - 0)}
    NCoI : longint;       {число основных цветов}
  end;
  bmHeader = record       {полный заголовок файла}
    f : bmFileHeader;     {заголовок файла}
    i : bmInfoHeader;     {информационный заголовок}
    //p : array[0..255,0..3]of byte; {таблица палитры}
  end;

  TBGR= record
   b,g,r:byte;
  end;

  PlineRGBb = ^TlineRGBb;
  TlineRGBb = array[0..0] of TBGR;

  TBMPRead = function(Sender:TObject;Line:cardinal; var InputArray:PLineRGBb):boolean;

Var
    CountEmptyTiles : integer;
    procedure SaveBMP(Sender:TObject; W, H : integer; tPath : string; readcallback:TBMPRead);

implementation
uses  UThreadScleit;

Var
  BMPRead:TBMPRead;

function SaveBMPHeader(filename:string;W : longint;H : longint): bmHeader;
var f : file;
    Z : byte;
begin
   z:=255;
   Result.i.Size:=$28; //40;
   Result.i.Widt:=W;
   Result.i.Heig:=H;
   Result.i.Plan:=1;
   Result.i.BitC:=$18;    // количество цветов 24
   Result.i.Comp:=0;

   Result.i.SizI:=W * H * 3{ + (W mod 4)*H};// размер витмапа
   Result.i.XppM:=0;
   Result.i.YppM:=0;
   Result.i.NCoL:=0;
   Result.i.NCoI:=0;

  // Result.f.Typf:=$4D42;
   Result.f.Res1:=0;
   Result.f.Res2:=0;
   Result.f.OfBm:=$36;        // $36 = 54  // смещение витмапа от начала файла
   Result.f.Size:=Result.i.SizI + Result.f.OfBm;   // полный размер файла
end;

procedure SaveBMP(Sender:TObject; W, H : integer; tPath : string; readcallback:TBMPRead);  // Запись на диск файла
Var f : file;
    i ,nNextLine: integer;
    InputArray:PlineRGBb;
    TypeBmp:Word;
    Header: bmHeader;
begin
   Header:=SaveBMPHeader(tPath,W,H);
   AssignFile(f,tPath);
   ReWrite(f,1);
   TypeBmp  := $4D42;

   BlockWrite(f,TypeBmp,sizeof(TypeBmp));
   BlockWrite(f,Header,sizeof(Header));

   BMPRead:=readcallback;
   getmem(InputArray,W*3+1);

   for nNextLine:=0 to h-1 do
    begin
     if not(ThreadScleit(Sender).Fprogress.Visible) then break;
     BMPRead(Sender,nNextLine,InputArray);
     seek(f,(h-nNextLine-1)*W*3+54);
     BlockWrite(f,InputArray^,W*3);
    end;

   FreeMem(InputArray);
   CloseFile(F);
end;

end.


Есть проблема в некоторых случаях (в зависимости от разрешения картинки) выдает странный бмп:
Изображение

BMPRead отдает строку БГР. Функция верная, т.к. идентична той которая используется в склейке ECW/JP2.
Вопрос: Что за хня?
http://sasgis.org | SAS.Планета | SASPlanet
Аватара пользователя
feya
Гуру
 
Сообщения: 2034
Зарегистрирован: 13 июл 2008, 10:45
Благодарил (а): 5 раз.
Поблагодарили: 56 раз.

След.

Вернуться в SAS.Планета

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

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