2013-05-21 19 views
7

Come possiamo ottenere le coordinate di un punto facendo clic su di esso in mappe stradali aperte?ottieni le coordinate cliccando sulla mappa (openstreetmaps)

provato:

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()); 
} 

acclamazioni, Thanasio

risposta

9

Uso metodo dispatchTouchEvent(). Funziona perché lo MapActivity eredita l'evento dispatchTouch, non lo OnTouchEvent dalla classe Attività.

@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); 
} 
0

Provare quanto segue.

Scrivere una classe che deriva dalla classe Overlay e sovrascrivere il metodo onTap(). Quindi puoi aggiungere il tuo overlay al tuo . Un oggetto GeoPoint, che rappresenta la posizione di cui si tocca, viene passato al metodo onTap() quando si seleziona da qualche parte sulla mappa.

0

@Sandy si adatta ma invece di onTap() Override onSingleTapUp (MotionEvent e, MapView mapview) o onSingleTapConfirmed (MotionEvent e, MapView mapview) metodo, ad esempio

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

Questo è la mia implementazione di MapView per ottenere la posizione facendo clic sulla mappa.

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); 

    } 

} 

Per ottenere la posizione, impostare solo l'interfaccia 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(); 
      } 
     }); 
1

È necessario creare un Overlay e ignorare il onSingleTapConfirmed.

Prova questo:

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); 
Problemi correlati