Форум программистов, компьютерный форум, киберфорум
Sanya_sa
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Рейтинг: 4.17. Голосов: 6.

Карты офлайн.

Запись от Sanya_sa размещена 31.10.2016 в 11:02. Обновил(-а) Sanya_sa 30.05.2019 в 12:07
Показов 23219 Комментарии 13

Простейший пример получения тайлов с картографических серверов. Их сохранение на диск и использование.
Все формулы взяты с https://msdn.microsoft.com/en-... 59689.aspx, подробнее о проекции Меркатора https://ru.wikipedia.org/wiki/... 1%80%D0%B0 .

Возможно кому нибудь поможет. В итоге можно доработать и получить неплохой контрол для работы с картами в офлайн. Например у меня реализованы (в полной версии) следующие функции:
- поддержка работы с несколькими картографическими сервисами (Гугл, ВиртуалЭс, OSM)
- возможность нанесения на карту "точек маркеров" (например для построения маршрута)
- возможность выбора зоны загрузки тайлов с учетом уровня детализации
- ну и еще всяка разна.

Добавил архив MapView, там можно зажав Ctrl, колесиком мыши вращать карту.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 954
Размер:	1.14 Мб
ID:	4014   Нажмите на изображение для увеличения
Название: Безымянный1.png
Просмотров: 1019
Размер:	1.09 Мб
ID:	4015   Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 1169
Размер:	1.58 Мб
ID:	4016  

Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 1092
Размер:	1.57 Мб
ID:	4017   Нажмите на изображение для увеличения
Название: 3.png
Просмотров: 988
Размер:	1.37 Мб
ID:	4018   Нажмите на изображение для увеличения
Название: 4.png
Просмотров: 894
Размер:	463.9 Кб
ID:	4019  

Вложения
Тип файла: 7z GMapView.7z (2.70 Мб, 827 просмотров)
Тип файла: 7z MapView.7z (11.26 Мб, 636 просмотров)
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 13
Комментарии
  1. Старый комментарий
    Интересная статья. Помню как-то видел описание метода хранения тайлов на хабре.

    Не по теме:

    А заголовок у вас с ошибкой...

    Запись от castaway размещена 07.11.2016 в 21:06 castaway вне форума
  2. Старый комментарий
    Запись от snake32 размещена 22.11.2016 в 15:47 snake32 вне форума
  3. Старый комментарий
    Аватар для Sanya_sa
    Что то там половина ссылок не работают) Но всё равно спасибо!
    Запись от Sanya_sa размещена 22.11.2016 в 15:52 Sanya_sa вне форума
    Обновил(-а) Sanya_sa 22.11.2016 в 15:54
  4. Старый комментарий
    Аватар для snake32
    Да, жаль загнулся сайт. Раньше часто пользовался САС.Планетой. Много разных карт можно было скачать для оффлайна.
    Запись от snake32 размещена 22.11.2016 в 18:00 snake32 вне форума
  5. Старый комментарий
    Аватар для Sanya_sa
    Много разных карт можно было скачать для оффлайна.

    Да тайлы скачать не проблема. Проблема их потом отрисовать в нужной последовательности.
    Запись от Sanya_sa размещена 22.11.2016 в 18:02 Sanya_sa вне форума
    Обновил(-а) Sanya_sa 23.11.2016 в 11:16
  6. Старый комментарий
    Увидел вашу запись - созрел вопрос: Не в курсе ли вы, есть ли возможность сделать карту водоемов глубин для эхолота Lowrance. А конкретно нужна карта реки Днепр с глубинами. Заранее спасибо
    Запись от WolF_RaM размещена 30.11.2016 в 13:38 WolF_RaM вне форума
  7. Старый комментарий
    Аватар для Sanya_sa
    есть ли возможность сделать карту водоемов глубин для эхолота Lowrance не совсем понятен вопрос. Данный эхолот работает с какими то картами (определенного формата)? Если да то возможно существует софт который их строит а так по глубинам можно использовать например сервис Мультимапс.https://multimaps.ru/#x=46.828... 12&t=depth
    Запись от Sanya_sa размещена 30.11.2016 в 13:47 Sanya_sa вне форума
  8. Старый комментарий

    GMap.Net сохранить путь к gmdb

    Доброго времени суток Осваиваю работу с GMap.Net Есть база gmdb необходимо указать к ней путь Как это сделать программно
    Запись от csm7 размещена 01.03.2017 в 13:42 csm7 вне форума
  9. Старый комментарий
    Аватар для Sanya_sa
    Не работал с GMap.Net, на форуме вопрос задайте. Там однозначно помогут.
    Запись от Sanya_sa размещена 01.03.2017 в 13:45 Sanya_sa вне форума
  10. Старый комментарий
    Аватар для SatanaXIII
    Sanya_sa, а расскажите пожалуйста в трех словах как работает программа:
    Карты загружены сразу в приложение, и, при необходимости, могут обновиться?
    Сколько весит программа с предзагруженными картами?
    Запись от SatanaXIII размещена 01.03.2017 в 15:05 SatanaXIII вне форума
  11. Старый комментарий
    Аватар для Sanya_sa
    SatanaXIII да это не программа, просто так для демонстрации выложил. Сам просто долго разбирался, думаю может кому интресно будет. Весь код давно написан как оказалось тут https://msdn.microsoft.com/en-... 59689.aspx . Мне оставалось только все заточить под свои нужды. Единственное добавил метод расчета расстояния:
    Кликните здесь для просмотра всего текста

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    // Градусы в радианы
    private const double GR = Math.PI / 180.0;
     
    /// <summary>
    /// Расстояние между точками в км
    /// </summary>
    /// <param name="one"></param>
    /// <param name="two"></param>
    /// <returns></returns>
    public static double DistanceBetweenPoints(PointD one, PointD two)
    {
        var d = Math.Acos((Math.Sin(one.Y * GR) * Math.Sin(two.Y * GR)) + (Math.Cos(one.Y * GR) * Math.Cos(two.Y * GR) * Math.Cos((one.X - two.X) * GR)));
        return d * EarthRadius / 1000;
    }


    Началось с того, что нужно было сделать ОфЛайн карты. А так как я ваще не программист (заставляют просто), думаю ну все, приехали. Ну пришлось разбираться, ходил в отдел к прогерам, они то же не в зуб ногой... короче перешерстли все интернет - готового решения не нашел. и понеслась...

    1) Тайлы хранятся на серверах, каждый тайл имеет Quadkey (уникальный номер который определяет его позицию в многослойной карте https://i-msdn.sec.s-msft.com/dynimg/IC96238.jpeg). Пример запроса, для получения тайла (например с virtualearth)
    http://ecn.t1.tiles.virtualearth.net/tiles/a22.jpeg?g=282&mkt=en-us
    где 22 это Quadkey

    2) Размер тайла 256x256 pix отсюда зная уровень детализации карты можем посчитать ее размер в пикселах.

    3) Ну и последнее что нужно знать это размер в пикселах, самого контрола на котором будем рисовать тайлы.


    Ну вот в принципе и все, теперь остается определиться какие тайлы и в каком порядке отрисовывать на нашем контроле.
    Естественно на контроле (назовем его "Окно просмотра") будет находится часть карты и наше "Окно просмотра" сможет перемещаться по всей карте и отрисовывать тот кусочек который виден. Поэтому требуется определиться с системами координат:

    a) Система координат самой карты MapSCpix в пикселах ее размер зависит уровня детализации.
    b) Система координат окна просмотра ViewSCpix (это и есть наш контрол который будет рисовать часть карты которую видит пользователь).
    с) ну а геокоординаты элементарно считаются по формулам ссылку на которые давал выше. Это будет наша 3я система координат GeoSC.

    Для систем MapSCpix и ViewSCpix за 0 (точка отсчета) возьмем верхний правый угол.

    Теперь рассчитываем какие тайлы у нас "видны в окне просмотра" и сохраняем их в буфер, если буфер достиг установленного нами максимума, ну на пример 500, то просто очистим его (тут конечно надо бы удалять тайлы те которые не видны в данный момент на просмотрщике, но я не стал заморачиваться).
    В буфер тайлы могут попасть двумя путями:
    1) Если тайл не сохранен на диске, то пробуем его загрузить из сети, если он загрузился то сохраняем его на диск и в буфер, если нет то берем рассчитываем область на самом нижнем слой тайлов (ее координаты), ресайзим и выводим, тут конечно тоже не плохо бы пронюхивать каждый слой ниже и если там есть сохраненный тайл пересчитывать и ресайзить его, но я тоже не стал заморачиваться.

    2) Если тайл сохранен на диске, то просто грузим его с диска.


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

    (То что описал может не соответствовать представленному в данном блоге коду, т.к. здесь представлен один из первых вариантов)
    Запись от Sanya_sa размещена 01.03.2017 в 17:41 Sanya_sa вне форума
    Обновил(-а) Sanya_sa 30.05.2019 в 14:46
  12. Старый комментарий
    Аватар для Sanya_sa
    SatanaXIII, Ну как то так в 2х словах.
    Запись от Sanya_sa размещена 01.03.2017 в 17:47 Sanya_sa вне форума
  13. Старый комментарий
    Аватар для SatanaXIII
    Sanya_sa, ясненько. Спасибо за развернутый ответ.
    Запись от SatanaXIII размещена 03.03.2017 в 15:06 SatanaXIII вне форума
 
Новые блоги и статьи
Что такое внедрение зависимостей и для чего оно применяется
bytestream 27.01.2025
В современной разработке программного обеспечения одной из ключевых проблем является управление зависимостями между различными компонентами системы. Внедрение зависимостей (Dependency Injection, DI). . .
Как установить cellpadding и cellspacing в CSS
bytestream 27.01.2025
При создании веб-страниц с табличными данными разработчики часто сталкиваются с необходимостью правильного оформления внутренних и внешних отступов в таблицах. В традиционной разметке HTML для этих. . .
Чем отличаются public, protected, package-private и private в Java
bytestream 27.01.2025
В языке программирования Java механизм модификаторов доступа играет ключевую роль в реализации одного из фундаментальных принципов объектно-ориентированного программирования - инкапсуляции. . . .
Зачем нужно explicit в C++. Преобразование типов
bytestream 27.01.2025
В мире программирования на C++ управление преобразованием типов данных играет crucial роль в создании надежного и безопасного кода. Язык C++ предоставляет множество механизмов для контроля над. . .
Как создать удалённую (remote) ветку в Git
bytestream 27.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления кодовой базой. Одним из ключевых. . .
Как создать утечку памяти в Java
bytestream 27.01.2025
Утечка памяти в Java представляет собой ситуацию, когда программа неэффективно использует доступную память, удерживая ссылки на объекты, которые больше не нужны для работы приложения. Несмотря на. . .
КуМир: как решать задачи на числа
bytestream 27.01.2025
КуМир (Комплект Учебных МИРов) представляет собой уникальную образовательную среду программирования, разработанную специально для обучения основам алгоритмизации и программирования. Эта система. . .
Исполнитель Черепаха в КуМир: как решать задачи
bytestream 27.01.2025
Исполнитель Черепаха в системе КуМир представляет собой мощный образовательный инструмент, который помогает освоить основы программирования через визуальное представление результатов выполнения. . .
КуМир: как решать задачи на массивы
bytestream 27.01.2025
Массивы представляют собой важнейшую структуру данных в программировании, и система КуМир предоставляет удобные инструменты для работы с ними. В контексте КуМир массив можно представить как. . .
[golang] 26. Remove Duplicates from Sorted Array
alhaos 27.01.2025
Необходимо удалить дубликаты из предоставленного целочисленного отсортированного по взрастанию слайса, нужно изменить значения в слайсе и вернуть количество элементов. / / . . .
КуМир, исполнитель Робот. Решение задач
bytestream 27.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения программированию, которая была создана в Отделении информатики Российской Академии наук. Эта система разработана. . .
Асинхронное программировани­е и async/await в JavaScript
bytestream 27.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в современной разработке на JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru