получить координаты, нажав на карту (openstreetmaps)

Как мы можем получить координаты точки, нажав на нее в открытых картах улиц?

пытался:

public void onClick(View v) {
    Projection proj = mapView.getProjection();
    IGeoPoint p = proj.fromPixels(v.getX(), v.getY());
    System.out.println("x: "+ v.getX() + " y: "+ v.getY());
}

привет, Танасио


person thanasio2    schedule 21.05.2013    source источник


Ответы (5)


Используйте метод dispatchTouchEvent(). Это работает, потому что MapActivity наследует событие dispatchTouch, а не OnTouchEvent из класса активности.

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    int actionType = ev.getAction();
    switch (actionType) {
    case MotionEvent.ACTION_UP:
            Projection proj = mapView.getProjection();
            GeoPoint loc = proj.fromPixels((int)ev.getX(), (int)ev.getY()); 
            String longitude = Double.toString(((double)loc.getLongitudeE6())/1000000);
            String latitude = Double.toString(((double)loc.getLatitudeE6())/1000000);

             Toast toast = Toast.makeText(getApplicationContext(), "Longitude: "+ longitude +" Latitude: "+ latitude , Toast.LENGTH_LONG);
            toast.show();

    }
return super.dispatchTouchEvent(ev);
}
person Sandeep    schedule 21.05.2013

Это моя собственная реализация MapView для определения местоположения по карте.

public class MapViewLoc extends MapView {

    private Overlay tapOverlay;
    private OnTapListener onTapListener;

    protected MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy, MapTileProviderBase tileProvider, Handler tileRequestCompleteHandler, AttributeSet attrs) {
        super(context, tileSizePixels, resourceProxy, tileProvider, tileRequestCompleteHandler, attrs);
    }

    public MapViewLoc(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MapViewLoc(Context context, int tileSizePixels) {
        super(context, tileSizePixels);
    }

    public MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy) {
        super(context, tileSizePixels, resourceProxy);
    }

    public MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy, MapTileProviderBase aTileProvider) {
        super(context, tileSizePixels, resourceProxy, aTileProvider);
    }

    public MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy, MapTileProviderBase aTileProvider, Handler tileRequestCompleteHandler) {
        super(context, tileSizePixels, resourceProxy, aTileProvider, tileRequestCompleteHandler);
    }

    private void prepareTagOverlay(){

       this.tapOverlay = new Overlay(this.getContext()) {

            @Override
            protected void draw(Canvas c, MapView osmv, boolean shadow) {

            }

            @Override
            public boolean onSingleTapConfirmed(MotionEvent e, MapView mapView) {

                Projection proj = mapView.getProjection();
                GeoPoint p = (GeoPoint) proj.fromPixels((int) e.getX(), (int) e.getY());
                proj = mapView.getProjection();

                final GeoPoint geoPoint = (GeoPoint) proj.fromPixels((int) e.getX(), (int) e.getY());

                if(MapViewLoc.this.onTapListener != null){

                    MapViewLoc.this.onTapListener.onMapTapped(geoPoint);

                    Location location = new Location("");
                    location.setLatitude((double) geoPoint.getLatitudeE6() / 1000000);
                    location.setLongitude((double) geoPoint.getLongitudeE6() / 1000000);
                    location.setAccuracy(Criteria.ACCURACY_FINE);

                    MapViewLoc.this.onTapListener.onMapTapped(location);
                }

                return true;
            }
        };
    }

    public void addTapListener(OnTapListener onTapListener){

        this.prepareTagOverlay();

        this.getOverlays().add(0, this.tapOverlay);

        this.onTapListener = onTapListener;
    }

    public void removeTapListener(){

        if(this.tapOverlay != null && this.getOverlays().size() > 0){

            this.getOverlays().remove(0);
        }

        this.tapOverlay = null;
        this.onTapListener = null;
    }

    public interface OnTapListener{

        void onMapTapped(GeoPoint geoPoint);

        void onMapTapped(Location location);

    }

}

Чтобы получить местоположение, установите только интерфейс OnTapListener.

mapView.addTapListener(new MapViewLoc.OnTapListener() {

            @Override
            public void onMapTapped(GeoPoint geoPoint) {}

            @Override
            public void onMapTapped(Location location) {

                Toast toast = Toast.makeText(getApplicationContext(),
                        "Latitude: " + location.getLatitude() + " Longitude: " + location.getLongitude(),
                        Toast.LENGTH_SHORT);

                toast.show();
            }
        });
person Dani    schedule 23.10.2015

Вы должны создать Overlay и переопределить onSingleTapConfirmed.

Попробуй это:

Overlay touchOverlay = new Overlay(this){
        ItemizedIconOverlay<OverlayItem> anotherItemizedIconOverlay = null;
        @Override
        protected void draw(Canvas arg0, MapView arg1, boolean arg2) {

        }
        @Override
        public boolean onSingleTapConfirmed(final MotionEvent e, final MapView mapView) {

            final Drawable marker = getApplicationContext().getResources().getDrawable(R.drawable.markericon);
            Projection proj = mapView.getProjection();
            GeoPoint loc = (GeoPoint) proj.fromPixels((int)e.getX(), (int)e.getY());
            String longitude = Double.toString(((double)loc.getLongitudeE6())/1000000);
            String latitude = Double.toString(((double)loc.getLatitudeE6())/1000000);
            System.out.println("- Latitude = " + latitude + ", Longitude = " + longitude );
            ArrayList<OverlayItem> overlayArray = new ArrayList<OverlayItem>();
            OverlayItem mapItem = new OverlayItem("", "", new GeoPoint((((double)loc.getLatitudeE6())/1000000), (((double)loc.getLongitudeE6())/1000000)));
            mapItem.setMarker(marker);
            overlayArray.add(mapItem);
            if(anotherItemizedIconOverlay==null){
                anotherItemizedIconOverlay = new ItemizedIconOverlay<OverlayItem>(getApplicationContext(), overlayArray,null);
                mapView.getOverlays().add(anotherItemizedIconOverlay);
                mapView.invalidate();
            }else{
                mapView.getOverlays().remove(anotherItemizedIconOverlay);
                mapView.invalidate();
                anotherItemizedIconOverlay = new ItemizedIconOverlay<OverlayItem>(getApplicationContext(), overlayArray,null);
                mapView.getOverlays().add(anotherItemizedIconOverlay);
            }
      //      dlgThread();
            return true;
        }
    };
    mapView.getOverlays().add(touchOverlay);
person Alberto Crespo    schedule 06.10.2016

Попробуйте следующее.

Напишите класс, производный от Overlay и переопределить onTap() метод. Затем вы можете добавить наложение в свои MapView. Объект GeoPoint, представляющий положение вашего касания, передается методу onTap(), когда вы совершаете табуляцию где-либо на карте.

person Sandeep    schedule 21.05.2013

@Sandy прав, но вместо onTap() переопределить метод onSingleTapUp(MotionEvent e, MapView mapView) или onSingleTapConfirmed(MotionEvent e, MapView mapView) , Например

onSingleTapUp(MotionEvent e, MapView mapView) {
    Projection proj = mapView.getProjection();
    IGeoPoint p = proj.fromPixels(e.getX(), e.getY());
}
person viduka    schedule 04.06.2013