获取存储的LatLng以在单击时显示地图上的位置

时间:2017-04-07 01:50:09

标签: android firebase firebase-realtime-database google-places-api gmsplacepicker

我正在使用Android PlacePicker使用place.getLatLng();方法在我的Firebase数据库中存储位置的纬度和经度。

我还使用place.getName();方法存储了位置的名称。

位置的名称在用户的帖子中可见,但纬度和经度不是。我的意图是,如果任何用户在视图中点击该地点的名称,他们将被带到PlacePicker将在地图中显示该位置的活动。

这是firebase JSON的一个例子

{
  "dPicture" : "https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/Profile_images%2Fcropped175425077.jpg?alt=media&token=d40abdda-d4e7-450b-b215-a8bb0ee1ce4d",
  "image" : "https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/Post_Images%2Fcropped945668710.jpg?alt=media&token=2db5ee7c-9c98-4512-98ea-7ec984e5306b",
  "latLong" : "lat/lng: (-6.190593300000001,106.8061219)",
  "summary" : "yo",
  "place" : "the biggest mall in Asia",
  "uid" : "bFVSFnu6uJcfOEmCGeYpmmRsjQA2",
  "username" : "Rambo"
}

我知道如何将存储的Lat和Long作为额外的活动发送给其他活动,例如

postRef = FirebaseDatabase.getInstance().getReference().child("posts");
viewHolder.mPlaceName.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        postRef.child(post_key).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                final String latLng = dataSnapshot.child("latLong").getValue().toString();
                                Intent mapIntent = new Intent(MainActivity.this, MapActivity.class);

                                mapIntent.putExtra("LatLng",latLng);
                                startActivity(mapIntent);

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }
                });

但是如何自动使用Lat和Long值自动让PlacePicker在MapActivity中的地图中显示该位置?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,像这样更改您的架构

{
  "dPicture" : "https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/Profile_images%2Fcropped175425077.jpg?alt=media&token=d40abdda-d4e7-450b-b215-a8bb0ee1ce4d",
  "image" : "https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/Post_Images%2Fcropped945668710.jpg?alt=media&token=2db5ee7c-9c98-4512-98ea-7ec984e5306b",
  "lat": "-6.190593300000001",
  "lng": "106.8061219",
  "summary" : "yo",
  "place" : "the biggest mall in Asia",
  "uid" : "bFVSFnu6uJcfOEmCGeYpmmRsjQA2",
  "username" : "Rambo"
}

将它们视为两个单独的值,或者如果您希望将它们视为一个,您可以像这样将它们视为

{
  "dPicture" : "https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/Profile_images%2Fcropped175425077.jpg?alt=media&token=d40abdda-d4e7-450b-b215-a8bb0ee1ce4d",
  "image" : "https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/Post_Images%2Fcropped945668710.jpg?alt=media&token=2db5ee7c-9c98-4512-98ea-7ec984e5306b",
  "coords": {
      "lat": "-6.190593300000001",
      "lng": "106.8061219",
  }
  "summary" : "yo",
  "place" : "the biggest mall in Asia",
  "uid" : "bFVSFnu6uJcfOEmCGeYpmmRsjQA2",
  "username" : "Rambo"
}

要查询它们:

对于架构的第一个版本:

postRef = FirebaseDatabase.getInstance().getReference().child("posts");
viewHolder.mPlaceName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        postRef.child(post_key).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               final String lat = dataSnapshot.child("lat").getValue().toString();
               final String lng = dataSnapshot.child("lng").getValue().toString();
               Intent mapIntent = new Intent(MainActivity.this, MapActivity.class);
               mapIntent.putExtra("lat",lat);
               mapIntent.putExtra("lng",lng);
               startActivity(mapIntent);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }
});

对于架构的第二个版本:

postRef = FirebaseDatabase.getInstance().getReference().child("posts");
viewHolder.mPlaceName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        postRef.child(post_key).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               final String lat = dataSnapshot.child("coords").child("lat").getValue().toString();
               final String lng = dataSnapshot.child("coords").child("lng").getValue().toString();
               Intent mapIntent = new Intent(MainActivity.this, MapActivity.class);
               mapIntent.putExtra("lat",lat);
               mapIntent.putExtra("lng",lng);
               startActivity(mapIntent);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }
});

您可以实施适合您的工作,但我建议第二个用于组织偏好。

要在下一个活动中展示它们,假设您在应用中设置了Google地图,请使用以下代码:

@Override
public void onMapReady(GoogleMap map) {
    map.addMarker(new MarkerOptions()
        //get this LatLng values from the Intent
        .position(new LatLng(<yourLat>, <yourLng>))
        .title("Hello world"));
}

尝试阅读此内容:https://developers.google.com/maps/documentation/android-api/marker