在我的应用程序中,我应该创建一个viewcontroller,其中inside应该是一个map; 在这张地图中,我应该看到一条连接两个引脚的路线。 (因为我有两个针脚) 所以我想知道什么是获得这个结果的最佳解决方案;再次,我应该看到两种类型的路线:一条有车的路线和一条步行路线...... 有没有可以帮助我的框架? (因为mapkit无法解决我的问题) 感谢
答案 0 :(得分:4)
如果您使用UIWebView,您可以使用javascript并基本上免费获取功能,因为正如您所说,MapKit不提供该功能。这很简单,请检查this google maps tutorial for the basics。当然,通过这种方式,您可以获得html和javascript的所有优缺点。
您只需将您的javascript代码写入html(此处为map.html
),您将其放入项目文件夹并启动该html文件。
NSString *html = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"map" ofType:@"html"] encoding:NSUTF8StringEncoding error:&error];
[self.mapView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
您可以像这样从objective-c调用javascript函数。这里,在map.html中有一个名为setMarkerAtPosition(latitude, longitude)
的javascript函数。很直接。
[self.mapView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setMarkerAtPosition(%f,%f)",latlong.latitude, latlong.longitude]];
根据要求进行修改:
你添加一个UIWebView并将它连接到控制器(如果你不知道如何做到这一点,你一定要退一步并做一些基本的教程)(不要忘记再次合成mapView。) ,如果你不知道那是做什么的基本阅读)
#import <UIKit/UIKit.h>
@interface MapViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIWebView *mapView;
@end
然后将以下代码放在viewDidLoad方法中。它创建一个NSString并使用本地html文件的内容对其进行初始化(就像已经发布的那样)。然后,调用UIWebView的loadHTMLString方法。 html字符串基于您的本地html文件map.html
(只需将其命名即可拖放到您的项目中,如果尚未添加它)。
- (void)viewDidLoad
{
[super viewDidLoad];
NSError *error = nil;
// create NSString from local HTML file and add it to the webView
NSString *html = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"map" ofType:@"html"] encoding:NSUTF8StringEncoding error:&error];
[self.mapView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
[self.view sendSubviewToBack:self.mapView];
}
接下来在视图中添加一个按钮(界面构建器,您应该知道如何)并将其连接到方法。在这个方法中,把这个代码(这将在德国给你一条路线)
[self.mapView stringByEvaluatingJavaScriptFromString:@"calculateRoute(50.777682, 6.077163, 50.779347, 6.059429)"];
最后,使用它作为map.html
文件的内容(注意;里面也有一些无用的东西,但你可以稍后解决。我删除了你不需要显示的所有代码路线,但标题中有很多没用的东西):
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<script type="text/javascript" src="http://maps.google.de/maps/api/js?sensor=false®ion=DE"></script>
<script src="http://www.google.com/jsapi"></script>
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<script src="json.js"></script>
<script type="text/javascript">google.load("jquery", "1");</script>
<script type="text/javascript"> google.load("maps", "3", {other_params:"sensor=false"}); </script>
<script type="text/javascript">
// global variables
var currentPosition;
directionsDisplay = new google.maps.DirectionsRenderer();
var directionsService = new google.maps.DirectionsService();
var map;
var infowindow = new google.maps.InfoWindow();
// calculates the current userlocation
function getCurrentLocation(){
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(success, error);
} else {
alert('geolocation not supported');
}
}
// called when the userLocation has been located
function success(position) {
currentPosition = position;
drawMap(position.coords.latitude, position.coords.longitude);
}
// called when the userLocation could not be located
function error(msg) {
alert('error: ' + msg);
}
// calculate and route from-to and show on map
function calculateRoute(fromLat, fromLong, toLat, toLong){
var start = new google.maps.LatLng(fromLat, fromLong);
var end = new google.maps.LatLng(toLat, toLong);
var request = {
origin:start,
destination:end,
travelMode: google.maps.DirectionsTravelMode.WALKING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
}
});
directionsDisplay.setMap(map);
}
// draws the inital map and shows userlocation
function drawMap(latitude, longitude) {
var latlng = new google.maps.LatLng(latitude, longitude);
var myOptions = {
disableDefaultUI: true,
zoom: 15,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
google.maps.event.addListener(map, 'click', function() {if(infowindow){infowindow.close();}});
setMarkerAtPosition(latitude, longitude);
}
</script>
</head>
<body onload="getCurrentLocation()">
<div id="map_canvas" style="width:100%; height:100%">
</body>
</html>
答案 1 :(得分:2)
请参阅本教程以在mkmapview中绘制折线或路线
1&GT; Draw route using mapkit
2&gt;从ios4.0以上版本开始您可以使用MKOverlayPathView See Apple Docs
答案 2 :(得分:1)
您可以向Google地图询问该路线,解析json答案并在地图上显示一条PolyLineView线。这就是它在iOS Maps应用程序上的工作方式。 点击https://developers.google.com/maps/documentation/directions/
上的Google Maps Route API答案 3 :(得分:1)
您可以使用网页视图并打开网址
https://maps.google.com/maps?saddr=START_LOCATION&daddr=DESTINATION_LOCATION
这将打开您想要的网页。
您可以输入一对(纬度,长度)或直接城市名称。
希望这会对你有所帮助