【问题标题】:Marker from Firestore map data type来自 Firestore 地图数据类型的标记
【发布时间】:2019-07-01 14:52:23
【问题描述】:

在 Firestore 中,我有一个名为 latlng 的地图数据类型,它具有位置的纬度和经度。我想在 Android 中使用此信息作为标记的位置。我本能地想使用这段代码,但这是错误的,因为它需要 (double, double) 而不是 (Object)

MarkerOptions options = new MarkerOptions().position(new LatLng(document.get("latlng")))

编辑

考虑到 Firebase 字段是 Map 数据类型,因为它是通过这种方式从 Google Place API 自动导入的。

【问题讨论】:

  • 你能发布你的错误日志吗
  • @Zachary done :) 错误是它需要(double, double) 而不是(Object)
  • 太棒了。编码愉快!
  • 大声笑。 @Zachary,OP 并没有说他已经解决了他的问题。
  • 哈哈@Taslim,找到确切的错误是问题所在,一旦找到,解决方案就来了兄弟:)

标签: android google-maps-markers geofirestore


【解决方案1】:

试试这个,它绝对适合你。

db.collection("latlng")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            HashMap hashmap = (HashMap) document.getData();
                            GeoPoint geopoint = new GeoPoint(hashmap.get("latitude"), hashmap.get("longitude"));
                            MarkerOptions options = new MarkerOptions().position(new LatLng(geopoint.getLatitude(), geopoint.getLongitude()));
                        }
                    } else {
                        // handle your errors here
                    }
                }
            });

基本上,上面的代码库在 latlng 节点处查询 Firestore,并获取该位置的所有地理点。然后它继续在每个坐标处显示一个标记。我真的希望这会有所帮助。

附录

有一种更简单的方法可以从 FirebaseDatabase 存储和检索位置值。您可以使用GeoFire 轻松保存和检索。阅读the ReadMe of the official repository 以获得更好的理解。

我希望这会有所帮助。编码愉快!

【讨论】:

  • 您检查过 Firestore 中的规则吗?很有可能这是问题所在,因为我多次重用了这段代码 sn-p 并且它一直对我有用。只需检查您遇到的错误。
  • 我收到此错误:java.lang.ClassCastException: java.util.HashMap cannot be cast to com.google.firebase.firestore.GeoPoint 考虑到 Firebase 字段是一种地图数据类型,因为每次我使用 Google Place API 添加新文档时都会以这种方式自动创建它
  • 大声笑,我现在可以确切地看到问题所在。我会更新这个答案。
  • @TaslimOseni 你更新你的答案了吗?我似乎得到“GeoPoint 中的 GeoPoint(double, double) 不能应用于 (java.lang.Object, java.lang.Object)”
  • @badaboomskey,我编辑了答案,这种方法在这里很好用。您可以尝试将 lat 和 lng 值存储在原始双变量中,然后使用它们创建 GeoPoint。那应该可以。
【解决方案2】:

如果您在此处看到文档:LatLng

唯一可用的公共构造函数是LatLng(double latitude, double longitude)

编辑:

创建一个新类来解析引用。

public class MyLatLng {
    public Double latitude;
    public Double longitude;
 public MyLatLng(Double latitude, Double longitude) {
   this.latitude = latitude;
   this.longitude = longitude;
 }     
}

在你的引用类中创建一个新变量来解析LatLng

public MyLatLng latlng;

现在

MarkerOptions options = new MarkerOptions().position(new LatLng(document.latitude, document.longitude));

【讨论】:

  • 谢谢。我试过了,但我收到了这个错误消息java.lang.ClassCastException: java.util.HashMap cannot be cast to com.google.android.gms.maps.model.LatLng
  • @Stefano 我已经更新了答案。如果您遇到任何问题,请告诉我。
  • 谢谢。考虑到我没有使用 Firebase 存储,而是使用 Firebase 数据库。由于Cannot resolve method,我在.get("Latitude") 中收到错误
  • @Stefano 我已经更新了答案。如果不起作用,请告诉我您的方法的返回变量类型是什么document.get("latlng")
【解决方案3】:

使用

import com.google.firebase.firestore.GeoPoint;

并将值放在类型上

GeoPoint geopoint;

然后从那里检索经纬度。

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2019-05-28
    • 2017-10-17
    相关资源
    最近更新 更多