2013-05-21 37 views
7

Làm cách nào để có được tọa độ của một điểm bằng cách nhấp vào nó trong bản đồ đường phố mở?lấy tọa độ bằng cách nhấp vào bản đồ (openstreetmaps)

thử:

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

cổ vũ, Thanasio

Trả lời

9

Sử dụng dispatchTouchEvent() phương pháp. Nó hoạt động vì MapActivity thừa kế sự kiện dispatchTouch, không phải là OnTouchEvent từ Lớp hoạt động.

@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

Hãy thử cách sau.

Viết một lớp có nguồn gốc từ lớp Overlay và ghi đè phương thức onTap(). Sau đó, bạn có thể thêm lớp phủ của mình vào số . Đối tượng GeoPoint, đại diện cho vị trí của bạn, được chuyển đến phương thức onTap() khi bạn đặt tab ở đâu đó trên bản đồ.

0

@Sandy là đúng nhưng thay vì ONTAP() override onSingleTapUp (MotionEvent e, MapView MapView) hoặc onSingleTapConfirmed (MotionEvent e, MapView MapView) phương pháp, ví dụ

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

này là việc triển khai MapView của riêng tôi để có được vị trí đang nhấp vào bản đồ.

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

    } 

} 

Để nhận vị trí, chỉ đặt giao diện 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

Bạn phải tạo Overlay và ghi đè onSingleTapConfirmed.

Hãy thử cách này:

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); 
Các vấn đề liên quan