ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – Osmdroid Bonuspack – MyLocationNewOverlay

2019-07-06 10:37:25  阅读:207  来源: 互联网

标签:java android openstreetmap osmdroid


我目前有一些功能会导致一些问题,这些问题在最初工作但是在改变一些事情之后现在会产生错误.使用Android Studio,我可以查看以前版本的代码,但无济于事.

无论如何,我有一个全局声明的MyLocationNewOverlay如下:

MyLocationNewOverlay location_overlay;

当用户使用地图导航到活动时会启动哪个:

map = (MapView) findViewByID(R.id.map);
map.setVisibility(MapView.VISIBLE);

<..some working code that sets the tile source and the center..>

location_overlay = new MyLocationNewOverlay(getApplicationContext(), map);
location_overlay.enableMyLocation();
location_overlay.setDrawAccuracyEnabled(true);
map.getOverlays().add(location_overlay);
map.invalidate();

当它工作时,这个代码显示了一个小的人类标记,周围有精确的圆圈,但现在它甚至没有产生任何错误.我试过现在破旧的MyLocationOverlay,它也没用.

第二个问题在于按钮上的’onClick’方法,该按钮应该将地图聚焦在用户的当前位置,这也常用于工作.

public void onBtnFocusOnMe(View view){
    GeoPoint gp = new GeoPoint(location_overlay.getMyLocation());
    if(gp != null){
        mapController.animateTo(gp);
        mapController.zoomTo(16);
    }
}

这会在GeoPoint上产生空指针错误gp = new GeoPoint(location_overlay.getMyLocation());

解决方法:

我通常如何覆盖一些项目是这样的,它不是直接你的解决方案,但你可以从这里提取一些有用的东西:

public void showStartGoalMarkers(GeoPoint start, GeoPoint goal) {
    List<OverlayItem> mStartGoalItems = new ArrayList<>();
    OverlayItem startItem = new OverlayItem("", "", start);
    Drawable newMarker = mMapView.getContext().getResources().getDrawable(R.drawable.ic_start);
    startItem.setMarker(newMarker);

    mStartGoalItems.add(startItem);
    OverlayItem goalItem = new OverlayItem("", "", goal);
    Drawable newMarker2 = mMapView.getContext().getResources().getDrawable(R.drawable.ic_end);
    goalItem.setMarker(newMarker2);
    mStartGoalItems.add(goalItem);

    mMapView.getOverlays().add(new ItemizedIconOverlay<OverlayItem>(mStartGoalItems, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
        @Override
        public boolean onItemSingleTapUp(int index, OverlayItem item) {
            return false;
        }

        @Override
        public boolean onItemLongPress(int index, OverlayItem item) {
            return false;
        }
    }, mMapView.getResourceProxy()));

}

并最终使地图视图无效.希望能帮助到你.

编辑:用于标记当前位置的代码,以及在传递新位置时还更新当前位置的代码:

 private void markMyLocation(Location location) {
    mOverlayItems.add(0, new OverlayItem("", "", new GeoPoint(location)));

    if (mMyLocationOverlay == null) {
        mMyLocationOverlay = new MyLocationOverlay(mOverlayItems, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
            @Override
            public boolean onItemSingleTapUp(int index, OverlayItem item) {
                IMapController mapController = mMapView.getController();
                mapController.setCenter(item.getPoint());
                mapController.setZoom(mMapView.getMaxZoomLevel());
                return true;
            }

            @Override
            public boolean onItemLongPress(int index, OverlayItem item) {
                return false;
            }
        }, mMapView.getResourceProxy());

        mMapView.getOverlays().add(mMyLocationOverlay);
        mMapView.getController().setZoom(16);

    } else {
        IMapController mapController = mMapView.getController();
        mapController.setCenter(mOverlayItems.get(0).getPoint());
        mMapView.invalidate();
    }
}

MyLocationOverlay类:

public class MyLocationOverlay extends ItemizedIconOverlay<OverlayItem> {

List<OverlayItem> mMyLocation;
int mResourceId;

public MyLocationOverlay(List<OverlayItem> pList,
                            OnItemGestureListener<OverlayItem> pOnItemGestureListener,
                            ResourceProxy pResourceProxy) {
    super(pList, pOnItemGestureListener, pResourceProxy);
    this.mMyLocation = pList;
    this.mResourceId = R.drawable.my_location;
}

 @Override
public void draw(Canvas canvas, MapView mapview, boolean arg2) {
    super.draw(canvas, mapview, true);

    if (!mMyLocation.isEmpty()) {

        IGeoPoint geoPointLocation = mMyLocation.get(0).getPoint();
        Point out = new Point();
        mapview.getProjection().toPixels(geoPointLocation, out);

        Bitmap bm = BitmapFactory.decodeResource(mapview.getResources(),
                mResourceId);
        canvas.drawBitmap(bm,
                out.x - bm.getWidth() / 2,  //shift the bitmap center
                out.y - bm.getHeight() / 2,  //shift the bitmap center
                null);
    }


}

@Override
public boolean onSingleTapUp(MotionEvent event, MapView mapView) {
    // TODO Auto-generated method stub
    //return super.onSingleTapUp(event, mapView);
    return true;
}

基本上我所做的是在调用方法时覆盖ArrayList mOverlayItems中的单个项目并使地图无效.

标签:java,android,openstreetmap,osmdroid
来源: https://codeday.me/bug/20190706/1396614.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有