2013-05-21 12 views
7

Jak możemy uzyskać współrzędne punktu, klikając go w otwartych mapach ulicznych?uzyskać współrzędne klikając na mapie (openstreetmaps)

próbowałem:

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

okrzyki, Thanasio

Odpowiedz

9

Zastosowanie dispatchTouchEvent() metoda. Działa, ponieważ MapActivity dziedziczy wydarzenie dispatchTouch, a nie OnTouchEvent z klasy aktywności.

@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

Spróbuj wykonać następujące czynności.

Napisz klasę, która wywodzi się z klasy Overlay i zastępuje metodę onTap(). Następnie możesz dodać nakładkę do swojego . Obiekt GeoPoint, który reprezentuje pozycję, z której użytkownik korzysta, jest przekazywany do metody onTap(), gdy karta znajduje się gdzieś na mapie.

0

@Sandy jest odpowiednia, lecz zamiast ONTAP() obejścia onSingleTapUp (MotionEvent E MapView MapView) lub onSingleTapConfirmed (MotionEvent E MapView MapView) sposób, na przykład

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

tę jest moją własną implementacją MapView, aby uzyskać lokalizację, klikając mapę.

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

    } 

} 

Aby uzyskać lokalizację, należy ustawić tylko interfejs 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

Musisz utworzyć Overlay i zastąpić onSingleTapConfirmed.

Spróbuj tego:

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); 
Powiązane problemy