Отображение слоев KML на картах в приложении для мобильных приложений

У меня есть большой файл KML для родного приложения Android, пожалуйста, проверьте следующие данные и дайте совет.

Сведения о файле KML:

  • размер: 1,7 МБ
  • общее количество элементов файла kml: 500 элементов
  • общее количество полигонов: 1000 многоугольников

Сведения о приложении Android:

  • вышеуказанные данные будут отображаться в разделе "Фрагмент"
  • Я использовал следующую библиотеку поддержки для реализации этого экрана компилировать 'com.google.maps.android:android-maps-utils:0.4 +'
  • некоторые нагрузки выполняются при загрузке экранов (например, вычисления расстояний)

Вопрос

  • Возьмите много времени, чтобы загрузить карту и слой kml около 8 секунд создать экземпляр KMLLayer

Какова наилучшая практика для реализации вышеуказанных данных с хорошей производительностью?

сообщите пожалуйста.

Ответы

Ответ 1

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

1) создайте и начните загрузку слоя KML как можно скорее (например, при создании приложения) и просто покажите его;

2) вместо одного файла kml с 500 элементами и 1000 полигонов, используйте 50-километровые файлы с 10 элементами и 100 полигонов и загружайте на слой только необходимые файлы (например, вы можете разбить его по области или семантической информации, или другими критериями);

3) объединить 1 и 2 точки;

4) именно для карт Google можно создавать плитки с информацией из файлов kml и использовать TileProvider.

Ответ 2

Поскольку ответа нет, я отправлю собственное решение.

Я сделал в основном две вещи, чтобы оптимизировать это.

  • Вместо использования встроенного метода Google maps utils addLayerToMap - я использовал собственную собственную реализацию. Я сделал это, потому что парсинг kml относительно быстр (в моем случае - ~ 5-10 секунд), и это можно сделать в фоновом потоке. Однако добавление всех точек на карту занимает более 10 секунд и должно выполняться в потоке пользовательского интерфейса. В принципе, я использовал класс KmlLayer в качестве базы и самостоятельно разбирал файл kml в polygonOptions и все, что мне нужно.

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

При использовании этих хакеров вместо замораживания приложения в течение 15 секунд пользователь может свободно перемещаться по карте, а когда он останавливается, через несколько секунд будет отображаться информация.

Ответ 3

Я просто делаю некоторые обновления поведения на экране, чтобы получить хорошую производительность и хороший пользовательский интерфейс, выполнив следующие шаги:

  • Разделите файл KML на 65 файлов (основные области на карте, например, зона A11 находится в одном файле KML и содержит все его детали, такие как Zone A11-1, Zone A11-2 и Zone A11-4...), и это разделение выполняется для того, чтобы соответствовать опыту на экране (например, требованиям пользователя).

  • при первом загрузке я загружаю только маркеры для всех центров KML, и это не влияет на производительность

  • Когда пользователь нажимает на маркер, я загружаю KML файл для этой области и масштабирую эту область

  • Когда пользователь уменьшает масштаб, я удаляю этот слой с карты и маркер загрузки

  • Когда пользователь перемещает карту, я вычисляю ближайший маркер и загружаю его слой KML

Примечание: подготовка файлов при запуске приложения не обеспечит лучшую производительность, потому что плохая производительность связана с добавлением слоя KML к карте google

Примечание2: использование пользовательской реализации для синтаксического анализа и добавления в карту Google занимает много времени или требует много модульного тестирования, и я думаю, что это не рекомендуется, потому что лучше оставить это решение быть в Google Map utils встроенный метод (он настроен и всегда обновлен)