2012-05-13 3 views
5

私はosmマップでユーザーの位置を決定するアンドロイド・アプリケーションを開発中です。私はマップ上のユーザーの位置を表示することができますが、場所の変更がマップ全体が再ロードされた場合、何が間違っていますか?また、私はどのようにユーザーの場所の精度を高めることができますか?そして、精度に応じて増減する円を作るにはどうすればいいですか?osmマップ上のユーザーの位置を決定する

コード:

public class OsmDemoActivity extends Activity implements LocationListener, 
    MapViewConstants 
{ 
private MapView mMapView; 
private MapController mapController; 
private LocationManager mLocMgr; 
private ItemizedOverlay<OverlayItem> mMyLocationOverlay; 
private ResourceProxy mResourceProxy; 

ArrayList<OverlayItem> items; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); 
    setContentView(R.layout.main); 
    //mMapView.setUseDataConnection(false); 
    initilaizeMap(); 
    //addOverlay(); 
    mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
    mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);  
} 

public void initilaizeMap() 
{ 
    mMapView = (MapView) this.findViewById(R.id.mapView); 
    mMapView.setTileSource(TileSourceFactory.MAPNIK); 



    //mMapView.setUseDataConnection(false); 



    mMapView.setBuiltInZoomControls(true); 
    mMapView.setMultiTouchControls(true); 
    mapController = this.mMapView.getController(); 
    mapController.setZoom(15); 
    mapController.setCenter(new GeoPoint(15.610762,32.540345)); 


    /* 
    final MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this, mMapView, 
      mResourceProxy); 
    myLocationOverlay.enableMyLocation(); 
    //myLocationOverlay.disableMyLocation(); // not on by default 
    myLocationOverlay.disableCompass(); 
    myLocationOverlay.disableFollowLocation(); 
    myLocationOverlay.setDrawAccuracyEnabled(true); 
    myLocationOverlay.runOnFirstFix(new Runnable() { 
     public void run() { 
      mapController.animateTo(myLocationOverlay 
        .getMyLocation()); 
     } 
    }); 
    //ArrayList<OverlayItem> mOsmOverlays; 
    //mOsmOverlays.add(myLocationOverlay); 
    */ 
} 

public void addOverlay() 
{ 
    GeoPoint point2 = new GeoPoint(53554070, -2959520); // centre map here 
    GeoPoint point3 = new GeoPoint(53554070 + 1000, -2959520 + 1000); // icon goes here 
    GeoPoint point4 = new GeoPoint(15.610844, 32.540045); 
    GeoPoint point5 = new GeoPoint(15610844 + 40, 32540045 + 40); 
    GeoPoint point6 = new GeoPoint(15610844 + 50, 32540045 + 50); 
    GeoPoint point7 = new GeoPoint(15610844 + 10, 32540045 +10); 
    mapController.setCenter(point4); 
    items = new ArrayList<OverlayItem>(); 
    // Put overlay icon a little way from map center 
    items.add(new OverlayItem("Here5", "SampleDescription", point5)); 
    items.add(new OverlayItem("Here6", "SampleDescription", point6)); 
    items.add(new OverlayItem("Here7", "SampleDescription", point7)); 
    /* 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( 
          OsmDemoActivity.this, 
          "Item onItemSingleTapUp '" + item.mTitle, Toast.LENGTH_LONG).show(); 
        return true; // We 'handled' this event. 
       } 
       @Override 
       public boolean onItemLongPress(final int index, 
         final OverlayItem item) { 
        Toast.makeText( 
          OsmDemoActivity.this, 
          "Item onItemLongPress '" + item.mTitle ,Toast.LENGTH_LONG).show(); 
        return false; 
       } 
      }, mResourceProxy); 
    this.mMapView.getOverlays().add(this.mMyLocationOverlay); 
    mMapView.invalidate(); 
} 

public void displayLocation(GeoPoint loc) 
{ 
    mapController.setCenter(loc); 
    items = new ArrayList<OverlayItem>(); 
    // Put overlay icon a little way from map center 
    items.add(new OverlayItem("Here u r", "SampleDescription", loc)); 
    /* 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( 
          OsmDemoActivity.this, 
          "Item onItemSingleTapUp '" + item.mTitle, Toast.LENGTH_LONG).show(); 
        return true; // We 'handled' this event. 
       } 
       @Override 
       public boolean onItemLongPress(final int index, 
         final OverlayItem item) { 
        Toast.makeText( 
          OsmDemoActivity.this, 
          "Item onItemLongPress '" + item.mTitle ,Toast.LENGTH_LONG).show(); 
        return false; 
       } 
      }, mResourceProxy); 
    mMapView.getOverlays().clear(); 
    this.mMapView.getOverlays().add(this.mMyLocationOverlay); 
    //mMapView.invalidate(); 
} 

public void onLocationChanged(Location location) 
{ 
    int lat = (int) (location.getLatitude() * 1E6); 
    int lng = (int) (location.getLongitude() * 1E6); 
    GeoPoint gpt = new GeoPoint(lat, lng); 
    //mapController.setCenter(gpt); 
    //mMapView.invalidate(); 
    displayLocation(gpt); 
} 

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

} 
+0

一度に1つの質問が最適です。 – Will

答えて

3

あなたはたぶんこれはあなた

リスナーを助けることができる場所の変更リスナー を使用する必要があります。

package dispatch.driver.osmMaps; 

import org.osmdroid.util.GeoPoint; 

import android.location.Location; 
import android.location.LocationListener; 
import android.os.Bundle; 
import android.widget.Toast; 

public class OsmGeoUpdateHandler implements LocationListener 
{ 

    private OsmMapsActivity mMapActivity; 

    public OsmGeoUpdateHandler(OsmMapsActivity aMapActivity) 
    { 
     this.mMapActivity = aMapActivity; 

    } 

    @Override 
    public void onLocationChanged(Location location) 
    { 
     Toast.makeText(mMapActivity, 
       "latitude = " + location.getLatitude() * 1e6 + " longitude = " + location.getLongitude() * 1e6, 
       Toast.LENGTH_SHORT).show(); 

     int latitude = (int) (location.getLatitude() * 1E6); 
     int longitude = (int) (location.getLongitude() * 1E6); 
     GeoPoint point = new GeoPoint(latitude, longitude); 
     mMapActivity.updateCarPosition(point); 
    } 

    @Override 
    public void onProviderDisabled(String provider) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) 
    { 
     // TODO Auto-generated method stub 

    } 

} 

OsmMapActivityクラス(リスナーを使用する方法)

public class OsmMapsActivity extends Activity 
{ 
    // final private int MAP_DEFAULT_ZOOM = 14; 
    final private double MAP_DEFAULT_LATITUDE = 44.445883; 
    final private double MAP_DEFAULT_LONGITUDE = 26.040963; 

    private MapView mMapView; 
    private ResourceProxy mResourceProxy; 
    private OsmMapsItemizedOverlay mItemizedOverlay; 
    private MyLocationOverlay mMyLocationOverlay; 
    private LocationManager locationManager; 
    private OverlayItem lastPosition = null; 
    private Order mOrder; 
    OsmGeoUpdateHandler mUpdateHandler; 
    private ArrayList<OverlayItem> mItems = new ArrayList<OverlayItem>(); 

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

     // Specify the XML layout to use: 
     setContentView(R.layout.osmmap); 

     mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); 
     mMapView = (MapView) findViewById(R.id.mapview); 

     // Setup the mapView controller: 
     mMapView.setBuiltInZoomControls(true); 
     mMapView.setMultiTouchControls(true); 
     mMapView.setClickable(true); 
     mMapView.setUseDataConnection(false); 
     mMapView.setTileSource(TileSourceFactory.MAPNIK); 
     mMapView.getController().setZoom(12); 


     /* location manager */ 
     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     mUpdateHandler = new OsmGeoUpdateHandler(this); 
     Location location = null; 

     for (String provider : locationManager.getProviders(true)) 
     { 
      location = locationManager.getLastKnownLocation(provider); 
      if (location != null) 
      { 
       //location.setLatitude(MAP_DEFAULT_LATITUDE); 
       //location.setLongitude(MAP_DEFAULT_LONGITUDE); 
       locationManager.requestLocationUpdates(provider, 0, 0, mUpdateHandler); 
       break; 
      } 
     } 

     //add car position 
     if (location == null) 
     { 
      location = new Location(LocationManager.GPS_PROVIDER); 
      location.setLatitude(MAP_DEFAULT_LATITUDE); 
      location.setLongitude(MAP_DEFAULT_LONGITUDE); 
      updateCarPosition(new GeoPoint(location)); 
     } 

    } // end onCreate() 
public void updateCarPosition(GeoPoint aPoint) 
    { 
     if (mItemizedOverlay == null) 
     { 
      return; 
     } 
     OverlayItem overlayItem; 

     /* remove last position marker */ 
     removeLastPosition(lastPosition); 

     overlayItem = new OverlayItem("Center", "Center", (GeoPoint) aPoint); 

     lastPosition = overlayItem; 

     mItemizedOverlay.addOverlay(overlayItem); 


     mMapView.getOverlays().add(mItemizedOverlay); 
     mMapView.getController().animateTo(aPoint); 

    } 
} 
+0

ありがとう、私はそれを試してみます。 – harhouf

関連する問題