Android MapView Projection возвращает отрицательные числа - PullRequest
2 голосов
/ 01 ноября 2010

Я использую приведенный ниже код для наложения на мой 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 - это целые числа. Проекции - это экранные координаты.

Может кто-нибудь взглянет на приведенный ниже код и узнает, что я делаю что-то не так?

спасибо

</p> <pre>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; } }

Ответы [ 2 ]

0 голосов
/ 27 июня 2012

Вы должны посмотреть на это. Значение проекции на пиксель может варьироваться.

as 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); 
0 голосов
/ 31 декабря 2010

Я не знаю, в чем проблема с этим. Я не мог заставить его работать, и отладка не показывала ошибок, поэтому в конце я использовал код из проекта Google Mytracks для разрешения проблем с просмотром карты и проекцией

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

...