叠加图不在正确的位置

问题描述:

我有一个非常奇怪的问题。叠加图不在正确的位置

首先,当我放大和缩小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

因为没有一个正确回答这个问题..

出于某种原因,正常覆盖类是不工作对我来说,应该有办法。我切换到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(); 
     }` 

动画显示给定的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