You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android端通过Google Maps SDK添加自定义兴趣点

实现Android地图自定义经纬度标记的完整方案

没问题,我来帮你一步步搞定这个需求——从存储经纬度到让多用户在地图上看到标记,全程给你捋清楚!

1. 先把经纬度存储到数据库

首先得把传入的经纬度元组存起来,分本地存储和远程存储两种场景,看你是单用户使用还是多用户协作:

本地存储(用Room数据库)

如果只是本地用户使用,Room是Android官方推荐的ORM框架,代码示例很直观:

  • 先定义标记实体类:
@Entity(tableName = "custom_markers")
data class MarkerEntity(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val latitude: Double,
    val longitude: Double,
    // 可以额外加标题、描述、创建者ID这些字段,方便后续扩展
    val title: String? = "自定义标记",
    val creatorId: String? = null
)
  • 然后写Dao接口,负责数据库操作:
@Dao
interface MarkerDao {
    @Insert
    suspend fun insertMarker(marker: MarkerEntity)

    @Query("SELECT * FROM custom_markers")
    suspend fun getAllMarkers(): List<MarkerEntity>

    // 要是需要按范围或者创建者筛选,加对应的Query就行
}
  • 最后在ViewModel或者Repository里调用插入方法,把传入的经纬度存进去:
// 假设拿到了传入的lat和long
val newMarker = MarkerEntity(latitude = 39.9042, longitude = 116.4074)
lifecycleScope.launch {
    markerDao.insertMarker(newMarker)
}

远程存储(多用户协作必备)

如果要让其他用户也能看到,就得用远程数据库,比如Firebase Firestore或者自己搭建的后端API。这里拿Firestore举例子:

// 组装标记数据
val markerData = hashMapOf(
    "latitude" to 39.9042,
    "longitude" to 116.4074,
    "title" to "北京天安门",
    "creatorId" to currentUserUid // 记录创建者ID,方便后续权限控制
)

// 上传到Firestore
FirebaseFirestore.getInstance()
    .collection("shared_markers")
    .add(markerData)
    .addOnSuccessListener {
        Log.d("Marker", "标记上传成功!")
    }
    .addOnFailureListener { e ->
        Log.e("Marker", "上传失败:${e.message}")
    }

2. 在MapView上添加自定义标记

假设你用的是Google Maps的MapView,核心是在onMapReady回调里获取地图实例,然后从数据库拉取数据添加标记:

基础标记添加

override fun onMapReady(googleMap: GoogleMap) {
    this.mGoogleMap = googleMap

    // 从数据库拉取标记列表(协程异步操作,避免阻塞主线程)
    lifecycleScope.launch {
        val markers = markerDao.getAllMarkers() // 远程的话就从Firestore查询
        markers.forEach { marker ->
            val latLng = LatLng(marker.latitude, marker.longitude)
            mGoogleMap.addMarker(
                MarkerOptions()
                    .position(latLng)
                    .title(marker.title)
                    // 这里可以设置自定义图标,替换默认的红色标记
                    .icon(getCustomMarkerIcon())
            )
        }
    }
}

自定义标记图标

要是不想用默认图标,自己生成一个:

private fun getCustomMarkerIcon(): BitmapDescriptor {
    val drawable = ContextCompat.getDrawable(requireContext(), R.drawable.your_custom_marker) ?: return BitmapDescriptorFactory.defaultMarker()
    drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
    val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bitmap)
    drawable.draw(canvas)
    return BitmapDescriptorFactory.fromBitmap(bitmap)
}

3. 让其他用户获取并显示标记

多用户场景下,关键是实时或者定时拉取最新的标记数据:

实时监听远程数据(Firestore为例)

用Firestore的快照监听,一旦有新标记上传,自动更新地图:

FirebaseFirestore.getInstance()
    .collection("shared_markers")
    .addSnapshotListener { snapshot, e ->
        if (e != null) {
            Log.w("Marker", "监听失败:${e.message}")
            return@addSnapshotListener
        }

        snapshot?.let {
            val markers = it.toObjects(MarkerEntity::class.java)
            // 先清空现有标记,再添加新的
            mGoogleMap.clear()
            markers.forEach { marker ->
                val latLng = LatLng(marker.latitude, marker.longitude)
                mGoogleMap.addMarker(MarkerOptions().position(latLng).title(marker.title))
            }
        }
    }

注意事项

  • 别忘了在Manifest里加必要权限:ACCESS_FINE_LOCATION、INTERNET,还有Google Maps API密钥的配置。
  • 如果是自己搭建后端,要写对应的API接口,让客户端发起GET请求拉取标记列表,然后解析成实体类再添加到地图上。

如果还有具体细节比如数据库选型、标记点击事件处理的问题,随时问我!

内容的提问来源于stack exchange,提问作者Dimitar Filipov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:08:20