【问题标题】:How to move marker in googlemap while getting different latitude,longitude in android如何在googlemap中移动标记,同时在android中获得不同的纬度,经度
【发布时间】:2017-02-06 18:22:13
【问题描述】:

我正在开发android应用程序,我的要求是,如何在经纬度变化时在谷歌地图中移动标记,这意味着跟踪设备系统

这是我的json

{
 "gpslocation": [
                   {
                      "Latitude":"12.9789702",
                      "Longitude":"77.6411031",
                      "UpdatedOn":"2015-06-02 14:09:02"
                   }
                ]
}

这是我的主要活动

  private static String url = "http://example.com/android/gps/latlong.php";

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.gmap_direction);

                pd = new ProgressDialog(Bustracking.this);
                pd.setMessage("Please wait...");
                pd.setCanceledOnTouchOutside(false);
                pd.show(); 

                new AsyncTask<Void, Void, Void>()
                {
                    @Override
                    protected Void doInBackground(Void... params)
                    {
                        callAsynchronousTask();

                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result)
                    {
                    }
                }.execute();


            }

       public void callAsynchronousTask() {
           timer = new Timer();
           timer.scheduleAtFixedRate(new TimerTask() {

             @Override
             public void run() {
                 location();     
             }
          }, 0, 1000);
         }

    public void location(){         

     List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("key", "agile89rise98"));
        params.add(new BasicNameValuePair("username", un));
        params.add(new BasicNameValuePair("type", "parent"));

         // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(url, "GET", params);

     try {                              
             JSONArray a= json.getJSONArray(TAG_SUCCESS);
             JSONObject c = a.getJSONObject(0);

             // Storing  JSON item in a Variable
         final String latitudee = c.getString("Latitude");
         final String longitudee = c.getString("Longitude");
         final String updatedon = c.getString("UpdatedOn");
         pd.dismiss();

             runOnUiThread(new Runnable(){

                @Override
               public void run() {

               try {
                        // Loading map
                        initilizeMap();

                   // Changing map type
                        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                        googleMap.setMyLocationEnabled(true);
                        // Enable / Disable zooming controls
                        googleMap.getUiSettings().setZoomControlsEnabled(false);
                        // Enable / Disable my location button
                        googleMap.getUiSettings().setMyLocationButtonEnabled(true);
                        // Enable / Disable Compass icon
                        googleMap.getUiSettings().setCompassEnabled(true);
                        // Enable / Disable Rotate gesture
                        googleMap.getUiSettings().setRotateGesturesEnabled(true);
                        // Enable / Disable zooming functionality
                        googleMap.getUiSettings().setZoomGesturesEnabled(true);
                        double latitude =  Double.parseDouble(latitudee);
                        double longitude = Double.parseDouble(longitudee);

          MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(updatedon);
          marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));

                            googleMap.addMarker(marker);

                                CameraPosition cameraPosition = new CameraPosition.Builder()
                                        .target(new LatLng(latitude,
                                                longitude)).zoom(25).build();

                                googleMap.animateCamera(CameraUpdateFactory
                                        .newCameraPosition(cameraPosition));



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

                  });

            } catch (final JSONException e) {
                 pd.dismiss();
                 runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Bus Service Not Available", Toast.LENGTH_SHORT).show();
                            e.printStackTrace();
                        }
                 });
            }

        }

我的 lat 和 long 会根据设备位置不断变化,我从 json url 获取 lat 和 long 并将其显示在谷歌地图中 我的 oncreate 函数中有一个 AsyncTask,我在 doinbackground 中调用了一个名为 callAsynchronousTask(); 的函数,这是每隔一秒执行一次的函数,因为我需要来自 json url 的连续 lat,long 并且我正在从 callAsynchronoustask 调用另一个名为 @987654324 的函数@ 这个函数用于检索 lat,long 值并在 googlemap 中显示

我每秒钟都在调用location();,因为得到了连续的纬度、经度值。现在我的输出就像为每个动作创建标记一样,所以每当我得到 latlong 时,它就会创建新的标记

我的要求:- 它不应该创建新的标记,每当我得到不同的 latlong 值时,相同的标记应该移动

你能告诉我怎么做吗?

【问题讨论】:

  • 您是否只想显示单个标记,该标记会根据经纬度移动
  • 在谷歌地图初始化之前声明 if(googleMap != null){ googleMap.clear(); }
  • @Clairvoyant 是的,你能告诉我吗?怎么办?
  • 那么 Hitesh Singh 已经回答了你的问题。
  • @Hitesh Singh 我没听懂你在说什么?

标签: android google-maps tracking


【解决方案1】:

在您的 initializeMap() 方法和 googleMap.setMapType() 方法之间执行此操作,放入以下行:

 // Loading map
                            initilizeMap();
                          googleMap.clear();   // put this line

                       // Changing map type
                            googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

【讨论】:

【解决方案2】:

一些 Google 工程师提供了一个很好的演示视频,其中包含一些优雅的示例代码,关于如何为所有不同版本的 Android 设置从起点到终点的动画标记:

相关代码在这里:

https://gist.github.com/broady/6314689

还有一个很好的演示视频,展示了所有这些操作。

http://youtu.be/WKfZsCKSXVQ

下面是旧的弃用答案

在文档中提到不能更改标记图标:

图标

为标记显示的位图。如果未设置图标,则会显示默认图标。您可以使用 defaultMarker(float) 指定默认图标的替代颜色。创建标记后,您将无法更改图标。 Google Maps API v2 文档

您将不得不跟踪特定标记,可能使用类似于此处描述的方法:将标记链接到对象,然后找出需要更新的标记。在标记上调用 .remove(),然后根据您想要的“方向”创建旋转图像,使用该图像创建新标记,并将新标记添加到地图中。

您不需要“清除”地图,只需删除要修改的标记,创建一个新标记,然后将其添加回地图。

很遗憾,新的 Maps API 还不是很灵活。希望 Google 继续改进它。

【讨论】:

    【解决方案3】:

    您不必每次移动时都重新创建标记。

    首先,创建全局Marker字段

    GoogleMap googleMap;
    Marker activeMarker = null; 
    

    然后仅在尚未创建标记时创建标记,如果已创建则移动它。

    if (activeMarker == null)
    {
       MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(updatedon);
              marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
        activeMarker = googleMap.addMarker(marker);
    }
    else
    {
        activeMarker.setPosition(new LatLng(latitude, longitude));
        activeMarker.setTitle(updatedon);
    } 
    

    此外,在开始运行 location() 任务之前,您应该只运行一次以下地图初始化代码。

    // Loading map
    initilizeMap();
    
    // Changing map type
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googleMap.setMyLocationEnabled(true);
    // Enable / Disable zooming controls
    googleMap.getUiSettings().setZoomControlsEnabled(false);
    // Enable / Disable my location button
    
    googleMap.getUiSettings().setMyLocationButtonEnabled(true);
    // Enable / Disable Compass icon
    googleMap.getUiSettings().setCompassEnabled(true);
    // Enable / Disable Rotate gesture
    googleMap.getUiSettings().setRotateGesturesEnabled(true);
    // Enable / Disable zooming functionality
    googleMap.getUiSettings().setZoomGesturesEnabled(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多