我正在使用以下代码在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>
答案 0 :(得分:0)
我不知道这个问题是什么。我无法使其工作,调试显示没有错误,所以最后我使用了Google 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);