2012-05-21 14 views
6

Me gustaría convertir un GeoPoint en un punto de pantalla para identificar todos los objetos que están encima de un evento táctil. lo tanto, he intentado esto:Cómo convertir un GeoPoint en un punto de pantalla de hardware

Projection projection = this.mapView.getProjection(); 
GeoPoint gie = new GeoPoint(lat, lon); 
Point po = new Point(); 
projection.toPixels(gie, po); 

Pero, po.x y po.y no son las coordenadas de pantalla, pero las coordenadas MapView en píxeles en lugar de lat, lon.

Desde el sitio web para desarrolladores de Android:

toPixels (GeoPoint en, android.graphics.Point fuera) Convierte el GeoPoint dado a las coordenadas del pixel en pantalla, en relación con la parte superior izquierda de la MapView que proporcionó esta Proyección.

Entonces, ¿es posible convertirlo en los coords de pantalla correctos?

Quiero saber todo el x GeoPoint que están junto al evento táctil + como en el ejemplo anterior:

---------------------------------------------------------------- 
(0,0) -----------> x           | 
    |               | 
    |               | 
    |               | <-- My screen 
    |        + (touch event)    | 
\/       x (my GeoPoint)     | 
    y               | 
                   | 
---------------------------------------------------------------- 

consigo el caso del tacto de esa manera:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 

Aquí, en este código, xey son los coords de pantalla real (los de hardware, no los mapview)

Sé que también puedo convertir coordenadas x, y en pantalla en GeoPoint para compararlas con mi GeoPoint, pero, debido al nivel de zoom, no puedo obtener lo que quiero.

Respuesta

1

He encontrado una solución, no sé si es la mejor manera de obtenerla, ¡pero funciona!

que he encontrado gracias a su ayuda @nickt, el método getScreenRect() que devuelven los límites actuales de la pantalla en coordenadas de pantalla.

Aquí el código:

float pisteX; 
float pisteY; 
Projection projection = this.mapView.getProjection(); 
Point pt = new Point(); 
GeoPoint gie = new GeoPoint(latitude,longitude); 
Rect rec = mapView.getScreenRect(new Rect()); 
projection.toPixels(gie, pt); 
pisteX = pt.x-rec.left; // car X screen coord 
pisteY = pt.y-rec.top; // car Y screen coord 
2

No sé por qué está utilizando onTouchEvent, que es para un evento que no fue manejado por una vista. Si usa onTouch (Ver v0, MotionEvent e), esto le dará la información relativa a la vista y puede calcular las coordenadas de la pantalla utilizando los métodos getLeft y getBottom de la vista. Si comete un proyecto con un MapView que ocupa la parte inferior derecha de la pantalla como:

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
    <com.google.android.maps.MapView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/map" 
     android:layout_width="220dp" 
     android:layout_height="220dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:apiKey="Your API key" 
     android:clickable="true" /> 
</RelativeLayout> 

A continuación, ejecute el código

public class GoogleMapsTouchActivity extends MapActivity implements OnTouchListener { 

    private MapController mMapCtrlr; 
    private MapView mMapVw; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     mMapVw = (MapView) findViewById(R.id.map); 
     mMapVw.setReticleDrawMode(MapView.ReticleDrawMode.DRAW_RETICLE_OVER); 
     mMapCtrlr = mMapVw.getController(); 
     mMapCtrlr.setZoom(15); 
     mMapCtrlr.setCenter(new GeoPoint(53500000, -3000000)); 
     mMapVw.setOnTouchListener(this); 
    } 

    @Override 
    public boolean onTouch(View v0, MotionEvent e) { 
     // Only fires if Mapview touched 
     float x = e.getX(); // relative to VIEW 
     float y = e.getY(); // relative to VIEW 
     float x2; // relative to SCREEN 
     float y2; // relative to SCREEN 
     if (e.getAction() == MotionEvent.ACTION_DOWN) { 
      Toast.makeText(this, "View x = " + x + " View y = " + y, Toast.LENGTH_SHORT).show(); 
      x2 = mMapVw.getLeft() + x; 
      y2 = mMapVw.getBottom() + y; 
      Toast.makeText(this, "Screen x = " + x2 + " Screen y = " + y2, Toast.LENGTH_SHORT).show(); 
      GeoPoint gPt = mMapVw.getProjection().fromPixels((int) x, (int)y); 
      Toast.makeText(this, "Lat = " + gPt.getLatitudeE6() + " Lon = " + gPt.getLongitudeE6(), Toast.LENGTH_SHORT).show(); 

     } 
     return false; 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent e) { 
     // Only fires if screen touched outside a view 
     float x = e.getX(); 
     float y = e.getY(); 
     if (e.getAction() == MotionEvent.ACTION_DOWN) { 
      Toast.makeText(this, "Got touch EVENT x = " + x + " y = " + y, Toast.LENGTH_SHORT).show(); 
     } 
     return super.onTouchEvent(e); 
    } 
    @Override 
    protected boolean isRouteDisplayed() {return false;} 
} 

Si hace clic en la vista y en el área fuera de la vista de mapa, los mensajes de Toast deberían dejarlo todo claro.

+0

Gracias @nickt, tendrá una apariencia de su código, pero al final, no es lo que deseo. Porque me gustaría convertir la coordenada del objeto a los coords de la pantalla.Tengo un coche (lat, lon) ---> coche (GeoPoint) ---> automóvil (apunte en MapView) y me gustaría al final ----> coche (xey de la pantalla de la tableta) – Bibu

+0

Entonces, ¿qué tiene que ver el evento táctil con algo? ¿Por qué confundir el problema? Si sabe cómo obtener la xey en relación con el origen del mapa, simplemente agregue view.getLeft y view.getBottom para obtener x/y relativo al origen de la pantalla, como en el código entre comillas. – NickT

+0

En realidad, toco la pantalla para identificar qué coche he tocado. Todos mis autos tienen coordenadas Lat/Lon. Entonces, si quiero identificar qué coche está al lado del evento táctil (puede tener más de un automóvil encima), necesito saber la posición del automóvil en relación con la resolución de la pantalla. Si convierto el evento táctil a la vista del mapa, obtendré una posición lat/lon y la distancia entre el automóvil y el evento táctil dependerá del nivel de zoom. Entonces para mí es más simple comparar con la posición de la pantalla. Espero que mi mensaje sea lo suficientemente claro. – Bibu

Cuestiones relacionadas