2012-12-24 102 views
0

我有一個非常奇怪的問題。疊加圖不在正確的位置

首先,當我放大和縮小MapView時,標記(疊加層)移動到不正確的位置(對縮放無效)。

其次,市場被拉錯了位置!

下面我將張貼代碼,但第一次聽這樣的:

我在伊斯蘭堡我。 GeoCoder也告訴我我在伊斯蘭堡。但是,當我用覆蓋物在我的位置周圍繪製一個圓圈時,它會將它繪製在一個距離數百公里的城市。

請幫助我解決這兩個問題。

這裏的活動:

public class LocatePickup extends MapActivity implements LocationListener { 
    Geocoder gc; 

    MapView mapView; 
    MapController mc; 
    GeoPoint p; 

    double lat = 0; 
    double lng = 0; 

    LocationManager lm; 

    WebMethods wm; 

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

     mapView = (MapView) findViewById(R.id.mapView); 
     mapView.setBuiltInZoomControls(true); 
     mapView.setStreetView(true); 

     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 500.0f, this); 

     Location l = new Location(LocationManager.NETWORK_PROVIDER); 
     l = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

     mc = mapView.getController(); 
     p = new GeoPoint((int) (l.getLatitude()), (int) (l.getLongitude())); 
     mc.setCenter(p); 
     mc.setZoom(14); 

     MapOverlay myLocationOverlay = new MapOverlay(); 
     List<Overlay> list = mapView.getOverlays(); 
     list.add(myLocationOverlay); 

     gc = new Geocoder(this); 
     try { 
      List<Address> address = gc.getFromLocation(l.getLatitude(), l.getLongitude(), 1); 
      Toast.makeText(this, ""+address.get(0).getAddressLine(1), 1).show(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     return false; 
    } 

    class MapOverlay extends com.google.android.maps.Overlay { 
     Paint paint = new Paint(); 
     @Override 
     public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { 
      super.draw(canvas, mapView, shadow); 

      Point myScreenCoords = new Point(); 
      mapView.getProjection().toPixels(p, myScreenCoords); 

      paint.setStrokeWidth(1); 
      paint.setARGB(255, 218, 28, 28); 
      paint.setStyle(Paint.Style.STROKE); 

      //Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pin); 

      canvas.drawCircle(myScreenCoords.x, myScreenCoords.y, 15, paint); 
      //(bmp, myScreenCoords.x, myScreenCoords.y - 256, paint); 
      canvas.drawText("Hey!", myScreenCoords.x, myScreenCoords.y, paint); 
      return true; 
     } 
    } 

    @Override 
    public void onLocationChanged(Location arg0) { 
     if(arg0 != null) { 
      Log.d("New Location: ", arg0.getLatitude() + " - " + arg0.getLongitude()); 
      lat = arg0.getLatitude(); 
      lng = arg0.getLongitude(); 

      p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000); 
      mc.animateTo(p); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // empty 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // empty 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     //empty 
    } 
} 

一旦完成了代碼,我希望用戶能夠點擊地圖上的一個點,並得到它的地址(標記應該移動到這個位置作爲好)。但它應該是準確的。

+0

將mc.setzoom(14)更改爲mc.setzoom(18); – appukrb

回答

0

因爲沒有一個正確回答這個問題..

出於某種原因,正常覆蓋類是不工作對我來說,應該有辦法。我切換到ItemizedOverlay,現在一切都很完美。

我不是Android專家,所以我希望有更好的經驗的人對此發表評論,但是,我覺得ItemizedOverlay比簡單的Overlay好得多。使用itemizedoverlay時,使用在固定點繪製的對象放大和縮小mapview的方式應該是這樣,pin(對象)保持它應該保持的位置(以前不是這種情況)。

下面是一些代碼,供那些正在尋找它的人使用。這當然是不完整的,並且爲了一個特定的目的,但是你得到了一般的想法。

`class CustomOverlay extends com.google.android.maps.ItemizedOverlay { private ArrayList mOverlays = new ArrayList(); 上下文mContext;

public CustomOverlay(Drawable defaultMarker) 
    { 
     super(defaultMarker); 

    } 

    public void addOverlay(OverlayItem overlay) 
    { 
     mOverlays.add(overlay); 
     populate(); 
    } 

    @Override 
    protected OverlayItem createItem(int i) 
    { 
     return mOverlays.get(i); 
    } 

    @Override 
    public int size() 
    { 
     return mOverlays.size(); 
    } 

    public CustomOverlay(Drawable defaultMarker, Context context) 
    { 
     super(boundCenterBottom(defaultMarker)); 
     mContext = context; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    { 
     if (event.getAction() == 1) 
     { 
      p = mapView.getProjection().fromPixels((int) event.getX(), 
        (int) event.getY()); 

      gc = new Geocoder(getBaseContext(), Locale.getDefault()); 
      try 
      { 
       address = gc.getFromLocation(
         (double) p.getLatitudeE6()/1E6, 
         (double) p.getLongitudeE6()/1E6, 1); 

       addressfound = true; 
      } 
      catch (IOException e) 
      { 
       addressfound = false; 
       e.printStackTrace(); 
      } 

      if (address.size() != 0) 
      { 
       l1 = address.get(0).getAddressLine(0); 
       l2 = address.get(0).getAddressLine(1); 
       l3 = address.get(0).getAddressLine(2); 
      } 

      OverlayItem point = new OverlayItem(p, "Location", l1 + ", " 
        + l2 + ", " + l3); 
      List<Overlay> mapOverlays = mapView.getOverlays(); 
      Drawable drawable = getBaseContext().getResources() 
        .getDrawable(R.drawable.androidmarker); 
      CustomOverlay itemizedoverlay = new CustomOverlay(drawable, 
        getBaseContext()); 

      itemizedoverlay.addOverlay(point); 
      mapOverlays.clear(); 
      mapOverlays.add(itemizedoverlay); 

      mapView.invalidate(); 
     }` 
0

動畫顯示給定的GeoPoint地圖,使用animateTo()方法,

所以實現你的方法一zoomListener,並添加行,

mapController.animateTo(geoPoint); 

也嘗試mapview.invalidate()

順便說一句,如果你不知道要實現變焦監聽器,請參閱 How to implemennt OnZoomListener on MapView

對於第二個問題,您僅使用了NETWORK_PROVIDER,這比使用GPS獲取位置值的準確度要低。因此,請嘗試使用GPS_PROVIDER。高效且正確的實施可以爲您提供更準確的值。

而要拿到現貨的緯度和經度感動在地圖上,在mapOverlay類使用GeoCoder

Geocoder geoCoder = new Geocoder(
       getBaseContext(), Locale.getDefault()); 
try { 
    List<Address> addresses = geoCoder.getFromLocation(latitude/1E6, 
        longitude/1E6, 1); 
       String add = ""; 
       if (addresses.size() > 0) 
       { 
        for (int i=0; i<addresses.get(0).getMaxAddressLineIndex(); 
         i++) 
         add += addresses.get(0).getAddressLine(i) + "\n"; 
       } 

       Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show(); 
    }catch (IOException e) {     
       e.printStackTrace(); 
    } 
實施 onTouchEvent

@Override 
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    { 
     //---when user lifts his finger--- 
     if (event.getAction() == 1) {     
      GeoPoint p = mapView.getProjection().fromPixels(
       (int) event.getX(), 
       (int) event.getY()); 
       Toast.makeText(getBaseContext(), 
        p.getLatitudeE6()/1E6 + "," + 
        p.getLongitudeE6() /1E6 , 
        Toast.LENGTH_SHORT).show(); 
     }        
     return false; 
    } 

你可以從緯度和經度的地址

如果您想爲該點添加標記,請爲該點添加overlayItem並將其添加到疊加層。

+0

謝謝,但我的問題仍未得到答覆。標記爲什麼出現在錯誤的地方?我告訴你,即使在基於網絡的位置,它的工作正常(吐司告訴我)。位置是正確的,但標記是在錯誤的位置繪製的。 – Asim

+0

哇,你忘了把經度和經度乘以** 1E6 ** .... – cyn0

+1

'p = new GeoPoint((int)(l.getLatitude()* 1E6),(int)(l.getLongitude()* 1E6));' – cyn0