J'utilise UIMapView pour afficher les emplacements sur l'iPhone. Je veux faire un itinéraire de l'emplacement actuel au lieu d'intérêt, je ne pense pas que ce soit possible en utilisant MapKit (mais si c'est le cas, veuillez en informer), donc j'ouvrirai l'application Google Maps ou safari pour l'afficher.
Puis-je le faire en spécifiant les coordonnées de (emplacement actuel) aux coordonnées (l'emplacement d'intérêt) J'ai ces longitudes et latitudes. Ou dois-je utiliser des adresses civiles?
Si je dois utiliser des adresses, puis-je les obtenir à partir de la latitude et de la longitude.
C'est possible.Utilisez MKMapView Obtenez les coordonnées de l'emplacement où vous avez tapé sur le téléphone et en utilisant les deux coordonnées, demandez le fichier KML à partir de le service Web Google, analysez le fichier KML (exemple de visionneuse KML d'application sur le site du développeur) et affichez les itinéraires ....
Je vous remercie
Ouais, ce n'est pas possible en utilisant MapKit. Vous pouvez essayer de former une demande d'URL Google maps contenant à la fois votre position actuelle et votre destination qui s'ouvrira dans l'application Google maps avec les directions.
Voici un exemple d'URL:
http://maps.google.com/?saddr=34.052222,-118.243611&daddr=37.322778,-122.031944
Voici comment vous pouvez implémenter cela dans votre code:
CLLocationCoordinate2D start = { 34.052222, -118.243611 };
CLLocationCoordinate2D destination = { 37.322778, -122.031944 };
NSString *googleMapsURLString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%1.6f,%1.6f&daddr=%1.6f,%1.6f",
start.latitude, start.longitude, destination.latitude, destination.longitude];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapsURLString]];
Utilisez le code ci-dessous pour Google et Apple cartes dans Swift 3 -
if UIApplication.shared.canOpenURL(URL(string: "comgooglemaps://")!)
{
let urlString = "http://maps.google.com/?daddr=\(destinationLocation.latitude),\(destinationLocation.longitude)&directionsmode=driving"
// use bellow line for specific source location
//let urlString = "http://maps.google.com/?saddr=\(sourceLocation.latitude),\(sourceLocation.longitude)&daddr=\(destinationLocation.latitude),\(destinationLocation.longitude)&directionsmode=driving"
UIApplication.shared.openURL(URL(string: urlString)!)
}
else
{
//let urlString = "http://maps.Apple.com/maps?saddr=\(sourceLocation.latitude),\(sourceLocation.longitude)&daddr=\(destinationLocation.latitude),\(destinationLocation.longitude)&dirflg=d"
let urlString = "http://maps.Apple.com/maps?daddr=\(destinationLocation.latitude),\(destinationLocation.longitude)&dirflg=d"
UIApplication.shared.openURL(URL(string: urlString)!)
}
La première vérification que google map est installée sur l'appareil ou non
if ([[UIApplication sharedApplication] canOpenURL:
[NSURL URLWithString:@"comgooglemaps://"]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"comgooglemaps://?saddr=23.0321,72.5252&daddr=22.9783,72.6002&zoom=14&views=traffic"]];
} else {
NSLog(@"Can't use comgooglemaps://");
}
Ajouter un schéma de requête dans .plist
<key>LSApplicationQueriesSchemes</key>
<array>
<string>comgooglemaps</string>
</array>
Une solution solide consiste à créer un contrôleur de vue avec une NIB qui comprend une UIWebView, puis à transmettre l'URL qui utilise les services de carte/direction de Google. De cette façon, vous gardez l'utilisateur dans l'application. Cette approche n'est pas suffisante pour afficher une page Web, car le kit Apple ne prend pas en charge le zoom. Mais avec OS4, au moins l'utilisateur peut double-cliquer sur le bouton d'accueil et revenir à la app.
Il est possible d'afficher l'itinéraire dans MapKit: utilisez simplement MKPolyline
J'obtiens une chaîne de polyligne de googleMapsApi. Je l'analyser sur le serveur avec php, et retourner la chaîne polilyne finale à mon application.
NSMutableArray *points = [myApp decodePolyline:[route objectForKey:@"polyline"]];
if([points count] == 0)
{
return;
}
// while we create the route points, we will also be calculating the bounding box of our route
// so we can easily zoom in on it.
MKMapPoint northEastPoint;
MKMapPoint southWestPoint;
// create a c array of points.
MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * [points count]);
for(int idx = 0; idx < points.count; idx++)
{
// break the string down even further to latitude and longitude fields.
NSString* currentPointString = [points objectAtIndex:idx];
NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
CLLocationDegrees latitude = [[latLonArr objectAtIndex:0] doubleValue];
CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];
// create our coordinate and add it to the correct spot in the array
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
MKMapPoint point = MKMapPointForCoordinate(coordinate);
if (idx == 0) {
northEastPoint = point;
southWestPoint = point;
}
else
{
if (point.x > northEastPoint.x)
northEastPoint.x = point.x;
if(point.y > northEastPoint.y)
northEastPoint.y = point.y;
if (point.x < southWestPoint.x)
southWestPoint.x = point.x;
if (point.y < southWestPoint.y)
southWestPoint.y = point.y;
}
pointArr[idx] = point;
_currentLenght++;
}
// create the polyline based on the array of points.
self.routeLine = [MKPolyline polylineWithPoints:pointArr count:points.count];
_routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y,
northEastPoint.x - southWestPoint.x,
northEastPoint.y - southWestPoint.y);
// clear the memory allocated earlier for the points
free(pointArr);
if (nil != self.routeLine) {
[self.mapView addOverlay:self.routeLine];
}
[self.mapView setVisibleMapRect:_routeRect];
Et montrant:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
MKOverlayView* overlayView = nil;
if(overlay == self.routeLine)
{
self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:self.routeLine] autorelease];
self.routeLineView.fillColor = [UIColor blueColor];
self.routeLineView.strokeColor = TICNavigatorColor;
self.routeLineView.lineWidth = 7;
self.routeLineView.lineJoin = kCGLineJoinRound;
self.routeLineView.lineCap = kCGLineCapRound;
overlayView = self.routeLineView;
}
return overlayView;
}
Essaie.