OverlayItem не обновляется при изменении местоположения (OSM)

1

Я использую OSMdroid.

Мне удалось благодаря этому сообщению Добавить Overlay в OSMDROID для создания статического элемента creata в определенном месте.

теперь я пытаюсь сделать карту немного более динамичной. поэтому при изменении местоположения также будет обновляться и OverLayItem (который маркирует конкретное местоположение на карте).

это то, что я пытался сделать. карта обновляется, но OverLayItem не делает.

код:

package com.test.overlay;

import java.util.ArrayList;
import org.osmdroid.DefaultResourceProxyImpl;
import org.osmdroid.ResourceProxy;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.util.constants.MapViewConstants;

import android.app.Activity;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

public class SampleWithMinimapItemizedoverlay extends Activity implements
        LocationListener, MapViewConstants
{

    private MapView mMapView;
    private MapController mapController;
    private LocationManager mLocMgr;
    private ItemizedOverlay<OverlayItem> mMyLocationOverlay;
    private ResourceProxy mResourceProxy;
    int longtitude = 31987968;
    int latitude = 34783155;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
        setContentView(R.layout.main);

        mMapView = (MapView) this.findViewById(R.id.mapview);
        mMapView.setTileSource(TileSourceFactory.MAPNIK);
        mMapView.setBuiltInZoomControls(true);
        mMapView.setMultiTouchControls(true);
        mapController = this.mMapView.getController();
        mapController.setZoom(15);
        GeoPoint point2 = new GeoPoint(longtitude, latitude); // centre map here
        GeoPoint point3 = new GeoPoint(longtitude + 2000, latitude + 2000); // icon
                                                                            // goes
                                                                            // here
        // 31.987968,34.783155

        mapController.setCenter(point2);
        mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100,
                this);

        ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
        // Put overlay icon a little way from map centre
        items.add(new OverlayItem("Here", "SampleDescription", point3));

        /* OnTapListener for the Markers, shows a simple Toast. */
        this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
                new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>()
                {
                    @Override
                    public boolean onItemSingleTapUp(final int index,
                            final OverlayItem item)
                    {
                        Toast.makeText(SampleWithMinimapItemizedoverlay.this,
                                "Item '" + item.mTitle, Toast.LENGTH_LONG)
                                .show();
                        return true; // We 'handled' this event.
                    }

                    @Override
                    public boolean onItemLongPress(final int index,
                            final OverlayItem item)
                    {
                        Toast.makeText(SampleWithMinimapItemizedoverlay.this,
                                "Item '" + item.mTitle, Toast.LENGTH_LONG)
                                .show();
                        return false;
                    }
                }, mResourceProxy);
        this.mMapView.getOverlays().add(this.mMyLocationOverlay);
        mMapView.invalidate();
    }

    -------//here I tried to do the change !!!!!!!!!---------------
    -- The map location being updated but not the overlayItem.
    public void onLocationChanged(Location location)
    {
        latitude = (int) (location.getLatitude() * 1E6);
        longtitude = (int) (location.getLongitude() * 1E6);
        Toast.makeText(SampleWithMinimapItemizedoverlay.this,
                "Location changed. Lat:" + latitude + " long:" + longtitude ,
                Toast.LENGTH_LONG).show();
        GeoPoint gpt = new GeoPoint(latitude, longtitude);
        mapController.setCenter(gpt);
        mMapView.invalidate();
    }

    @Override
    public void onProviderDisabled(String arg0)
    {
    }

    @Override
    public void onProviderEnabled(String provider)
    {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {
    }

}

Благодаря,

лучей.

  • 0
    Вы не меняете положение значка при изменении местоположения. Вы должны будете сделать это в onLocationChanged. Это означает, что вам нужно сделать GestureListener неанонимичным классом, то есть дать ему имя, так как вам нужно будет снова обращаться к нему. Я выложу немного модифицированного кода.
Теги:
openstreetmap
osmdroid
android-maps

1 ответ

3
Лучший ответ

Это должно работать нормально.

,

public class SampleWithMinimapItemizedoverlay extends Activity implements
        LocationListener, MapViewConstants {

    private MapView mMapView;
    private MapController mapController;
    private LocationManager mLocMgr;
    private ItemizedOverlay<OverlayItem> mMyLocationOverlay;
    private ResourceProxy mResourceProxy;
    int mLongtitude = 31987968;
    int mLatitude = 34783155;
    ArrayList<OverlayItem> mItems;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
        setContentView(R.layout.main);

        mMapView = (MapView) this.findViewById(R.id.mapview);
        mMapView.setTileSource(TileSourceFactory.MAPNIK);
        mMapView.setBuiltInZoomControls(true);
        mMapView.setMultiTouchControls(true);
        mapController = this.mMapView.getController();
        mapController.setZoom(15);
        GeoPoint point2 = new GeoPoint(mLongtitude, mLatitude); // centre map here
        GeoPoint point3 = new GeoPoint(mLongtitude + 2000, mLatitude + 2000); // icon
                                                                            // goes
        // 31.987968,34.783155
        mapController.setCenter(point2);
        mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100,
                this);

        mItems = new ArrayList<OverlayItem>();
        // Put overlay icon a little way from map centre
        mItems.add(new OverlayItem("Here", "SampleDescription", point3));

        /* OnTapListener for the Markers, shows a simple Toast. */
        // REFER TO THE GESTURE LISTEMER BY NAME NOW
        this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(mItems,
                new Glistener() , mResourceProxy);
        this.mMapView.getOverlays().add(this.mMyLocationOverlay);
        mMapView.invalidate();
    }

    //We can't use an anonymous class anymore if we want to change the position
    // of the overlays/icons when location changed, give it a name
    class Glistener implements OnItemGestureListener<OverlayItem> {
        @Override
        public boolean onItemLongPress(int index, OverlayItem item) {
            Toast.makeText(SampleWithMinimapItemizedoverlay.this, "Item " + item.mTitle,
                    Toast.LENGTH_LONG).show();

            return false;
        }

        @Override
        public boolean onItemSingleTapUp(int index, OverlayItem item) {
            Toast.makeText(SampleWithMinimapItemizedoverlay.this, "Item " + item.mTitle,
                    Toast.LENGTH_LONG).show();
            return true; // We 'handled' this event.

        }

    }
    // -------//here I tried to do the change !!!!!!!!!---------------
    // -- The map location being updated but not the overlayItem.
    public void onLocationChanged(Location location) {
        mLatitude = (int) (location.getLatitude() * 1E6);
        mLongtitude = (int) (location.getLongitude() * 1E6);
        Toast.makeText(SampleWithMinimapItemizedoverlay.this,
                "Location changed. Lat:" + mLatitude + " long:" + mLongtitude,
                Toast.LENGTH_LONG).show();
        GeoPoint gpt = new GeoPoint(mLatitude, mLongtitude);
        mapController.setCenter(gpt);
        mItems.clear(); // COMMENT OUT THIS LINE IF YOU WANT A NEW ICON FOR EACH CHANGE OF POSITION
        mItems.add(new OverlayItem("New", "SampleDescription", gpt));
        // Change the overlay
        this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(mItems,
                new Glistener() , mResourceProxy);
        this.mMapView.getOverlays().clear();
        this.mMapView.getOverlays().add(this.mMyLocationOverlay);
        mMapView.invalidate();
    }

    @Override
    public void onProviderDisabled(String arg0) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

}

Просто комментируйте/раскомментируйте mItems.clear(); в зависимости от того, хотите ли вы новый маркер при каждом изменении позиции. (Значок появляется в позиции, которую вы переместили)

  • 0
    Я знаю, что мне пришлось изменить метод onLocationChanged. но какова цель Glistener?
  • 0
    Код в нем уже был анонимным классом, который не имеет имени и определяется и создается за один шаг. Поскольку мы хотим дважды создать его экземпляр, нам нужно переместить код во внутренний блок кода класса и дать ему имя (Glistener), чтобы мы могли ссылаться на него с помощью выражения «new Glistener ()».
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню