2010-11-24 8 views
0

Ich versuche nur, eine grundlegende Frage zur Android-Navigation zu verstehen, nämlich "Wie kann ich den aktuellen Standort anzeigen?". Ich habe ein wenig Code aus Artikeln und Tutorials aus meinen langen Google-Sitzungen verwendet. Die Anzeige einer einfachen Überlagerung (Kreis + Textnachricht) funktioniert, allerdings bei einer falschen Bildschirmposition (scheinbar am Äquator).Aktueller Standort wird unter falschen Bildschirmkoordinaten angezeigt

Mein Code Setup enthält eine kleine innere Klasse, die implements LocationListener und seine onLocationChanged Event-Handler ruft diese Methode:

protected void createAndShowCustomOverlay(Location newLocation) 
{ 
    double lat = newLocation.getLatitude(); 
    double lng = newLocation.getLongitude(); 

    // geoPointFromLatLng is an E6 converter : 
    // return new GeoPoint((int) (pLat * 1E6), (int) (pLng * 1E6)); 
    GeoPoint geopoint = GeoFunctions.geoPointFromLatLng(lat, lng); 

    CustomOverlay overlay = new CustomOverlay(geopoint); 

    mapView.getOverlays().add(overlay); 
    mapView.getController().animateTo(geopoint); 

    mapView.postInvalidate(); 
} 

Bis zu diesem Punkt, es sieht alles ok, ich habe gedebuggt um und die Nicht- Das transformierte Lat/lng-Paar ist in Ordnung, die E6-Variante davon ist ebenfalls in Ordnung. Hier ist die CustomOverlay Klasse:

public class CustomOverlay extends Overlay 
{ 

    private static final int CIRCLERADIUS = 2; 
    private GeoPoint geopoint; 

    public CustomOverlay(GeoPoint point) 
    { 
    geopoint = point; 
    } 

    @Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) 
    { 
    // Transfrom geoposition to Point on canvas 
    Projection projection = mapView.getProjection(); 
    Point point = new Point(); 
    projection.toPixels(geopoint, point); 

    // background 
    Paint background = new Paint(); 
    background.setColor(Color.WHITE); 
    RectF rect = new RectF(); 
    rect.set(point.x + 2 * CIRCLERADIUS, point.y - 4 * CIRCLERADIUS, 
     point.x + 90, point.y + 12); 

    // text "My Location" 
    Paint text = new Paint(); 
    text.setAntiAlias(true); 
    text.setColor(Color.BLUE); 
    text.setTextSize(12); 
    text.setTypeface(Typeface.MONOSPACE); 

    // the circle to mark the spot 
    Paint circle = new Paint(); 
    circle.setColor(Color.BLUE); 
    circle.setAntiAlias(true); 

    canvas.drawRoundRect(rect, 2, 2, background); 
    canvas.drawCircle(point.x, point.y, CIRCLERADIUS, circle); 
    canvas.drawText("My Location", point.x + 3 * CIRCLERADIUS, point.y + 3 
        * CIRCLERADIUS, text); 
    } 
} 

Es ist definitiv ein Projektionsfehler der Art, da alle meine geo fix'd coords auf dem Äquator am Ende, so gibt es einige 0.0 Werte um geworfen zu werden.

Ich kann andere Details zur Verfügung stellen, wenn ich Code auf dem Emulator, Google Maps API Level 8 (Android 2.2) ausführen und ich bekomme Kacheln und das CustomOverlay (Kreis + Text) wird angezeigt, nur zu einem wirklich falschen Position (Coords wie 54.foo und 8.bar sind weit weg).

Die Codebase könnte etwas älter sein, dann wird vielleicht eine Projektion wie toPixels nicht mehr benötigt? Keine Ahnung.

Vielen Dank im Voraus!

Antwort

1

Gelöst, stellt sich heraus, dass der über Telnet gesendete Befehl "geo fix" ein Paar (Lng, Lat) und kein Paar (Lat, Lng) benötigt. Inkonsistenz von seiner besten Seite! Danke für die Eingabe.

0

Wenn Sie nur den aktuellen Standort anzeigen und ihn mit einem kleinen blinkenden Kreis auf dem Bildschirm aktualisieren möchten, wie es Google Maps für Android tut, dann verfügt Android über eine Standardimplementierung dieser Funktion.

MyLocationOverlay myLocationOverlay = new MyLocationOverlay(context, mapView); 
    myLocationOverlay.enableMyLocation(); 
    mapView.getOverlays().add(myLocationOverlay); 

Das ist es Android wird alles handhaben.

+0

Ich habe das schon mal probiert, danke für die Eingabe. In welchem ​​Format muss ich die Coords einreichen? Ich denke, das Senden der falsch formatierten Koordinaten war mein Problem, alle lat/lng Paare, die ich gesehen habe, haben normalerweise einen negativen Lat-Wert (z. B. geo fix -82.411629 28.054553), warum ist das? – Dr1Ku

+0

Yeah stellt sich heraus, dass Sie sie telnet, verwenden die eingebauten Sachen von Eclipse nicht so gute Ergebnisse. Es funktioniert mit überarbeiteten und korrekt eingegebenen Lat/Ing-Paaren. Danke noch einmal ! – Dr1Ku

+0

Oh, wow sachlich geo fix will (lng, lat), nicht (lat, lng) - so wie fast jede geo-bezogene App Coords behandelt. – Dr1Ku

Verwandte Themen