Android MapView Projection返回负数

时间:2010-10-31 22:48:24

标签: android gps overlay android-mapview projection

我正在使用以下代码在MapView上添加叠加层。由于某些原因,在通过位置数据进行迭代后,它会在相同位置绘制点。

从位置到GeoPoint到投影的转换似乎正在发生:

Location (lat : lon) 51.2651789188385  : -0.5398589372634888
Projection (x : y)   239               : 361
Location (lat : lon) 51.26375198364258 : -0.5417096614837646
Projection (x : y)   239               : 361

地点是双打 GeoPoints是整数 投影是屏幕坐标。

有人可以查看下面的代码,看看我做错了吗?

感谢

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.location.Location;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public class ROverlay extends Overlay {

  private Context context;
  private HashMap<String, Location> friendLocations;
  private ArrayList<LocationData> locD;
  private Location location;
  private GeoPoint locationPoint;

  private Paint paint;
  private Paint backPaint;

  private static int markerRadius = 7;

  /** Get your current location */
    public Location getLocation() {
        return location;
}
/** Set your current location */
public void setLocation(Location location) {
  this.location = location;

  Double latitude = location.getLatitude()*1E6;
  Double longitude = location.getLongitude()*1E6;

  locationPoint = new GeoPoint(latitude.intValue(),longitude.intValue());      
}  

/** Refresh the locations of each of the contacts */
 public void refreshLocation() {
  locD = RMapView.getARR();
 }

   /**
 * Create a new FriendLocationOverlay to show your contact's locations on a map
 * @param _context Parent application context
 */
public ROverlay(Context _context) {
super();

context = _context;
friendLocations = new HashMap<String, Location>();
locD = new ArrayList<LocationData>();
//refreshFriendLocations();

// Create the paint objects
backPaint = new Paint();
backPaint.setARGB(200, 200, 200, 200);
backPaint.setAntiAlias(true);

paint = new Paint();
paint.setDither(true);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(5);   
 }

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

// Get the map projection to convert lat/long to screen coordinates
Projection projection = mapView.getProjection();

for (int q = 1; q < locD.size(); q++){
    Double latitude = locD.get(q-1).mLocation.getLatitude()*1e6;
    Double longitude = locD.get(q-1).mLocation.getLongitude()*1e6;
    GeoPoint geopoint = new GeoPoint(latitude.intValue(),longitude.intValue());
    //Log.d("Double", ""+latitude+" : "+longitude);
    //Log.d("Geopoint", ""+geopoint.getLatitudeE6()+" : "+geopoint.getLongitudeE6());
    Point point = new Point();
    projection.toPixels(geopoint, point);

    Double latitude2 = locD.get(q).mLocation.getLatitude()*1e6;
    Double longitude2 = locD.get(q).mLocation.getLongitude()*1e6;
    GeoPoint geopoint2 = new GeoPoint(latitude2.intValue(),longitude2.intValue());
    Point point2 = new Point();
    projection.toPixels(geopoint2, point2); 

    canvas.drawLine(point.x, point.y, point2.x, point2.y, paint);
    canvas.drawPoint(point.x, point.y, paint);
    Log.d("Point", ""+point.x+" : "+point.y);
}
super.draw(canvas, mapView, shadow);
}

@Override
public boolean onTap(GeoPoint point, MapView mapView) {
  // Do not react to screen taps.
  return false;
}
}

</code>

2 个答案:

答案 0 :(得分:0)

我不知道这个问题是什么。我无法使其工作,调试显示没有错误,所以最后我使用了Google Mytracks项目中的代码来启用地图视图和投影问题

http://code.google.com/p/mytracks/

答案 1 :(得分:0)

你应该看看这个像素的投影值可能会有所不同。

正如http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html#getProjection%28%29所说“地图的投影处于当前状态。由于地图的投影可能会发生变化,因此您不应该抓住此对象进行多次绘制。”

而不是写

projection.toPixels(geopoint2, point2); 

您必须编码为

mapView.getProjection().toPixels(geopoint2, point2); 
相关问题