Android MapView Projection returning negative numbers
I'm using the below code to put an overlay on my MapView. For some reason after itterating through the location data it draws the point in the same place.
It seems to be happening on conversion from Location to GeoPoint to Projection:
Location (lat : lon) 51.2651789188385 : -0.5398589372634888
Projection (x : y) 239 : 361
Location (lat : lon) 51.26375198364258 : -0.5417096614837646
Projection (x : y) 239 : 361
Locations are Doubles GeoPoints are Integers Projections are screen coordinates.
Could someone please look over the below code and find if i am doing something wrong?
thanks
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; Doub开发者_如何学Gole 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>
I don't know what the problem is with this one. I couldn't get it working and the debug was showing no errors so in the end i used code from the Google Mytracks project to enable the map view and projection problems
http://code.google.com/p/mytracks/
You should look at this The projection value to pixel may vary.
as http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html#getProjection%28%29 says that "The Projection of the map in its current state. You should not hold on to this object for more than one draw, since the projection of the map could change."
Instead of writing
projection.toPixels(geopoint2, point2);
you must code as
mapView.getProjection().toPixels(geopoint2, point2);
精彩评论