Карты офлайн.
Простейший пример получения тайлов с картографических серверов. Их сохранение на диск и использование. Все формулы взяты с https://msdn.microsoft.com/en-... 59689.aspx, подробнее о проекции Меркатора https://ru.wikipedia.org/wiki/... 1%80%D0%B0 . Возможно кому нибудь поможет. В итоге можно доработать и получить неплохой контрол для работы с картами в офлайн. Например у меня реализованы (в полной версии) следующие функции: - поддержка работы с несколькими картографическими сервисами (Гугл, ВиртуалЭс, OSM) - возможность нанесения на карту "точек маркеров" (например для построения маршрута) - возможность выбора зоны загрузки тайлов с учетом уровня детализации - ну и еще всяка разна. Добавил архив MapView, там можно зажав Ctrl, колесиком мыши вращать карту. |
Всего комментариев 13
Комментарии
-
Интересная статья. Помню как-то видел описание метода хранения тайлов на хабре.
Не по теме:
А заголовок у вас с ошибкой...
Запись от castaway размещена 07.11.2016 в 21:06 -
Запись от snake32 размещена 22.11.2016 в 15:47 -
Запись от Sanya_sa размещена 22.11.2016 в 15:52
Обновил(-а) Sanya_sa 22.11.2016 в 15:54 -
Запись от snake32 размещена 22.11.2016 в 18:00 -
Запись от Sanya_sa размещена 22.11.2016 в 18:02
Обновил(-а) Sanya_sa 23.11.2016 в 11:16 -
Увидел вашу запись - созрел вопрос: Не в курсе ли вы, есть ли возможность сделать карту водоемов глубин для эхолота Lowrance. А конкретно нужна карта реки Днепр с глубинами. Заранее спасибо
Запись от WolF_RaM размещена 30.11.2016 в 13:38 -
есть ли возможность сделать карту водоемов глубин для эхолота Lowrance не совсем понятен вопрос. Данный эхолот работает с какими то картами (определенного формата)? Если да то возможно существует софт который их строит а так по глубинам можно использовать например сервис Мультимапс.https://multimaps.ru/#x=46.828... 12&t=depth
Запись от Sanya_sa размещена 30.11.2016 в 13:47 -
GMap.Net сохранить путь к gmdb
Доброго времени суток Осваиваю работу с GMap.Net Есть база gmdb необходимо указать к ней путь Как это сделать программноЗапись от csm7 размещена 01.03.2017 в 13:42 -
Запись от Sanya_sa размещена 01.03.2017 в 13:45 -
Запись от SatanaXIII размещена 01.03.2017 в 15:05 -
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 30.05.2019 в 14:46 -
Запись от Sanya_sa размещена 01.03.2017 в 17:47 -
Запись от SatanaXIII размещена 03.03.2017 в 15:06