Как нарисовать карту из изображений? - PullRequest
3 голосов
/ 01 июня 2010

Я хочу написать приложение-навигатор, которое рисует карты из изображений. Карты должны быть нарисованы динамически, основываясь на навигации пользователя. Моя идея - загрузить 9 изображений в память, а затем создать представление для отображения нужной карты:

альтернативный текст http://img526.imageshack.us/img526/2574/screento.png

Когда пользователь перемещается, представление перемещается. При необходимости изображения, которые больше не видны, будут уничтожены, а новые будут загружены.

Моя первая проблема - я не могу заставить ее работать. :(. Моя вторая проблема в том, что он кажется слишком сложным и тратит ресурсы. Его также трудно масштабировать в случае изменения размера экрана.

Не могли бы вы показать мне эффективный алгоритм рисования карт? Демо-код в C # очень поможет. Библиотека с открытым исходным кодом будет высоко ценится. :)

Спасибо.

Ответы [ 3 ]

3 голосов
/ 02 июня 2010

Мы фактически используем это как вопрос для интервью. Я согласен с jk, вы должны использовать стороннюю библиотеку, но я дам вам идею

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

Вы шли по правильному пути, когда обсуждали разбиение его на более мелкие квадраты. Каждый квадрат должен содержать данные обо всех дорогах, которые проходят через него. Если дорога пересекает край, разбейте его на две части, по одной на каждом квадрате. Таким образом, в каждом квадрате достаточно данных для полной визуализации.

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

Наконец, вы, вероятно, захотите сделать разные уровни масштабирования. Лично я бы хранил совершенно отдельный набор блоков с несколькими различными уровнями масштабирования. Таким образом, вы можете соответствующим образом изменить размер блока.

Опять же, повторюсь, используйте продукт с полки, но нет проблем с использованием этого в качестве мысленного эксперимента.

3 голосов
/ 01 июня 2010

в зависимости от того, что вы хотите сделать, это может быть довольно сложной проблемой. например географическая привязка, проекция, GCS, вы не хотите создавать свои собственные

есть ряд доступных инструментов gis, которые уже делают подобные вещи, для c # и open source SharpMap или, возможно, Google Maps / Earth

есть также различные коммерческие библиотеки, например, ESRI или Luciad

1 голос
/ 11 июля 2010

OSMTracker сделан в VB.NET использует плитки OpenStreetMap (изображения) в качестве карты и показывает, что вы хотите. источник доступен. если вам не нравится VB, вы можете найти OpenStreetMap на codeplex.com для похожих проектов, выполненных в c #

...