Per l'API di Google Maps di Android, è possibile ottenere i limiti di ...
dal riferimento mappa, ottenere il Projection
da getProjection(). E,
una proiezione viene utilizzato per tradurre tra sul posto schermo e le coordinate geografiche ..
Così dalla proiezione, possiamo usare il getVisibleRegion(), e per ottenere il VisibleRegion della mappa, che contiene un LatLngBounds, che è una classe che contiene 2 variabili LatLng
, una per l'angolo nord-est del limite e una per l'angolo sud-ovest.
Così il codice dovrebbe essere simile a questa:
googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
LatLngBounds bounds = googleMap.getProjection().getVisibleRegion().latLngBounds;
LatLng northeast = bounds.northeast;
LatLng southwest = bounds.southwest;
Context context = getApplicationContext();
CharSequence text = "ne:"+northeast+" sw:"+southwest;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
});
= - = - = - = - = - = edit:
può essere ero troppo ingenuo, dato solo il NE e Il SW può risolvere questo problema, ma solo nel caso particolare in cui l'utente non ha ruotato la mappa o si inclina verso l'alto per la mappa 3D.
Quindi, invece, è possibile afferrare lo VisibleRegion
, che ha fornito 4 variabili, lontanoDiLight, lontanoLeft, nearRight, nearLeft, ognuno dei quali rappresenta 4 connessioni dell'area.
Poi possiamo calcolare la larghezza e l'altezza della zona per che i 4 punti e scegliere quello più piccolo (o meglio, a volte la larghezza può essere maggiore dell'altezza suppongo.)
e per il calcolo, possiamo solo usa la funzione Location.distanceBetween(x1,y1,x2,y2,result)
...
che rende il codice simile al seguente:
VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion();
LatLng farRight = visibleRegion.farRight;
LatLng farLeft = visibleRegion.farLeft;
LatLng nearRight = visibleRegion.nearRight;
LatLng nearLeft = visibleRegion.nearLeft;
float[] distanceWidth = new float[2];
Location.distanceBetween(
(farRight.latitude+nearRight.latitude)/2,
(farRight.longitude+nearRight.longitude)/2,
(farLeft.latitude+nearLeft.latitude)/2,
(farLeft.longitude+nearLeft.longitude)/2,
distanceWidth
);
float[] distanceHeight = new float[2];
Location.distanceBetween(
(farRight.latitude+nearRight.latitude)/2,
(farRight.longitude+nearRight.longitude)/2,
(farLeft.latitude+nearLeft.latitude)/2,
(farLeft.longitude+nearLeft.longitude)/2,
distanceHeight
);
float distance;
if (distanceWidth[0]>distanceHeight[0]){
distance = distanceWidth[0];
} else {
distance = distanceHeight[0];
}
grazie per la tua risposta, davvero apprezzata !! :) – awaistoor
Stavo per dire che il resto è solo un problema di matematica, ma credo di essere stato troppo ingenuo. a proposito, la distanza è in metro. – kaho
ottimo compagno di lavoro !!! grazie ancora – awaistoor