如何刷新地图上的标记? [英] How to refresh the Marker on the Map?

查看:136
本文介绍了如何刷新地图上的标记?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在地图上只有2个标记

1-我想用最大缩放比例来显示标记



2-我希望用定时器刷新标记位置。



我想用这个排序来加载A和B的信息从服务器。我是一个Beginer

这是我的代码:

$ p $ import android .content.Context;
导入android.content.SharedPreferences;
导入android.content.pm.PackageManager;
导入android.support.v4.app.ActivityCompat;
导入android.support.v4.app.FragmentActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Test扩展FragmentActivity实现OnMapReadyCallback {
RequestQueue requestQueue;
字符串b_lat,b_lon,a_lat,a_lon;

私有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);


}



@覆盖
public void onMapReady(GoogleMap googleMap){
mMap = googleMap ;

LatLng a_local = new LatLng(Double.parseDouble(a_lat),Double.parseDouble(a_lon));
LatLng b_local = new LatLng(Double.parseDouble(b_lat),Double.parseDouble(b_lon));

mMap.addMarker(new MarkerOptions()。position(a_local).title(a)
.snippet(xxx)
.icon(BitmapDescriptorFactory.fromResource R.drawable.marker_a)))showInfoWindow();

mMap.addMarker(new MarkerOptions()。position(b_local).title(b)
.snippet(yyy)
.icon(BitmapDescriptorFactory.fromResource R.drawable.marker_b)))showInfoWindow();


mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mMap.getUiSettings()。setZoomControlsEnabled(true);
mMap.getUiSettings()。setCompassEnabled(true);
mMap.getUiSettings()。setAllGesturesEnabled(true);
mMap.getUiSettings()。setMyLocationButtonEnabled(true);
if(ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED&&& ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){

return;
}
mMap.setMyLocationEnabled(true);





mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(a_local,16));

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener(){
@Override
public void onMapClick(LatLng latLng){
Toast.makeText(Test.this,latLng .latitude +,+ latLng.longitude,Toast.LENGTH_SHORT).show();

}
});
}
public void a_b_locations(){
try {
SharedPreferences myshared = getSharedPreferences(file,Context.MODE_PRIVATE);
a_lat = myshared.getString(a_lat,);
a_lon = myshared.getString(a_lon,);
b_lat = myshared.getString(b_lat,);
b_lon = myshared.getString(b_lon,);


}
catch(例外e){
return;



@Override
保护无效的onResume(){
super.onResume();
a_b_locations();



public void load_locations_from_server(){

String URL =http://myweb.com;

requestQueue = Volley.newRequestQueue(this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,URL,
new Response.Listener< JSONObject>(){
@Override $ b $ public void onResponse(JSONObject response){

尝试{
JSONArray jsonArray = response.getJSONArray(locations);

for(int i = 0; i< jsonArray.length(); i ++){
JSONObject respons = jsonArray.getJSONObject(i);

a_lat = respons.getString(a_lat);
a_lon = respons.getString(a_lon) ;
b_lat = respons.getString(b_lat);
b_lon = respons.getString(b_lon);

}

} catch (JSONException e) {
e.printStackTrace();


$ b},新的Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error){
Log .e(VOLLEY,ERROR);
}
}

);
requestQueue.add(jsonObjectRequest);


$ b


解决方案

您需要在地图准备好之后调用 load_locations_from_server()方法,该方法位于 onMapReady()方法中。



请阅读 https: //developers.google.com/maps/documentation/android-api/start



要设置标记的新位置,只需使用:

  Marker.setPosition(LatLng latlng); 

所以您需要为这些标记创建两个变量。



私人标记mMarkerA;
private Marker mMarkerB;

然后在你的onMapReady()中初始化它们:

pre > @Override
public void onMapReady(GoogleMap googleMap){
mMap = googleMap;

...

mMarkA = mMap.addMarker(new MarkerOptions()。position(a_local).title(a)
.snippet(xxx )
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_yellow)))。showInfoWindow();

mMarkB = mMap.addMarker(new MarkerOptions()。position(b_local).title(b)
.snippet(yyy)
.icon(BitmapDescriptorFactory。 fromResource(R.drawable.markerb)))showInfoWindow();
...
}

然后,您可以刷新它们从服务器的位置:

  a_lat = respons.getString(a_lat); 
a_lon = respons.getString(a_lon);
b_lat = respons.getString(b_lat);
b_lon = respons.getString(b_lon);

//刷新标记
mMarkerA.setPosition(new LatLng(a_lat,a_lon));
mMarkerA.setPosition(new LatLng(b_lat,b_lon));



显示两个标记



您可以使用 LatLngBounds 类似以下方法:

  private void zoomToShowBothPoints(LatLng firstLatLng,LatLng secondLatLng){
LatLngBounds bounds =
new LatLngBounds.Builder().include(firstLatLng).include(secondLatLng).build();

Point displaySize = new Point();
getWindowManager()。getDefaultDisplay()。getSize(displaySize);
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,displaySize.x - 20,displaySize.y - 20,50));
}


I have just 2 Markers on the Map

1- I want to show the bothe markers with max zoom as possible

2- I want after that refresh the markers position with a timer for example.

I want to use the volley to load the infos of A and B from server. I am a Beginer

Here is my Code :

import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Test extends FragmentActivity implements OnMapReadyCallback {
    RequestQueue requestQueue;
    String b_lat, b_lon, a_lat, a_lon;

    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);


    }



    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        LatLng a_local = new LatLng(Double.parseDouble(a_lat), Double.parseDouble(a_lon));
        LatLng b_local = new LatLng(Double.parseDouble(b_lat), Double.parseDouble(b_lon));

        mMap.addMarker(new MarkerOptions().position(a_local).title("a") 
                .snippet("xxx")
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_a))).showInfoWindow();

        mMap.addMarker(new MarkerOptions().position(b_local).title("b")
                .snippet("yyy")
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_b))).showInfoWindow();


        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.getUiSettings().setCompassEnabled(true);
        mMap.getUiSettings().setAllGesturesEnabled(true); 
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;
        }
        mMap.setMyLocationEnabled(true);





        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(a_local,16));

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                Toast.makeText(Test.this,latLng.latitude + ", " +latLng.longitude, Toast.LENGTH_SHORT).show();

            }
        });
    }
    public void a_b_locations(){
        try {
            SharedPreferences myshared = getSharedPreferences("file", Context.MODE_PRIVATE);
            a_lat= myshared.getString("a_lat",""); 
            a_lon= myshared.getString("a_lon","") ; 
            b_lat= myshared.getString("b_lat","") ;
            b_lon= myshared.getString("b_lon","") ;


        }
        catch(Exception e) {
            return ;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        a_b_locations();

    }

    public void load_locations_from_server() {

        String URL="http://myweb.com";

        requestQueue = Volley.newRequestQueue(this);
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {

                        try {
                            JSONArray jsonArray = response.getJSONArray("locations");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject respons = jsonArray.getJSONObject(i);

                                a_lat=respons.getString("a_lat");
                                a_lon=respons.getString("a_lon");
                                b_lat=respons.getString("b_lat");
                                b_lon=respons.getString("b_lon");                                

                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("VOLLEY", "ERROR");
            }
        }

        );
        requestQueue.add(jsonObjectRequest);

    }
}

解决方案

You need to call load_locations_from_server() method after map ready which is in onMapReady() method.

Read more at https://developers.google.com/maps/documentation/android-api/start

To set the new location of marker, you just need to use:

Marker.setPosition(LatLng latlng);

So you need to create two variables for the markers.

private Marker mMarkerA; private Marker mMarkerB;

Then in your onMapReady(), initialize them:

@Override
public void onMapReady(GoogleMap googleMap) {
  mMap = googleMap;

  ...

  mMarkerA = mMap.addMarker(new MarkerOptions().position(a_local).title("a") 
            .snippet("xxx")
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_yellow))).showInfoWindow();

  mMarkerB = mMap.addMarker(new MarkerOptions().position(b_local).title("b")
            .snippet("yyy")
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.markerb))).showInfoWindow();
  ...
}

Then, you can refresh them when you get the location from the server:

a_lat=respons.getString("a_lat");
a_lon=respons.getString("a_lon");
b_lat=respons.getString("b_lat");
b_lon=respons.getString("b_lon");

// refresh marker
mMarkerA.setPosition(new LatLng(a_lat, a_lon));
mMarkerA.setPosition(new LatLng(b_lat, b_lon));

Show Both Marker

To show both marker with extra padding, you can use LatLngBounds like the following method:

private void zoomToShowBothPoints(LatLng firstLatLng, LatLng secondLatLng) {
    LatLngBounds bounds =
        new LatLngBounds.Builder().include(firstLatLng).include(secondLatLng).build();

    Point displaySize = new Point();
    getWindowManager().getDefaultDisplay().getSize(displaySize);
    mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, displaySize.x - 20, displaySize.y - 20, 50));
  }

这篇关于如何刷新地图上的标记?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆