GeoPoint.toPixel - Werte

  • 13 Antworten
  • Letztes Antwortdatum
N

nebuto

Neues Mitglied
0
Hallo

Ich versuch die ganze Zeit auf der Map die Verbindung zwischen 2 Geopoints zu zeichnen.

GeoPoint gP1 = new GeoPoint((int) lat, (int) lng);

lat += 0.03*1E6;
lng += 0.03*1E6;

GeoPoint gP2 = new GeoPoint((int) lat, (int) lng);
projection.toPixels(gP1, p1);
projection.toPixels(gP2, p2);

canvas.drawLine(p1.x, p1.y,p2.x, p2.y, mPaint);

Log.e("Punkte", p1.x +" "+ p1.y + " " + p2.x + " " + p2.y );

Der Log Spuckt folgende x,y Werte für p1, p2
Die sich verändern, wenn ich das Handy drehe.

05-17 18:28:33.981: ERROR/Punkte(16040): 82 66 96 43

05-17 18:28:41.791: ERROR/Punkte(16040): 242 281 256 258

05-17 18:29:06.421: ERROR/Punkte(16040): 322 201 336 178

Aber kein Punkt stimmt mit den von mir vorgezeichneten Images überein.
Was mach ich nur falsch ?
 
Hm, evtl. hilft es, wenn du mehr von dem Code zeigst...
 
hier ist meine mapTestAct.java

package com.mapper;

import java.util.ArrayList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

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


public class mapTestAct extends MapActivity {
/** Called when the activity is first created. */

private MapView mapView;
private ArrayList<OverlayItem> gpsOverlay = new ArrayList<OverlayItem>();
private GeoPoint point;
List<Overlay> mapOverlays;
Drawable drawable;
HelloItemizedOverlay itemizedOverlay;
OverlayItem overlayitem;
private Projection projection;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);

mapOverlays = mapView.getOverlays();

drawable = this.getResources().getDrawable(R.drawable.androidmarker);
itemizedOverlay = new HelloItemizedOverlay(drawable);

projection = mapView.getProjection();

double lat = 50.742400*1E6;
double lng = 7.118600*1E6;

for (int i = 0; i < 4; i++)
{
point = new GeoPoint((int)lat, (int) lng);
overlayitem = new OverlayItem(point, "", "");

gpsOverlay.add(new OverlayItem(point, "", ""));

lng += 0.03*1E6;
lat += 0.03*1E6;
}

for (OverlayItem oi: gpsOverlay)
itemizedOverlay.addOverlay(oi);

mapOverlays.add(itemizedOverlay);
mapOverlays.add(new MyOverlay());

}

class MyOverlay extends Overlay{

private Paint mPaint;
private Point p1 = new Point();
private Point p2 = new Point();

private double lat = 50.742400*1E6;
private double lng = 7.118600*1E6;

public MyOverlay()
{
GeoPoint gP1 = new GeoPoint((int) lat, (int) lng);

lat += 0.03*1E6;
lng += 0.03*1E6;

GeoPoint gP2 = new GeoPoint((int) lat, (int) lng);
projection.toPixels(gP1, p1);
projection.toPixels(gP2, p2);

}

public void draw(Canvas canvas, MapView mapv, boolean shadow){
super.draw(canvas, mapv, shadow);

mPaint = new Paint();
mPaint.setDither(true);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeWidth(3);

canvas.drawLine(p1.x, p1.y,p2.x, p2.y, mPaint);
Log.e("Punkte", p1.x +" "+ p1.y + " " + p2.x + " " + p2.y );

}
}


@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
 
Zuletzt bearbeitet:
Hm, also das Problem ist wohl, dass du in der Zählschleife die Marker mit dem GeoPoint verbindest, wohingegen du die Linie mit der Projection verknüpfst, d.h. du zeichnest einmal auf GeoKoordinaten und einmal auf Bildschirmkoordinaten => die Punkte stimmen nicht überein!

Du musst natürlich alles, was du zeichnen willst, auf Bildschirmkoordinaten (projection) zeichnen.
 
ja das stimmt wohl ...

Wenn ich jetzt aber die Geopunkte auch in Bildschirmkoordinaten umwandel, verbindet der zwar die Punkte mit den Linien, aber dann stimmt die Überdeckung mit der Karte nicht mehr.

Die GPS koordinaten sind aber die richtigen. DH auf der Landkarte zeichne ich an den richtigen Punkten meine Images.

Gibts denn irgendeinen Weg (ohne Projection) wie ich einfach zwischen 2 GeoPoints ne Linie malen kann ?

Oder hast du sonst einen Tip ?
 
Also so mach ich es in meiner App:

Die Klasse für die MapOverlays:

Code:
static class MapOverlay extends com.google.android.maps.Overlay {
        @Override
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
            super.draw(canvas, mapView, shadow);
            Point screenPoints_currentLoc = new Point();
            Point screenPoints_currentStationLoc = new Point();
            // Geokoordinaten in Bildschirmkoordinaten umwandeln
            mapView.getProjection().toPixels(currentLoc, screenPoints_currentLoc);
            mapView.getProjection().toPixels(currentStationLoc, screenPoints_currentStationLoc);
            // Verbindungslinie zwischen den Orten
            if (showLine) {
                Paint lineStyle = new Paint();
                lineStyle.setColor(Color.YELLOW);
                lineStyle.setStyle(Style.FILL_AND_STROKE);
                lineStyle.setStrokeWidth(3);
                canvas.drawLine(screenPoints_currentLoc.x, screenPoints_currentLoc.y, screenPoints_currentStationLoc.x, screenPoints_currentStationLoc.y, lineStyle);
            }
            // Marker erstellen
            Bitmap currentLocMarker = BitmapFactory.decodeResource(res, R.drawable.gmarker_green);
            Bitmap currentStationLocMarker = BitmapFactory.decodeResource(res, R.drawable.gmarker_red);
            // Marker setzen
            canvas.drawBitmap(currentLocMarker, screenPoints_currentLoc.x - halfPicWidth, screenPoints_currentLoc.y - PicHeight, null);
            canvas.drawBitmap(currentStationLocMarker, screenPoints_currentStationLoc.x - halfPicWidth, screenPoints_currentStationLoc.y - PicHeight, null);
            return true;
        }
    }
Und hier der Aufruf im Programmablauf:

Code:
                MapOverlay markers = new MapOverlay();
                List<Overlay> listOfMarkers = mapView.getOverlays();
                listOfMarkers.clear();
                listOfMarkers.add(markers);

Vielleicht hilft dir das ja ;)
 
hey danke !

Das läuft einwandfrei ;-)
Jetzt komm ich endlich weiter mit dem Projekt.

Hab noch eine Frage und hoffe die ist nicht zu dumm.
Ich hab seit gestern ein neues Netbook und hab da auch Eclipse und Android installiert.
Hab mittels AndroidDeviceManager sämtliche Pakete und APIs installiert.
Mein anderes Projekt läst sich auch einfach auschecken.

Hab bei meinem Projekt auch Google API 3.1 aktiviert anstatt Android.

Wenn ich jetzt allerdings vom Netbook auschecke, dann bekomm ich nur ein Gitternetz.
Muss ich für das Netbook wieder einen neuen API-Key besorgen, oder kann ich sonst noch was vergessen haben ?
 
Hm, also der API-Key ist soweit ich weiß mit deinem Zertifikat verknüpft, mit der du deine App signierst.
Wichtig ist, dass du 2 API-Keys besitzt, einen für deine fertige apk (die dann mit deinem Zertifikat signiert wird für den Market) und einen für das debuggen (für die apk die dann mit dem Debug-Zertifikat signiert wird).

Evtl. mal schauen, ob du in beiden Fällen das gleiche Prozedere vollziehst.
 
An fertige APK ist erstmal nicht zu denken, weil das Projekt noch ein paar Monate dauern wird.
Aber der debug API-Key sollte auf mehreren Rechnern funktionieren oder nicht ?
Ich arbeite mit SVN und sobald ich die APK von meinem Netbook aus auf meinem Handy teste, zeigt er mir keine Karten, sondern nur ein Gittermuster an.
 
Triviale Frage: Internetverbindung vorhanden?
 
Jau internet hat das Handy und das Netbook auch.
 
irgendjemand ne Idee ?

is halt blöde, da ich jetzt weiterhin mit dem Laptop unterwegs sein muss, und mein neues Netbook zu Hause verstaubt :-o

das Projekt ist auf beiden Rechnern 1 zu 1 das selbe.
Wurde importiert über SVN.
Haben auch den gleichen API Key (braucht jeder Rechner nen eigenen ?)

Auf beiden ist beim Project als Target Google API 3.1 Level 12 eingestellt.
Wenn ich die App über den Laptop am Handy teste, dann sind die Karten da, wenn ich das über das Netbook mache, dann hab ich nur ein Gittermuster, aber ansonsten läuft die App.
 
Haha was mir grad dazu einfällt: das Debug Zertifikat ist mit Sicherheit nicht bei jeder Installation von Eclipse der gleiche! Also brauchste wohl noch nen API Key für das Debug Zertifikat der Netbook Installation.

Hätt ich auch mal früher drauf kommen können -.-
 
alles klar ! Vielen Dank ChemDroid.

Hab jetzt nen 2. Key und jetzt läuft erstml wieder alles wie gewünscht :)
Echt blöde, dass man immer die Keys tauschen muss, aber hauptsache es läuft jetzt.

Muchas Gracias nochmal und bis zum nächsten Problem ;-)
 

Ähnliche Themen

5
Antworten
22
Aufrufe
1.745
590239
5
R
  • RalfKahl
Antworten
10
Aufrufe
566
RalfKahl
R
H
  • HoustonWeHaveAProblem
Antworten
3
Aufrufe
942
moin
M
Zurück
Oben Unten