【问题标题】:Cannot add my location overlay to osmdroid map无法将我的位置覆盖添加到 osmdroid 地图
【发布时间】:2018-02-18 05:34:31
【问题描述】:

我正在尝试使用以下代码将我的 GPS 位置添加到地图中:

MyLocationNewOverlay locationOverlay;
locationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(mContext), mapView);
            locationOverlay.enableMyLocation();
            mapView.getOverlays().add(locationOverlay);

但是,代码没有任何作用,也没有向地图添加任何内容(例如,没有图标、没有文本等)。请注意,缩放叠加和手势叠加可以完美运行,但是当我将 MyLocationNewOverlay 叠加添加到地图视图时,它们不起作用。有任何想法吗?

更新

这是我活动的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener, LocationListener {
    private static final int STORAGE_REQUEST = 100;
    private static final int LOCATION_REQUEST = 101;
    private static final String TAG = "MainActivity";
    private Context mContext;
    private MapView mMap;
    private EditText latitude;
    private EditText longitude;
    private Button searchLocation;
    IMapController mapController;

    private MyLocationNewOverlay locationOverlay;

    ArrayList<OverlayItem> items = new ArrayList<>();

    /**
     * Compass overlay
     */
    private CompassOverlay mCompassOverlay;


    private RotationGestureOverlay mRotationOverlay;

    private ScaleBarOverlay mScaleBarOverlay;


    private MyLocationNewOverlay mMyLocationOverlay;

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

        mContext = getApplicationContext();

        Configuration.getInstance().load(mContext, PreferenceManager.getDefaultSharedPreferences(mContext));
        Configuration.getInstance().setUserAgentValue("Dalvik");


        setContentView(R.layout.activity_main);


        //Check Permissions
        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_REQUEST);
        }

        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST);
        }


        mMap = findViewById(R.id.mapView);
        mMap.setTileSource(TileSourceFactory.MAPNIK);


        mMap.setBuiltInZoomControls(true);
        mMap.setMultiTouchControls(true);


        latitude = findViewById(R.id.latitude);
        longitude = findViewById(R.id.longitude);
        searchLocation = findViewById(R.id.searchLocation);
        searchLocation.setOnClickListener(this);


        mapController = mMap.getController();
        mapController.setZoom(9.0f);

        //Add my location

        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);

        final LocationManager locMgr = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
        final String provider = locMgr.getBestProvider(criteria, true);
        locMgr.requestLocationUpdates(provider, 1000, 100, this);

        Location loc = locMgr.getLastKnownLocation(provider);
        Log.d(TAG, "onCreate: " + loc.getLatitude() + ", " + loc.getLongitude());

        //Start on Iran
        GeoPoint iran = new GeoPoint(32.4279, 53.6880);
        mapController.setCenter(iran);


        //Add my location overlay
        mMyLocationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(mContext), mMap);
        mMyLocationOverlay.enableMyLocation();
        mMap.getOverlays().add(mMyLocationOverlay);

        //Add compass overlay
        mCompassOverlay = new CompassOverlay(mContext, mMap);
        mCompassOverlay.enableCompass();
        mCompassOverlay.setEnabled(true);
        mMap.getOverlays().add(mCompassOverlay);



        //Add rotation gesture overlay
        mRotationOverlay = new RotationGestureOverlay(mMap);
        mRotationOverlay.setEnabled(true);
        mMap.setMultiTouchControls(true);
        mMap.getOverlays().add(mRotationOverlay);


        //Add map scale bar overlay
        mScaleBarOverlay = new ScaleBarOverlay(mMap);
        mScaleBarOverlay.setCentred(true);
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        mScaleBarOverlay.setScaleBarOffset(dm.widthPixels / 2, 30);
        mMap.getOverlays().add(mScaleBarOverlay);



    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        //Check and decide
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(mContext, R.string.permission_not_granted_please_allow, Toast.LENGTH_LONG).show();
        }

    }


    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.searchLocation) {
            double lat = Double.valueOf(latitude.getText().toString());
            double lng = Double.valueOf(longitude.getText().toString());

            GeoPoint geoPoint = new GeoPoint(lat, lng);
            mapController.setCenter(geoPoint);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMyLocationOverlay.setEnabled(false);
        mMap.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMyLocationOverlay.setEnabled(true);
        mMap.onResume();

    }

    @Override
    public void onLocationChanged(Location location) {
    }

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

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }
}

【问题讨论】:

    标签: android openstreetmap osmdroid


    【解决方案1】:

    这被问了很多。这是它不起作用的最常见原因

    • 你的设备有 GPS 吗?
    • 您的设备是否启用了 GPS 服务?
    • osmdroid 默认只添加 GPS,您可能需要将网络位置服务器添加到覆盖查询的传感器列表中
    • 您在外面并且有 GPS 信号吗?
    • 您是否在清单中授予了权限?
    • 如果以 API23+ 为目标,您是否要求用户提供运行时权限?

    如果您碰巧有自定义位置提供程序或需要自定义叠加层使用的位置馈送,请尝试以下操作

    GpsMyLocationProvider prov= new GpsMyLocationProvider(); 
    prov.addLocationSource(LocationManager.NETWORK_PROVIDER);
    MyLocationNewOverlay locationOverlay = new MyLocationNewOverlay(prov, mapView);
    locationOverlay.enableMyLocation();
    mMap.getOverlayManager().add(locationOverlay);
    

    然后照常进行。

    【讨论】:

    • 设备已启用。 GPS 已启用。事实上,我得到了运行时的许可。虽然我在室内,但我有 GPS 信号。
    • 不过,我不确定您所说的网络位置服务器是什么意思。
    • 答案已更新,可以将自定义位置提供程序添加到列表中。也可以清除。仅供参考,osmdroid v6.0.1 现在默认添加 gps 和网络,所以上述调整可能没有必要
    • @SebastianPalma 已更新,代码库随时间而变化,因此请始终参考示例应用程序和/或源代码
    【解决方案2】:

    您似乎无法使用GpsMyLocationProvider 向地图添加叠加层。更好的方法可能是使用ItemizedIconOverlay,您可以在其中使用Android 的getLocationUpdates 通常从Android 获取位置,创建一个GeoPoint,创建一个ItemOverlay,将其添加到anItemizedIconOverlay,然后将其添加到您的MapView:

      final LocationManager locMgr = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
            final String provider = locMgr.getBestProvider(criteria, true);
            locMgr.requestLocationUpdates(provider, 1000, 100, this);
    
            Location loc = locMgr.getLastKnownLocation(provider);
    
    
            //Add my location overlay
            OverlayItem newItem = new OverlayItem("Here", "You are here", new GeoPoint(loc));
            items.add(newItem);
    
            ItemizedIconOverlay<OverlayItem> myLocOverlay = new ItemizedIconOverlay<OverlayItem>(items,
                    getResources().getDrawable(R.drawable.my_location, null),
                    new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                        @Override
                        public boolean onItemSingleTapUp(int index, OverlayItem item) {
                            return false;
                        }
    
                        @Override
                        public boolean onItemLongPress(int index, OverlayItem item) {
                            return false;
                        }
                    },
            mContext);
            mMap.getOverlays().add(myLocOverlay);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      相关资源
      最近更新 更多