Sto cercando di capire un modo semplice per determinare in Google Maps per iOS se un determinato GMSMarker si trova entro i limiti della mappa visibile. Sembra che ci siano soluzioni per questo nell'API di Javascript, ma a parte forse fare qualche ragionamento complesso basato su this post non sembra esserci un modo.Google Maps per iOS: come si può sapere se un marker si trova entro i limiti dello schermo?
risposta
Recupera i limiti del viewport con GMSVisibleRegion e crea un GMSCoordinateBounds con esso. Chiama il numero containsCoordinate
, passando nella posizione del marcatore. Dovrebbe restituire true se il marker si trova all'interno della finestra e false se non lo è.
Un esempio di codice in base alla risposta utile di Andy:
- (void)snapToMarkerIfItIsOutsideViewport:(GMSMarker *)m{
GMSVisibleRegion region = _mapView.projection.visibleRegion;
GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithRegion:region];
if (![bounds containsCoordinate:m.position]){
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:m.position.latitude
longitude:m.position.longitude
zoom:_mapView.camera.zoom];
[self.mapView animateToCameraPosition: camera];
}
}
Grazie mille! funziona perfettamente! mi fa risparmiare un sacco di tempo – youssman
Spero che questo codice può aiutare a cacciatori di codice.
NSMutableArray *mutArrMarkers; //Have all markers added on Map
.
.
.
.
NSMutableArray *mutArrMarkersInPath = [NSMutableArray array];
[mutArrMarkers enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
GMSMarker *marker = obj;
if(GMSGeometryContainsLocation(currentCoordinates, pathToCheck, YES)){
[mutArrMarkersInPath addObject:marker];
}
}];
Ho scritto sul metodo per trovare GMSMarker in particolare frame. Imposta la cornice del rettangolo (x, y, maxX, maxY). È possibile impostare qualsiasi frame dallo schermo che indica che il marker trova è in quel frame oppure no ..
- (BOOL)isGoogleMapMarkerVisible:(GMSMarker*)marker {
//Marker point
CGPoint markerpoint = [self.mapview.projection pointForCoordinate:marker.position];
//Maximum visible region from x and y axis
float x = 0.0;
float y = o.o;
float maxX = self.mapview.frame.size.width;
float maxY = self.mapview.frame.size.height;
//If marker point is on visible region return true else return false
if (markerpoint.x > x && markerpoint.y > y && markerpoint.x < maxX && markerpoint.y < maxY) {
return YES;
}
else {
return NO;
}
}
La versione 4 rapida della risposta. Restituzione di un booleano se l'indicatore all'interno della regione dello schermo o no
func isMarkerWithinScreen(marker: GMSMarker) -> Bool {
let region = self.mapView.projection.visibleRegion()
let bounds = GMSCoordinateBounds(region: region)
return bounds.contains(marker.position)
}
Che ha funzionato come un fascino, grazie! –
Farò un esempio di codice in una risposta ... –