簡體   English   中英

在 Android Studio 上的 Kotlin 中使用 Mapbox 實現 Geojson 點以映射和定位我

[英]Implement Geojson points to map and locate me with Mapbox, in Kotlin on Android Studio

我的問題是關於 Mapbox。 在此期間,我正在研究基於 mapbox 的 ANDROID 應用程序,使用 Kotlin 和 Fragments,我的問題涉及地圖本身上點的可視化。 那就是我的需要是能夠通過 GEOJSON 文件在地圖上顯示點,現在我已經能夠在應用程序中完整地看到地圖,但是我找不到一種方法來顯示從 GeoJson 文件中獲取的點並通過按鈕在地圖中定位自己。 我應該在片段中實現這兩個功能,所以我的問題恰恰是無法顯示 geojson 文件的點並找到一種方法來在地圖本身中定位自己。 如果有人能夠幫助我解決這個問題,我會等待幫助,我還將片段類的代碼保留在 kotlin 中。 提前謝謝大家!!

碎片之家

class HomeFragment : Fragment() {

        private var mapView: MapView? = null

        @Nullable
        override fun onCreateView(
            inflater: LayoutInflater,
            @Nullable container: ViewGroup?,
            @Nullable savedInstanceState: Bundle?
        ): View? {
            Mapbox.getInstance(
                context!!.applicationContext,
                "MIO CODICE MAPBOX"
            )
            val view: View = inflater.inflate(R.layout.fragment_home, container, false)
            mapView = view.findViewById<View>(R.id.mapView) as MapView
            mapView!!.onCreate(savedInstanceState)
            return view
        }

        override fun onResume() {
            super.onResume()
            mapView!!.onResume()
        }

        override fun onPause() {
            super.onPause()
            mapView!!.onPause()
        }

        override fun onSaveInstanceState(outState: Bundle) {
            super.onSaveInstanceState(outState)
            mapView!!.onSaveInstanceState(outState)
        }

        override fun onLowMemory() {
            super.onLowMemory()
            mapView!!.onLowMemory()
        }

        override fun onDestroyView() {
            super.onDestroyView()
            mapView!!.onDestroy()
        }
    }

主辦活動:

class HostActivity : AppCompatActivity() {
    lateinit var googleSignInClient: GoogleSignInClient
    private lateinit var navController: NavController
    private val mAuth: FirebaseAuth = FirebaseAuth.getInstance()
    private val db: FirebaseFirestore = FirebaseFirestore.getInstance()
    private lateinit var drawerLayout: DrawerLayout
    private lateinit var navViewBinding: DrawerHeaderLayoutBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AppTheme)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_host)
        val toolbar = customToolbar
        setSupportActionBar(toolbar)

        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
        googleSignInClient = GoogleSignIn.getClient(this, gso)

        drawerLayout = drawer_layout
        navViewBinding = DrawerHeaderLayoutBinding.inflate(layoutInflater, navView, true)
        val navHost =
            supportFragmentManager.findFragmentById(R.id.navHostFragment) as NavHostFragment
        navController = navHost.navController

        val navInflater = navController.navInflater

        val graph = navInflater.inflate(R.navigation.main_graph)

        navController.addOnDestinationChangedListener { _, destination, _ ->
            if (destination.id == R.id.onBoarding ||
                destination.id == R.id.authFragment ||
                destination.id == R.id.loginFragment ||
                destination.id == R.id.signUpFragment
            ) {
                toolbar.visibility = View.GONE
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
            } else {
                toolbar.visibility = View.VISIBLE
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
            }
        }
        if (!Prefs.getInstance(this)!!.hasCompletedWalkthrough!!) {
            if (mAuth.currentUser == null) {
                graph.startDestination = R.id.authFragment
            } else {
                getUserData()
                graph.startDestination = R.id.homeFragment
            }
        } else {
            graph.startDestination = R.id.onBoarding

        }
        navController.graph = graph

        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
        navView.setupWithNavController(navController)
        navView.setNavigationItemSelectedListener {
            it.isChecked
            drawerLayout.closeDrawers()
            when (it.itemId) {
                R.id.action_logout -> {
                    MyApplication.currentUser!!.active = false
                    FirestoreUtil.updateUser(MyApplication.currentUser!!) {
                        mAuth.signOut()
                    }
                    googleSignInClient.signOut()
                    MyApplication.currentUser = null
                    navController.navigate(R.id.action_logout)
                }
            }
            true
        }
    }

    private fun getUserData() {

        val ref = db.collection("users").document(mAuth.currentUser!!.uid)

        ref.get().addOnSuccessListener {
            val userInfo = it.toObject(UserModel::class.java)
            navViewBinding.user = userInfo
            MyApplication.currentUser = userInfo
            MyApplication.currentUser!!.active = true
            FirestoreUtil.updateUser(MyApplication.currentUser!!) {
            }
        }.addOnFailureListener {
            val intent = Intent(this, MyApplication::class.java)
            startActivity(intent)
            finish()
        }
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(navController, drawerLayout)
    }

}

您需要使用GeoJsonSource https://github.com/mapbox/mapbox-android-demo/search?q=GeoJsonSource顯示演示應用程序如何使用源。

https://github.com/mapbox/mapbox-android-demo/blob/master/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/basics/KotlinSupportMapFragmentActivity.kt它的XML布局文件

在地圖上放置圖標。 https://docs.mapbox.com/android/maps/examples/marker-symbol-layer/ 在片段的onStyleLoaded()回調中執行所有圖標設置,如https://github.com/mapbox/mapbox-android-demo/blob/master/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo /examples/basics/KotlinSupportMapFragmentActivity.kt#L51-L55

https://github.com/mapbox/mapbox-android-demo/search?q=loadGeojson顯示演示應用程序如何從 GeoJson 文件加載。 您可以使用協程而不是構建 AsyncTask。

盡管它使用 Java,但https://docs.mapbox.com/android/maps/examples/show-a-users-location-on-a-fragment/展示了如何將 Maps SDK 的LocationComponent與片段組合在一起。

關於在單擊按鈕時將相機移動到設備的最后一個已知位置,請參閱我在https://stackoverflow.com/a/64159178/6358488 上的回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM