【问题标题】:Retrieve location from Firebase and put marker on google map api for android application从 Firebase 检索位置并将标记放在 google map api 上以用于 android 应用程序
【发布时间】:2018-03-16 15:14:20
【问题描述】:

我正在创建一个在线混乱应用程序,其中有两个登录名,一个用于混乱所有者,另一个用于用户,因此当混乱所有者将位置放入他的数据中时,用户端的地图上应该有标记。

这是imageDatabase structure中的数据库结构

请建议我编写代码来访问这些纬度和经度值,并为每个使用位置值注册的混乱在地图上创建标记。

【问题讨论】:

  • 您可以从数据库中获取数据并使用LatLng place = new LatLng(mProviderLatitude, mProviderLongitude);。然后就googleMap.addMarker(new MarkerOptions().position(place).title("Marker"));googleMap.moveCamera(CameraUpdateFactory.newLatLng(place));
  • 另外,我建议你使用 Firestore,它在 DB 中有一个明确的对象类型用于定位(即,纬度和经度作为对象同时被查询)
  • 我做了同样的代码,但它没有创建任何标记

标签: android firebase dictionary marker


【解决方案1】:

已编辑 我提议对数据库结构进行小幅调整...在“MessProviders”下创建另一个名为“locations”的节点,其用户ID、mProviderLatitude、mProviderLongitude、mProviderBrandName。 。 如果你有一个单独的 getter 和 setter 类,那就太好了。我的课程是'CordinatesModel'

private void messLocation() {
DatabaseReference currentDBcordinates = FirebaseDatabase.getInstance().getReference().child("Users").child("MessProviders").child("locations");
    currentDBcordinates.addValueEventListener(new ValueEventListener() {
    @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            //Create an array of markers
            int size = (int) dataSnapshot.getChildrenCount(); //
            Marker[] allMarkers = new Marker[size];
            mMap.clear();   //Assuming you're using mMap 
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
               //Specify your model class here
                CordinatesModel cordinatesModel = new CordinatesModel();
                //lets create a loop
                 for(int i=0;i<=size;i++) {
                    try {
                        //assuming you've set your getters and setters in the Model class
                          cordinatesModel.setmProviderLatitude(s.getValue(CordinatesModel.class).getmProviderLatitude());
                        cordinatesModel.setmProviderLongitude(s.getValue(CordinatesModel.class).getmProviderLongitude());
                        cordinatesModel.setmProviderBrandName(s.getValue(CordinatesModel.class).getmProviderBrandName());
                        //lets retrieve the coordinates and other information
                         Double latitude1 = cordinatesModel.getmProviderLatitude();
                Double longitude1 = cordinatesModel.getmProviderLongitude();
                String brandName=cordinatesModel.getmProviderBrandName();
                        //convert the coordinates to LatLng
                        LatLng latLng = new LatLng(latitude1, longitude1);
                        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                        //Now lets add updated markers

                     //lets add updated marker
                        allMarkers[i] = mMap.addMarker(new MarkerOptions()
                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).position(latLng).title(brandName));enter code here
                 }catch (Exception ex){}
                 }


           }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
 }

【讨论】:

  • 我试过这段代码,但没有用。你可以在这里查看我的项目代码github.com/Codie8/AutomatedMess1.git
  • 你好....我在另一个项目中使用上面的代码并且正在工作,好的..让我看看这个项目并给你反馈。
  • 好的,在我的项目中试试这个代码,让我知道会发生什么,非常感谢您抽出宝贵的时间。
  • 代码在哪里! Av 看到了您的项目,现在正在处理它,我将对数据库结构提出一些细微的更改并编辑我的第一个答案。
  • 我收到此错误“com.google.firebase.database.DatabaseException:发现名称冲突的 getter:isChangingConfigurations”
【解决方案2】:

您可以拥有一个根并选择它。然后在该根目录中的快照中检索所有纬度/经度。这是一个示例代码:

DatabaseReference locationRef = mRootRef.child("locations");
locationRef.addValueEventListener(new com.firebase.client.ValueEventListener() {
    @Override
    public void onDataChange(com.firebase.client.DataSnapshot dataSnapshot) {


        for (DataSnapshot snapm: dataSnapshot.getChildren()) {

            Double latitude = snapm.child("0").getValue(Double.class);
            Double longitude = snapm.child("1").getValue(Double.class);
            }
        }
    @Override
    public void onCancelled(FirebaseError firebaseError) {
        throw firebaseError.toException();

    }
});

【讨论】:

  • 第一行的“Firebase”是什么?它在程序中显示错误。
  • 现在甚至没有使用 Firebase。它是旧的。立即编辑。
【解决方案3】:
 mDb = FirebaseDatabase.getInstance().getReference().child("Users").child("MessProviders").child("zZvkbgUbFohCwtYRfORUM0DBSZR2").child("ProfileInformation");
        mDb.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                    String name = dataSnapshot.child("mProviderBrandName").getValue(String.class);
                    double latt = dataSnapshot.child("mProviderLatitude").getValue(Double.class);
                    double lngg = dataSnapshot.child("mProviderLongitude").getValue(Double.class);
                    mMap.addMarker(new MarkerOptions().position(new LatLng(latt, lngg)).title(name));

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

这是用于在地图上放置标记的代码,但问题是我手动提供用户 ID,因此我将只创建一个标记,但我想为每个用户创建标记系统如何获取用户 ID 并创建标记对于每个用户 ID ??

【讨论】:

  • 使用我给你的代码!转到位置节点下的火力基地!手动添加另一个品牌名称和各自的经纬度!添加几个用于测试目的的位置...然后在客户端检查您的地图!同时让我再次检查代码!
  • 我添加了一个新方法 onMapReady,即 setOnMapClickListener,它允许您单击地图上的任意位置,这反过来又调用了我定义的另一个方法,称为 markers(),它允许放置标记在任何特定点并选择点经度和纬度。
猜你喜欢
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 2021-08-25
  • 2014-08-19
  • 1970-01-01
相关资源
最近更新 更多