2012-06-28 49 views
0

我的地圖代碼是這樣的:如何獲取特定覆蓋物品的經度和緯度?

public class ExampleActivity extends MapActivity { 
    private MapView map = null; 
    private MyLocationOverlay me = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     map = (MapView) findViewById(R.id.map); 

     map.getController().setCenter(getPoint(18.5236296, 73.8478429)); 
     map.getController().setZoom(17); 
     map.setBuiltInZoomControls(true); 

     Drawable marker = getResources().getDrawable(R.drawable.marker); 

     marker.setBounds(0, 0, marker.getIntrinsicWidth(), 
       marker.getIntrinsicHeight()); 

     map.getOverlays().add(new SitesOverlay(marker)); 

     me = new MyLocationOverlay(this, map); 
     map.getOverlays().add(me); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     me.enableCompass(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     me.disableCompass(); 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 

     return (false); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 

     if (keyCode == KeyEvent.KEYCODE_S) { 

      map.setSatellite(!map.isSatellite()); 
      return (true); 
     } else if (keyCode == KeyEvent.KEYCODE_Z) { 

      map.displayZoomControls(true); 
      return (true); 
     } 

     return (super.onKeyDown(keyCode, event)); 
    } 

    private GeoPoint getPoint(double lat, double lon) { 

     return (new GeoPoint((int) (lat * 1000000.0), (int) (lon * 1000000.0))); 
    } 

    private class SitesOverlay extends ItemizedOverlay<OverlayItem> { 

     private List<OverlayItem> items = new ArrayList<OverlayItem>(); 
     private Drawable marker = null; 
     private OverlayItem inDrag = null; 
     private ImageView dragImage = null; 
     private int xDragImageOffset = 0; 
     private int yDragImageOffset = 0; 
     private int xDragTouchOffset = 0; 
     private int yDragTouchOffset = 0; 

     public SitesOverlay(Drawable marker) { 
      super(marker); 
      this.marker = marker; 

      dragImage = (ImageView) findViewById(R.id.drag); 
      xDragImageOffset = dragImage.getDrawable().getIntrinsicWidth()/2; 
      yDragImageOffset = dragImage.getDrawable().getIntrinsicHeight(); 

      items.add(new OverlayItem(getPoint(18.5236296, 73.8478429), "Pune", 
        "Wakad")); 

      populate(); 
     } 

     @Override 
     protected OverlayItem createItem(int i) { 

      return (items.get(i)); 
     } 

     @Override 
     public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
      super.draw(canvas, mapView, shadow); 

      boundCenterBottom(marker); 
     } 

     @Override 
     public int size() { 

      return (items.size()); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event, MapView mapView) { 

      final int action = event.getAction(); 
      final int x = (int) event.getX(); 
      final int y = (int) event.getY(); 
      boolean result = false; 

      if (action == MotionEvent.ACTION_DOWN) { 

       for (OverlayItem item : items) { 
        Point p = new Point(0, 0); 

        map.getProjection().toPixels(item.getPoint(), p); 

        if (hitTest(item, marker, x - p.x, y - p.y)) { 

         result = true; 
         inDrag = item; 
         items.remove(inDrag); 
         populate(); 

         xDragTouchOffset = 0; 
         yDragTouchOffset = 0; 

         setDragImagePosition(p.x, p.y); 
         dragImage.setVisibility(View.VISIBLE); 

         xDragTouchOffset = x - p.x; 
         yDragTouchOffset = y - p.y; 

         break; 
        } 
       } 
      } else if (action == MotionEvent.ACTION_MOVE && inDrag != null) { 

       setDragImagePosition(x, y); 
       result = true; 
      } else if (action == MotionEvent.ACTION_UP && inDrag != null) { 

       dragImage.setVisibility(View.GONE); 

       GeoPoint pt = map.getProjection().fromPixels(
         x - xDragTouchOffset, y - yDragTouchOffset); 
       OverlayItem toDrop = new OverlayItem(pt, inDrag.getTitle(), 
         inDrag.getSnippet()); 

       items.add(toDrop); 
       populate(); 

       inDrag = null; 
       result = true; 
      } 

      return (result || super.onTouchEvent(event, mapView)); 
     } 

     private void setDragImagePosition(int x, int y) { 

      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) dragImage 
        .getLayoutParams(); 

      lp.setMargins(x - xDragImageOffset - xDragTouchOffset, y 
        - yDragImageOffset - yDragTouchOffset, 0, 0); 
      dragImage.setLayoutParams(lp); 
     } 
    } 
} 

這顯示在地圖上的標記,我可以拖動該標記拖放到地圖上的其他一些地方....所以現在,我的問題是如何獲取標記的當前位置的經度和緯度?

+0

http://stackoverflow.com/questions/4238530/android-mapview-draggable-marker – MKJParekh

+0

這我使用的代碼....得到可拖動的標記...但沒有任何解釋關於如何獲得當前標記位置的經度和緯度 –

+0

因爲他沒有得到這樣做的報酬,所以他這樣做並將其用於社區使用,如果你研究的代碼有事情已經完成,因爲我用它來拖動標記,並很快用戶放下它,我確實顯示了一個對話框,當前位置lat long ..所以我知道它的可能的 – MKJParekh

回答

2

在拖放代碼的onTouchListener,可以使用下面的代碼來獲取GeoPoint

if (action == MotionEvent.ACTION_UP && inDrag != null) { 
    GeoPoint pt = map.getProjection().fromPixels(
         x - xDragTouchOffset, y - yDragTouchOffset); 

    taplat = pt.getLatitudeE6()/1E6; // latitude 
    taplon = pt.getLongitudeE6()/1E6; // longitude 
} 
+0

好的,謝謝 –

+0

@ MKJPareksh有沒有一種方法可以在地圖上繪製一個區域,拖動我們的手指,然後獲取區域細節,如 - 如果它的圓圈,1.zoomlevel 2.center point lat和long 3 。半徑 –

+0

@ Archie.bpgc不,我沒有做過這樣的事情,但我想Same OnTouchListner將成爲起點。 – MKJParekh