gpt4 book ai didi

android - OverlayItem 不在位置更改时更新 (OSM)

转载 作者:行者123 更新时间:2023-11-29 18:18:56 26 4
gpt4 key购买 nike

我正在使用 OSMdroid。

感谢这篇文章,我成功了 Adding Overlay to OSMDROID在特定位置创建叠加静态项目。

现在我正在尝试使 map 更加动态。因此,当位置发生变化时,OverLayItem(在 map 上标记特定位置)也会自行更新。

这就是我尝试做的。 map 会更新,但 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)
{
}

}

谢谢,

射线。

最佳答案

这应该没问题

.

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();行取决于每次更改位置时是否需要新标记。 (图标出现在您移动到的位置)

关于android - OverlayItem 不在位置更改时更新 (OSM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6555558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com