确定OSM地图用户位置 [英] Determine user location on osm maps
问题描述
我工作的Android应用程序,在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屋!