Можно ли объединить mapAreas из ArcGISOnline в одну автономную карту на андроид? - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь создать автономную карту с помощью ArcGIS Runtime SDK для Android 100.5.0. Я следую заранее запланированному рабочему процессу в соответствии с руководством https://developers.arcgis.com/android/latest/guide/take-map-offline-preplanned.htm. Я создаю mapAreas в ArcGISOnline и пытаюсь загрузить их с устройства. Я хочу получить автономную карту, которая содержит все mapAreas вместе, как в приложении maps.me (на большой карте вы загрузили регионы с более подробной детализацией), но вместо этого я получаю автономную карту, созданную из последней загруженной области. Поэтому я создал mapArea "Europe" с масштабным миром - города и mapArea "Berlin" с масштабируемыми городами - зданиями (обе базовые карты - openstreetmaps, без слоев объектов) и успешно загрузил их, см. 2 tpk-файла в папке, но mobile_map.mmpk и Файлы package.info содержат только данные, относящиеся к последней загруженной области. Можно ли вообще получить то, что я хочу, объединить tpk файлы в одну карту?

Мой код в Котлине:

        val portal = Portal("https://www.arcgis.com/", false)
        val portalItem = PortalItem(portal, itemID)
        val offlineMapTask = OfflineMapTask(portalItem)
        //get all of the preplanned map areas in the web map
        val mapAreasFuture = offlineMapTask.preplannedMapAreasAsync
        mapAreasFuture.addDoneListener {
            try {
                // get the list of areas
                val mapAreas = mapAreasFuture.get()
                val directory = getDirectory()
                prepareDir(directory)
                // loop through the map areas
                var i = 0
                for (mapArea in mapAreas) {
                    mapArea.loadAsync()
                    mapArea.addDoneLoadingListener {
                        val downloadJob = offlineMapTask.downloadPreplannedOfflineMap(mapArea, directory)
                        downloadJob.start()

                        downloadJob.addJobDoneListener {
                            i++
                            if (i == mapAreas.size) {
                                val offlineMapPackage = MobileMapPackage(path)


                             offlineMapPackage.addDoneLoadingListener({
                               if (offlineMapPackage.getLoadStatus() === LoadStatus.LOADED) {

                                   val mobileMap = offlineMapPackage.getMaps().get(0)

                                   myCompletionFuncToShowMap(mobileMap)
                               } else {
                                   println("PACKAGING FAILED")
                               }
                             })
                             offlineMapPackage.loadAsync()
                           }
                        }

                    }

                }

            } catch (e: InterruptedException) {
                e.printStackTrace()
            } catch (e: Exception) {
                e.printStackTrace()
            }

1 Ответ

0 голосов
/ 15 мая 2019

Я продублировал вопрос на community.esri.com и получил ответ, благодаря Люку Смоллвуду из esri. Так что да, это возможно. Область карты «Европа» должна быть добавлена ​​в качестве слоя базовой карты, если я установил mapView.map на Berlin, а также каждая область карты должна быть сохранена в своем собственном каталоге.

Области загрузки:

val portal = Portal("https://www.arcgis.com/", false)
val portalItem = PortalItem(portal, itemID)
val offlineMapTask = OfflineMapTask(portalItem)
//get all of the preplanned map areas in the web map
val mapAreasFuture = offlineMapTask.preplannedMapAreasAsync
mapAreasFuture.addDoneListener {
    try {
        // get the list of areas
        val mapAreas = mapAreasFuture.get()
        val directory = getDirectory() //my function returns String path

        // loop through the map areas
        for (mapArea in mapAreas) {
            mapArea.loadAsync()
            mapArea.addDoneLoadingListener {
                val downloadJob = offlineMapTask.downloadPreplannedOfflineMap(mapArea, directory + "/" + mapArea.portalItem.title)
                downloadJob.start()
                downloadJob.addJobDoneListener {
                    val offlineMapPackage = MobileMapPackage(directory + "/" + mapArea.portalItem.title)
                    offlineMapPackage.addDoneLoadingListener({
                        if (offlineMapPackage.getLoadStatus() != LoadStatus.LOADED) {
                            println("PACKAGING FAILED")
                        }
                    })
                    offlineMapPackage.loadAsync()
                }
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}


Файлы после скачивания:

.../files/maps/Berlin/p13/129294b8-3a70-4d79-a421-24ff14cb19fc.tpk
.../files/maps/Berlin/p13/mobile_map.mmap
.../files/maps/Berlin/package.info
.../files/maps/Europa/p13/2547a985-c98f-49be-a187-5ae3b7a9da09.tpk
.../files/maps/Europa/p13/mobile_map.mmap
.../files/maps/Europa/package.info


Отображение автономной карты:

val path = getDirectory() + "/Berlin"
val offlineMapPackage = MobileMapPackage(path)
offlineMapPackage.addDoneLoadingListener {
    if (offlineMapPackage.getLoadStatus() == LoadStatus.LOADED && !offlineMapPackage.getMaps().isEmpty()) {
        mapView.map = offlineMapPackage.getMaps().get(0)
        val cache = TileCache(getDirectory() + "/Europa/p13/2547a985-c98f-49be-a187-5ae3b7a9da09.tpk")
        val layer = ArcGISTiledLayer(cache)
        mapView.map.basemap.baseLayers.add(layer)
        mapView.map.minScale = 1.8489297737236E7
        mapView.map.maxScale = 2256.994353
    } else {
        println("NO MAP FILES")
    }
}
offlineMapPackage.loadAsync()


Важно настроить mapView.map.minScale так, чтобы он включал уровни Европы, иначе на устройстве карта позволяет только масштабировать между уровнями Берлина. Уровни шкалы перечислены здесь https://www.esri.com/arcgis-blog/products/product/mapping/web-map-zoom-levels-updated/.

...