Отображение слоев 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 встроенный метод (он настроен и всегда обновлен)