Конференция "Media" » Интерактивная карта [D7, WinXP]
 
  • Lamer6666 (04.01.09 14:14) [0]
    Доброго времени суток!
    Задался вопросом создания интерактивной карты города из JPG файла размером 100 Мб.
    Основные задачи:
    1. Возможность масштабирования (приближать и удалять определенные кварталы карты города)
    2. При масштабировании (например отображении полной карты города) как то влиять на качество загружаемого изображения что бы снизит потребность приложения в системных ресурсах.
    3. Возможность эффекта "КАРТИНКА В КАРТИНКЕ" что бы внизу приложения отображать те части города, которые хочу запомнить
    4. Выводить фотографии и картинки при наведении мышки на определенные части карты города.
    5. Возможность нанесения динамических рисунков (например при задании двух точек ВИЗУАЛЬНО КРАСИВО прорисовать движение стрелки от точки 1 в точку 2)

    ВОПРОСЫ ТАКИЕ:
    1. Что использовать для решения поставленной задачи (DirecX, OpenGL, Рисование на форме, что то иное......)?
    2. Какая примерная схема реализации описанных выше пунктов?
    3. Литература и статьи которые могут помоч?

    В своей основе в основном работал с разработкой клиент серверных приложение под MsSQL, опыта работы с графикой крайне мало!
    Прошу проявить понимание и помощь, любое мнение приветствую и всех заранее благодарю!
  • Б (04.01.09 17:44) [1]
    На Королевстве Дельфи есть специальная ветвь - "Маштабирование", загляни.
    Думаю, что загружать рисунок в 100 мегабайт это... ...это очень и очень плохо. Всё будет жесточайше тормозить. На том же Королевстве есть примеры загрузки карты из ресурса по частям (Не вся же карта тебе нужна, а тот участок, что просматривается), так же есть пример, с возможностью загрузки большого изображения с мизерным поглащением памяти.
  • Sapersky (04.01.09 18:08) [2]
    В общем, вывод такой карты чем-то похож на отображение ландшафтов в игровых движках. Разбиваем всю карту на фрагменты (скажем, квадраты 1024 * 1024), проверяем, что в данный момент видит "камера", и выводим с требуемой детализацией.
    Под детализацией подразумевается использование уменьшенных в 2,4,8 и т.д. раз копий фрагментов. Уровень детализации определяется так же как в играх - "чем дальше камера, тем хуже", например, при масштабе от максимального до 50% - берём картинки натурального размера, от 50% до 25% - уменьшенные в два раза и.т.д.

    Если полностью карта в распакованном виде в память не влезает, то получается аналог RPG с "бесконечным" миром. Т.е. нужно динамически подгружать видимые фрагменты с нужным качеством (благо продвинутые библиотеки для работы с Jpeg - IJL, GdiPlus - позволяют это делать), при этом хранить некий кэш подгруженных фрагментов, и при превышении заданного размера удалять самые "старые".

    Все остальные вопросы после разработки основного рендера решаются относительно легко.

    Использовать DirectX/OpenGL необязательно. Единственное, чем они могут помочь - ускорить вывод картинки с масштабированием, но, возможно, будет достаточно и скорости софтверных средств.
  • Lamer6666 (05.01.09 11:27) [3]
    Примного благодарен.... разбираюсь.....
  • Lamer6666 (06.01.09 17:32) [4]

    > Разбиваем всю карту на фрагменты (скажем, квадраты 1024
    > * 1024)

    Можно ли из JPEG карты динамически вырезать нужную область затем применять к ней "ДИТАЛИЗАЦИЮ - изменение ее качества..." и выводить на экран??
  • Lamer6666 (06.01.09 18:10) [5]
    Google maps интересно кто нибудь использовал? Как к моей задаче, реально применить....???
    Спасибо....
  • KilkennyCat © (06.01.09 18:23) [6]
    можно. если разбираешься в алгоритме сжатия JPEGа.

    1. Для возможность масштабирования (приближать и удалять определенные кварталы карты города) достаточно иметь одну карту с максимальным разрешением, в упрощенном варианте. Но лучший результат даст векторная карта, а не растровая.

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

    3. Несущественно, это просто одно и тоже, только дважды и с разным масштабом.

    4. Просто описывается файлом координат.

    5. Нет проблем в любом варианте, просто отрисоваваешь карту, сверху отрисовываешь рисунок...

    ВОПРОСЫ ТАКИЕ:
    1. Что использовать для решения поставленной задачи (DirecX, OpenGL, Рисование на форме, что то иное......)?

    Собственно, если громадная скорость не нужна, то достаточно PaintBox'а

    2. Какая примерная схема реализации описанных выше пунктов?

    определяешься с форматом, вектор или растр. если все-таки растр, то определяешься с форматом хранения (в этом варианте я бы остановился не на JPEG (хоть одним файлом, хоть кучей мелких), а на сжатый BMP - нет потерь данных, известен алгоритм, можно выдирать именно нужную область из одного файла).
    определяешься с форматом списка координат с объектами.

    Ну а дальше нужно всего лишь три TBitmap - один хранит текущий карта, другой - рисунок или что-нить еще, что ты там хочешь сверху, в третьем все собираешь.

    3.
    Название: Программирование графики для Windows
    Автор: Фень Юань
    Издательство: Питер
    Год издания: 2002
    Страниц: 1072
    ISBN: 5-318-00297-8
    Язык: русский

    p.s.

    В память вовсе не обязательно запихивать весь файл. Изучаем http://msdn.microsoft.com/en-us/library/aa366556(VS.85).aspx
  • Sapersky (06.01.09 18:25) [7]
    IJL (Intel Jpeg Library) может грузить заданный фрагмент jpeg, в т.ч. и со сниженной детализацией.
    GdiPlus вроде тоже может, но, насколько помню тесты, по скорости там выигрыш получается незначительный (по сравнению с загрузкой всей картинки). Есть такое подозрение, что она всегда грузит картинку полностью, а в случае 100 мб-ного jpeg это смерть :)

    Есть ещё такой вариант - заранее порезать карту на фрагменты, в этом случае можно использовать более традиционные средства, хотя бы стандартный модуль jpeg.
  • KilkennyCat © (06.01.09 18:26) [8]

    > Lamer6666   (06.01.09 18:10) [5]


    Это не нужно. Задача рутинна, но проста.
    Кстати, напомню, что основные картографические программки не используют супер-пупер технологии типа директикса и опенжила... вектор-с.
  • Jeer © (06.01.09 19:05) [9]
    Достаточно взглянуть на WEB-map-технологии ( google, yandex  и пр ), чтобы понять - используются предварительно изготовленные мозаики, что спутниковые, что экспортированные из векторных ГИС-приложений.
  • Sapersky (06.01.09 19:09) [10]
    на сжатый BMP - нет потерь данных, известен алгоритм, можно выдирать именно нужную область из одного файла).

    Вроде стандартное сжатие BMP - это RLE, работает только в 4/8 bpp, полноцветные картинки сжимает слабо, и как из такого файла выдрать фрагмент (не читая в среднем половину файла) - непонятно.

    Опять же, если я правильно понял и 100 мб - это размер именно jpeg, то это что-то порядка 30000 * 20000. Несжатый bmp - около 1.7 гб. Сжатый любым lossless методом - раза в 2 меньше.
    Хотя, в принципе, тоже вариант - винты сейчас большие.
  • Jeer © (06.01.09 19:38) [11]

    >
    > Опять же, если я правильно понял и 100 мб - это размер именно
    > jpeg, то это что-то порядка 30000 * 20000. Несжатый bmp
    > - около 1.7 гб. Сжатый любым lossless методом - раза в 2
    > меньше.


    Использование в качестве основы для дальнейших манипуляций одного файла - методически неверный подход.
  • KilkennyCat © (06.01.09 22:17) [12]

    > Sapersky   (06.01.09 19:09) [10]


    я не говорил про стандартное сжатие RLE


    > Jeer ©   (06.01.09 19:38) [11]


    Объясни разницу между одним файлом, скажем, 100х100 и сотней файлов 10х10 при условии, что я могу прочитать данные из любой позиции в файле.
  • Lamer6666 (08.01.09 10:21) [13]

    > KilkennyCat ©   (06.01.09 18:23) [6].....
    > определяешься с форматом, вектор .....

    С "вектором" не работал :( какой формат, какое ПО для разработки?
    Примного благодарен за ответ!
  • KilkennyCat © (08.01.09 12:36) [14]

    > какой формат, какое ПО для разработки?


    Их много. Ничего конкретного советовать не буду, ибо имею лишь теоретические познания, практически один раз возился лишь, что не дает возможности сказать, что удобнее. Вполне возможно, что в твоем случае тебе удобнее вообще свой формат придумать. Ибо это всего лишь набор точек и связей, иными словами - описание объектов, а не их изображение, в отличие от растра.
    Я бы копанул в сторону SVG, OpenVG
  • Lamer6666 (09.01.09 08:00) [15]

    > то определяешься с форматом хранения (в этом варианте я
    > бы остановился не на JPEG (хоть одним файлом, хоть кучей
    > мелких), а на сжатый BMP

    Какое сжатие подразумевалось?

    > KilkennyCat ©   (08.01.09 12:36) [14]

    Огромное спасибо!
  • pavelkq (12.01.09 13:58) [16]

    > Lamer6666   (06.01.09 18:10) [5]
    >
    > Google maps интересно кто нибудь использовал? Как к моей
    > задаче, реально применить....???
    > Спасибо....

    Я в своем приложении отображаю карту из JPEG-a, но попутно у меня имеются координаты некоторых точек в формате WBS-84 (гармины и т.п.) Я сделал ссылочку в приложении "Посмотреть местность в Интернете" и повесил туда сгенерированную ссылку на гугл. Оч, удобно.
         Begin
           S:='http://maps.google.com/maps?f=q&hl=ru&geocode=&q='+
                  Shir+','+Dolg+'&t=h&z=10';
           ShellExecute(Handle,'open',PChar(S),nil,nil,SW_SHOWNORMAL);
         end;


    А вот готовая ссылка http://maps.google.com/maps?f=q&hl=ru&geocode=&q=65.30553,62.21186&t=h&z=10
    z - это масшатб. Остальное тоже найщешь в нете.
  • KilkennyCat © (12.01.09 18:42) [17]

    > Lamer6666   (09.01.09 08:00) [15]
    >
    > Какое сжатие подразумевалось?


    любое с известным алгоритмом, что позволит разжать так, как надо, например, из любого места.
  • Jeer © (13.01.09 01:22) [18]

    > WBS-84 (гармины и т.п.)


    Наверняка имелось в виду WGS-84, но это не формат, а вариант геодезической модели Земли, описывающий реальную Землю с некоторым приближением.
  • Ruslan777 (25.01.09 13:36) [19]

    Sapersky   (06.01.09 18:25) [7]
    > IJL (Intel Jpeg Library) может грузить заданный фрагмент
    > jpeg

    Дай пожалуйста ссылку на документацию по данной библиотеке, может примерчики есть? Что то Googl-ю ниче путевого не могу найти! (
  • Sapersky (26.01.09 13:54) [20]
    http://www.david-taylor.pwp.blueyonder.co.uk/software/components.html#JpegIO
    Саму DLL'ку на сайте Интела искать бесполезно, они её включили в платный пакет. Но можно найти отдельно:
    http://www.dll-files.com/dllindex/dll-files.shtml?ijl15
    Также IJL используется в FastLIB:
    http://prdownloads.sourceforge.net/skinner/FastLib.zip?download

    Примеров загрузки фрагмента jpeg там нет, но делается это довольно просто - нужно установить нужный прямоугольник в TJPEG_PROPERTIES.ROI (= Region of interest).
 
Конференция "Media" » Интерактивная карта [D7, WinXP]
Есть новые Нет новых   [134431   +9][b:0][p:0.001]