2017-08-29 183 views
0

我想使用osmdroid实现OpenStreetMap。我成功地将世界地图设置为一组特定的地理坐标。这里是我的代码:osmdroid获取当前用户位置

package com.example.re.osm; 
    //OSM MAP CODE 
    import android.app.Activity; 
    import android.content.Context; 
    import android.os.Bundle; 
    import android.preference.PreferenceManager; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.RelativeLayout; 

import org.osmdroid.api.IMapController; 
import org.osmdroid.config.Configuration; 
import org.osmdroid.tileprovider.tilesource.TileSourceFactory; 
import org.osmdroid.util.GeoPoint; 
import org.osmdroid.views.MapView; 
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; 
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; 

public class MainActivity extends Activity { 

private MapView mMapView; 
private MyLocationNewOverlay locationOverlay; 

@Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Context ctx = getApplicationContext(); 
    //important! set your user agent to prevent getting banned from the osm servers 
    Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)); 
    setContentView(R.layout.activity_main); 

    MapView map = (MapView) findViewById(R.id.map); 
    map.setTileSource(TileSourceFactory.MAPNIK); 
    map.setBuiltInZoomControls(true); 
    map.setMultiTouchControls(true); 

    /*IMapController mapController = map.getController(); 
    mapController.setZoom(9); 
    GeoPoint startPoint = new GeoPoint(48.8583, 2.2944); 
    mapController.setCenter(startPoint);*/ 
    //add 
    locationOverlay = new MyLocationNewOverlay(map); 
    mOsmOverlays.add(locationOverlay); 
} 

public void onResume(){ 
    super.onResume(); 
    //this will refresh the osmdroid configuration on resuming. 
    //if you make changes to the configuration, use 
    //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    //Configuration.getInstance().save(this, prefs); 
    Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this)); 
    //add 
    locationOverlay.enableMyLocation(); 
} 

public void onPause(){ 
    super.onPause(); 
    //add 
    locationOverlay.disableMyLocation(); 
} 

}

osmdroid(5.6.5)的最新版本使用。

清单文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.re.osm" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="10" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="OSM" > 
     <activity 
      android:name=".MainActivity" 
      android:label="OSM" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

我如何在这个当前用户位置?我是否也应该使用资源代理?

谢谢。

+0

你只是想显示用户的当前位置?我的情况下,它已经在stackoverflow回答https://stackoverflow.com/questions/8804788/how-to-display-the-current-position-pointer-in-osmdroid –

+0

@josef在我的代码的哪一部分,我应该添加此?我试过这个例子,但我无法获得当前的用户位置。我正在使用osmdroid 5.6.5。自定义资源代理仅适用于5.2之前的版本 您可以给我看一个小演示先生。 – Thomas

+0

有没有错误?您的应用程序是否处理某个位置的权限?你必须在manifest中声明permissioinss,并且如果你是针对android 6或更新版本构建权限请求处理权限请求。检查这个问题:https://stackoverflow.com/questions/1513485/how-do-i-get-the-current-gps-location-programmatically-in-android –

回答

0

您可以使用MyLocationNewOverlay

... 
GeoPoint startPoint = new GeoPoint(48.8583, 2.2944); 
mapController.setCenter(startPoint); 
//add 
GpsMyLocationProvider provider = new GpsMyLocationProvider(this); 
provider.addLocationSource(LocationManager.NETWORK_PROVIDER); 
locationOverlay = new MyLocationNewOverlay(map, provider); 
locationOverlay.enableFollowLocation(); 
locationOverlay.runOnFirstFix(new Runnable() { 
    public void run() { 
     Log.d("MyTag", String.format("First location fix: %s", locationOverlay.getLastFix())); 
    } 
}); 
map.getOverlayManager().add(locationOverlay); 

在活动的onResume方法再加入:

public void onResume(){ 
    super.onResume(); 
    //this will refresh the osmdroid configuration on resuming. 
    //if you make changes to the configuration, use 
    //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    //Configuration.getInstance().save(this, prefs); 
    Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this)); 
    //add 
    locationOverlay.enableMyLocation(); 
} 

而且在在onPause

public void onPause(){ 
    super.onResume(); 
    //add 
    locationOverlay.disableMyLocation(); 
} 

哪里locationOverlay显然是类型为MyLocationNewOverlay场。

欲了解更多详情check documentation for the class。还有an example in the sample application

+0

@我添加了这段代码,并更新了问题中的代码。我得到这个错误:无法解析符号mOsmOverlays – Thomas

+0

好吧,因为没有该名称的变量。将其更改为map.getOverlays()。add(..) –

+0

错误消失。但我无法在地图中看到我目前的位置。我应该改变什么? – Thomas