确定OSM地图用户位置 [英] Determine user location on osm maps

查看:190
本文介绍了确定OSM地图用户位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的Andr​​oid应用程序,在OSM的地图来确定用户的位置。我能够在地图上显示用户的位置,但如果该位置改变整个地图将被重新装入,有什么不好呢?另外我怎么可以增加用户位置的准确性?我怎么能作出这样的增加,根据准确度降低(如在谷歌的)一个圆?

code:

 公共类OsmDemoActivity扩展活动实现LocationListener的,
    MapViewConstants
{
私人MapView类mMapView;
私人MapController mapController;
私人LocationManager mLocMgr;
私人ItemizedOverlay< OverlayItem> mMyLocationOverlay;
私人ResourceProxy mResourceProxy;

ArrayList的< OverlayItem>项目;

@覆盖
公共无效的onCreate(包savedInstanceState)
{
    super.onCreate(savedInstanceState);
    mResourceProxy =新DefaultResourceProxyImpl(getApplicationContext());
    的setContentView(R.layout.main);
    //mMapView.setUseDataConnection(false);
    initilaizeMap();
    // addOverlay();
    mLocMgr =(LocationManager)getSystemService(LOCATION_SERVICE);
    mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,这一点);
}

公共无效initilaizeMap()
{
    mMapView =(图形页面)this.findViewById(R.id.mapView);
    mMapView.setTileSource(TileSourceFactory.MAPNIK);



    //mMapView.setUseDataConnection(false);



    mMapView.setBuiltInZoomControls(真正的);
    mMapView.setMultiTouchControls(真正的);
    mapController = this.mMapView.getController();
    mapController.setZoom(15);
    mapController.setCenter(新的GeoPoint(15.610762,32.540345));


    / *
    最后MyLocationOverlay myLocationOverlay =新MyLocationOverlay(这一点,mMapView,
            mResourceProxy);
    myLocationOverlay.enableMyLocation();
    //myLocationOverlay.disableMyLocation(); //不是在默认情况下
    myLocationOverlay.disableCompass();
    myLocationOverlay.disableFollowLocation();
    myLocationOverlay.setDrawAccuracyEnabled(真正的);
    myLocationOverlay.runOnFirstFix(新的Runnable(){
        公共无效的run(){
            mapController.animateTo(myLocationOverlay
                    .getMyLocation());
        }
    });
    // ArrayList的< OverlayItem> mOsmOverlays;
    //mOsmOverlays.add(myLocationOverlay);
    * /
}

公共无效addOverlay()
{
    的GeoPoint点2 =新的GeoPoint(53554070,-2959520); //中心地图在这里
    的GeoPoint POINT3 =新的GeoPoint(53554070 + 1000,-2959520 + 1000); //图标到这里
    的GeoPoint point4 =新的GeoPoint(15.610844,32.540045);
    的GeoPoint point5 =新的GeoPoint(15610844 + 40,32540045 + 40);
    的GeoPoint point6 =新的GeoPoint(15610844 + 50,32540045 + 50);
    的GeoPoint point7 =新的GeoPoint(15610844 + 10,32540045 +10);
    mapController.setCenter(point4);
    项目=新的ArrayList< OverlayItem>();
    //将覆盖图标从地图中心一点办法
    items.add(新OverlayItem(Here5,SampleDescription,point5));
    items.add(新OverlayItem(Here6,SampleDescription,point6));
    items.add(新OverlayItem(Here7,SampleDescription,point7));
    / * OnTapListener的标记,显示了一个简单的烤面包。 * /
    this.mMyLocationOverlay =新ItemizedIconOverlay< OverlayItem>(物品,
            新ItemizedIconOverlay.OnItemGestureListener< OverlayItem>(){
                @覆盖
                公共布尔onItemSingleTapUp(最终诠释指数,
                        最后OverlayItem项){
                    Toast.makeText(
                            OsmDemoActivity.this,
                            项目onItemSingleTapUp'+ item.mTitle,Toast.LENGTH_LONG).show();
                    返回true; //我们处理这个事件。
                }
                @覆盖
                公共布尔onItemLong preSS(最终诠释指数,
                        最后OverlayItem项){
                    Toast.makeText(
                            OsmDemoActivity.this,
                            项目onItemLong preSS'+ item.mTitle,Toast.LENGTH_LONG).show();
                    返回false;
                }
            },mResourceProxy);
    。this.mMapView.getOverlays()加(this.mMyLocationOverlay);
    mMapView.invalidate();
}

公共无效displayLocation(GeoPoint对象LOC)
{
    mapController.setCenter(LOC);
    项目=新的ArrayList< OverlayItem>();
    //将覆盖图标从地图中心一点办法
    items.add(新OverlayItem(在这里UR,SampleDescription,LOC));
    / * OnTapListener的标记,显示了一个简单的烤面包。 * /
    this.mMyLocationOverlay =新ItemizedIconOverlay< OverlayItem>(物品,
            新ItemizedIconOverlay.OnItemGestureListener< OverlayItem>(){
                @覆盖
                公共布尔onItemSingleTapUp(最终诠释指数,
                        最后OverlayItem项){
                    Toast.makeText(
                            OsmDemoActivity.this,
                            项目onItemSingleTapUp'+ item.mTitle,Toast.LENGTH_LONG).show();
                    返回true; //我们处理这个事件。
                }
                @覆盖
                公共布尔onItemLong preSS(最终诠释指数,
                        最后OverlayItem项){
                    Toast.makeText(
                            OsmDemoActivity.this,
                            项目onItemLong preSS'+ item.mTitle,Toast.LENGTH_LONG).show();
                    返回false;
                }
            },mResourceProxy);
    mMapView.getOverlays()清()。
    。this.mMapView.getOverlays()加(this.mMyLocationOverlay);
    //mMapView.invalidate();
}

公共无效onLocationChanged(位置定位)
{
    INT纬度=(INT)(location.getLatitude()* 1E6);
    INT LNG =(INT)(location.getLongitude()* 1E6);
    的GeoPoint =使用gpt新的GeoPoint(纬度,经度);
    //mapController.setCenter(gpt);
    //mMapView.invalidate();
    displayLocation(GPT);
}

    @覆盖
    公共无效onProviderDisabled(字符串为arg0){}
    @覆盖
    公共无效onProviderEnabled(字符串提供商){}
    @覆盖
    公共无效onStatusChanged(字符串商,INT地位,捆绑演员){}

}
 

解决方案

您必须使用一个位置的变化监听器 也许这可以帮助你。

监听器:

 包dispatch.driver.osmMaps;

进口org.osmdroid.util.GeoPoint;

进口android.location.Location;
进口android.location.LocationListener;
进口android.os.Bundle;
进口android.widget.Toast;

公共类OsmGeoUpdateHandler实现LocationListener的
{

    私人OsmMapsActivity mMapActivity;

    公共OsmGeoUpdateHandler(OsmMapsActivity aMapActivity)
    {
        this.mMapActivity = aMapActivity;

    }

    @覆盖
    公共无效onLocationChanged(位置定位)
    {
        Toast.makeText(mMapActivity,
                纬度=+ location.getLatitude()* 1e6个+经度=+ location.getLongitude()* 1e6个,
                Toast.LENGTH_SHORT).show();

        INT纬度=(INT)(location.getLatitude()* 1E6);
        INT经度=(INT)(location.getLongitude()* 1E6);
        的GeoPoint点=新的GeoPoint(纬度,经度);
        mMapActivity.updateCarPosition(点);
    }

    @覆盖
    公共无效onProviderDisabled(字符串提供商)
    {
        // TODO自动生成方法存根

    }

    @覆盖
    公共无效onProviderEnabled(字符串提供商)
    {
        // TODO自动生成方法存根

    }

    @覆盖
    公共无效onStatusChanged(字符串商,INT地位,捆绑演员)
    {
        // TODO自动生成方法存根

    }

}
 

OsmMapActivity类(如何使用监听器)

 公共类OsmMapsActivity扩展活动
{
    //最后的私人诠释MAP_DEFAULT_ZOOM = 14;
    最后的私人双人MAP_DEFAULT_LATITUDE = 44.445883;
    最后的私人双人MAP_DEFAULT_LONGITUDE = 26.040963;

    私人MapView类mMapView;
    私人ResourceProxy mResourceProxy;
    私人OsmMapsItemizedOverlay mItemizedOverlay;
    私人MyLocationOverlay mMyLocationOverlay;
    私人LocationManager locationManager;
    私人OverlayItem lastPosition = NULL;
    私人订购mOrder;
    OsmGeoUpdateHandler mUpdateHandler;
    私人的ArrayList< OverlayItem> mItems =新的ArrayList< OverlayItem>();

    @覆盖
    公共无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        //指定XML布局的使用方法:
        的setContentView(R.layout.osmmap);

        mResourceProxy =新DefaultResourceProxyImpl(getApplicationContext());
        mMapView =(图形页面)findViewById(R.id.mapview);

        //设置的MapView控制器:
        mMapView.setBuiltInZoomControls(真正的);
        mMapView.setMultiTouchControls(真正的);
        mMapView.setClickable(真正的);
        mMapView.setUseDataConnection(假);
        mMapView.setTileSource(TileSourceFactory.MAPNIK);
        mMapView.getController()setZoom(12)。


        / *位置经理* /
        locationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);
        mUpdateHandler =新OsmGeoUpdateHandler(本);
        位置位置= NULL;

        对于(字符串提供商:locationManager.getProviders(真))
        {
            位置= locationManager.getLastKnownLocation(供应商);
            如果(位置!= NULL)
            {
                //location.setLatitude(MAP_DEFAULT_LATITUDE);
                //location.setLongitude(MAP_DEFAULT_LONGITUDE);
                locationManager.requestLocationUpdates(提供商,0,0,mUpdateHandler);
                打破;
            }
        }

        //将汽车位置
        如果(位置== NULL)
        {
            位置=新的位置(LocationManager.GPS_PROVIDER);
            location.setLatitude(MAP_DEFAULT_LATITUDE);
            location.setLongitude(MAP_DEFAULT_LONGITUDE);
            updateCarPosition(新的GeoPoint(位置));
        }

    } //结束的onCreate()
公共无效updateCarPosition(GeoPoint对象的aPoint)
    {
        如果(mItemizedOverlay == NULL)
        {
            返回;
        }
        OverlayItem overlayItem;

        / *删除最后一个位置标记* /
        removeLastPosition(lastPosition);

        overlayItem =新OverlayItem(中心,中心,(GeoPoint对象)的aPoint);

        lastPosition = overlayItem;

        mItemizedOverlay.addOverlay(overlayItem);


        。mMapView.getOverlays()加(mItemizedOverlay);
        。mMapView.getController()animateTo(的aPoint);

    }
}
 

I am working on an android application that determines user location in osm maps. I am being able to show user location on the map, but if the location change the whole map is reloaded, what’s wrong with that? Also how I can increase the accuracy of the user location? And how can I make a circle that increase and decrease according to the accuracy(as shown in Google one)?

code :

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) {} 

}

解决方案

You must use an location change listener Maybe this can help you

Listener:

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 class (how to use listener)

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

    }
}

这篇关于确定OSM地图用户位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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