【问题标题】:Create multiple markers on a map with a Firestore database使用 Firestore 数据库在地图上创建多个标记
【发布时间】:2019-05-31 13:42:21
【问题描述】:

我想根据在 Google 地图上按类型查询来显示多个标记,并且我正在使用 Firestore 来存储我的数据。尝试在 Android 中使用我的 Firestore 数据库创建标记时,我感到有些困惑和迷失。我不知道如何正确地将默认标记创建连接到 Firebase 的查询功能。

我在四种字段类型中存储了有关悉尼一些绿色植物的信息。我有三个字符串(名称、类型和信息)和一个带有坐标的地理点类型。我的数据库结构如下所示:

我找到了一些教程,这些教程展示了如何从 Firestore 数据库加载字符串值并将它们加载到您的应用程序中,但我没有找到适合初学者在地图上加载地理信息的解释。我试图修改基本代码以在 Google Developers 上创建一个标记,但显然没有任何结果。所以我的代码并不多。

private GoogleMap mMap; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference citiesRef = db.collection("sydney_nature");
Query query = citiesRef.whereEqualTo("type", "Park");

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in 
    Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    mMap.animateCamera( CameraUpdateFactory.zoomTo( 10.0f ) );
     }

我希望创建标记,通过单击打开一个显示地点名称的信息框。目前我什么也得不到,因为我无法执行正确的查询。 @Alex Mamo 我当前的错误:

【问题讨论】:

  • 请添加您的数据库结构以查看您如何在文档中存储 GeoPoint。
  • @AlexMamo 谢谢你,我更新了我的帖子!
  • 所以基本上你想将points_au (collction) -> Park (document)下的geo添加到地图中,对吧?
  • @Alex Mamo 是的,正确!
  • 好的,我给你写一个答案。

标签: java android google-maps google-cloud-firestore


【解决方案1】:

要在地图上显示points_au (collction) -> Park (document)下的geo,请使用以下代码行:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference pointsRef = rootRef.collection("points_au");
DocumentReference parkRef = pointsRef.document("Park");
parkRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                GeoPoint geo = document.getGeoPoint("geo");
                String name = document.getString("name");
                double lat = geo.getLatitude();
                double lng = geo.getLongitude();
                LatLng latLng = new LatLng(lat, lng);
                mMap.addMarker(new MarkerOptions().position(latLng).title(name));
            }
        }
    }
});

结果将是一个添加到地图上的标记,其标题为Royal Botanic Gardens

【讨论】:

  • 你尝试运行代码了吗?不幸的是,我遇到了几个错误。我可以在这里发布我的其余代码。
  • 是的,已经过测试。有哪些错误?将它们粘贴到此处。
  • 错误: 预期(在 get() 方法之后)错误:';'预期(在get()方法之后)错误:类型的非法开始(在第一个之后)错误:'('预期(在第一个DocumentSnapshot之后)错误:';'预期(在public void onComplete之后)错误:';'预期(在第一个“任务”之后)错误:类型的非法开始(在最后一个大括号之后)此外,“获取”和“任务”无法解决。它在@NonNull 处显示“此处不允许注释”。希望这会有所帮助。
  • 给我看你的错误截图,让我看得更清楚。
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2017-06-24
  • 2013-05-14
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多