У меня огромный графический файл, и я хотел бы создать наложение на Карты Google. Нужно ли создавать плитки? - PullRequest
2 голосов
/ 22 июня 2011

В настоящее время я работаю над приложением, отображающим пользовательскую карту (это сделал какой-то художник из моего города), и мне хотелось бы создать наложение для города в Картах Google.

Чтобы пользователь моготкрыть MapView с этим наложением.

Поскольку графический файл действительно огромен (12 км * 7 км - это около 75 МБ в среднем / низком разрешении), мне удалось это сделать (вот код): http://www.androidsnippets.com/drawing-an-image-as-a-map-overlay2

   MapView map = (MapView) findViewById(R.id.mapview);
    MapController mapController = map.getController();
    List<Overlay> overlays = map.getOverlays();
    overlays.add(new DrawableMapOverlay(this, point, R.drawable.my_drawable);
    map.invalidate();

Поскольку файл очень тяжелый, приложение очень медленное.

Как я могу улучшить это, нужно ли разделить карту на Tiles?

Есть ли идея / проект?что может помочь мне?

Ответы [ 4 ]

0 голосов
/ 30 июля 2011

Вы хотите написать программу листов вручную и использовать пространственный индекс или кривую заполнения пространства для автоматического процесса создания листов.Си уменьшает 2d сложность до 1d сложности.Похоже на дерево и фрактал.Есть некоторые си, как z-кривая, кривая Пеано или кривая Гильберта.Я думаю, что вы можете выбрать свой собственный si, но Google, например, использует z-кривую, как и большинство других картографических приложений.Си используется во многих других задачах, таких как тепловые карты, древовидные карты, дополненная реальность, сравнение изображений, сжатие изображений.Особенно полезна кривая Гильберта, потому что она пересекает 2-мерное пространство в рекурсивном коде, также известном как серый код, который отличает адрес каждой соседней плитки только на один бит, а также очень хорошо заполняет пространство (http://en.wikipedia.org/wiki/List_of_fractals_by_Hausdorff_dimension). Вы хотите посмотретьдля блога quadtree по пространственному индексу кривой Гильберта Ника. Недостатком кривой Гильберта является то, что его сложно реализовать, и тайл всегда имеет степень 2.

0 голосов
/ 04 июля 2011

Не уверен, если вы все еще ищете ответ, но http://www.maptiler.org/ - это то, что вам нужно.

0 голосов
/ 30 июля 2011

Если вы не можете загрузить файл локально, вам потребуется использовать решения с открытым исходным кодом, такие как mapserver (mapserver.org) или геосервер.

У меня есть опыт работы с обоими, но я предпочитаю использовать mapserver.

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

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

Загрузка изображения локально не очень хорошая идея, если данные карты слишком велики.Вы должны разделить его, используя maptiler (как упомянуто в моем предыдущем ответе), а затем сохранить плитки (возможно, в zip-файле) и использовать клиент, такой как osmdroid, для навигации по нему.

0 голосов
/ 22 июня 2011

Вам нужно реализовать какое-то решение "lazyload" .... сейчас я не очень много работал с ним, но это может быть в состоянии загружать только те части изображения, которые просматривает пользователь, вместо загрузки всей вещи водин раз.Когда пользователь перемещается, он отображает новую область ... Я знаю, что вы можете сделать это с помощью массива маркеров карты ... вы можете использовать его для lazyload и изображения.Проверьте это: MapView Overlay Manager

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

...