Вы объявляете свои переменные глобально - используйте let
, потому что это ограничено рамками (var
является областью видимости функции):
for (let obj of objTasks) {
let title = obj.title;
let author = obj.author;
let anchor = document.createElement("a");
anchor.addEventListener("click", () => { task(title, author) });
}
Это непростой вопрос. С MapKit это невозможно сделать: достаточно легко рисовать линии, когда вы знаете координаты, но MapKit не даст вам доступа к дорогам или другой информации о маршрутах. Я бы сказал, что вам нужно вызвать внешний API, чтобы получить ваши данные.
Я играл с API cloudmade.com. Сервер векторных потоков должен возвращать то, что вам нужно, а затем вы можете нарисовать это на своей карте. Однако расхождения между картами Google и картами OSM , используемыми cloudmade, могут побудить вас полностью использовать облачные карты: у них есть эквивалент MapKit.
P.S .: Другие поставщики картографии - Google, Bing и т. Д. Также могут предоставлять аналогичные каналы данных. Я только недавно смотрел OSM / Cloudmade.
P.P.S .: Все это мелочи для новичков! Удачи!
Согласно 2019, с iOS12 или iOS13, довольно легко потянуть маршрут между двумя точками. Вот, типичный мой код, который тянет маршрут между двумя ПОИ, CLLocation и CLPlacemark, который можно легко адаптировать к контексту.
/// The map view to use to draw the route
lazy var mapView: MKMapView = {
let m = MKMapView()
m.delegate = self
// Attach to the controller view
view.addSubview(m)
// Don't forget to setup its details
return m
}()
/// Having the source:
let from: CLLocation
/// And the destination
let to: CLPlacemark
/// Compute and draw the route between the two POI.
func getAndDrawRoute() {
/// Get the route, driving
let ok = route(from: from, to: to, transportType: .automobile) { routes, error in
if let error = error {
// *** Handle the error here
print("\(type(of: self)).\(#function): *** Error: \(error)")
// blah blah
return
}
// Get the route among the multiple possibilities. Here we take the first one to keep this sniper short
guard let route = routes.first else {
// *** Handle the error: no route exits
print("\(type(of: self)).\(#function): *** Warning: no route exits")
// blah blah
return
}
// Route exists
print("Found the route: \(route)")
// Draw it
self.mapView.draw(route: route)
}
}
/**
Route from a source to the destination locations.
- Parameters:
- from: The source location;
- toPlacemark: The destination `MKPlaceMark`;
- transportType: The transport type;
- completion: The completion closure.
- Returns: `true` if the route can be traced, or false if the user's position is not yet available
*/
public func route(from source: CLLocation, toMKPlacemark destinationPlacemark: MKPlacemark, transportType: MKDirectionsTransportType, completion: @escaping RouteCompletion) {
let sourcePlacemark = MKPlacemark(coordinate: source.coordinate)
let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
let destinationMapItem = MKMapItem(placemark: destinationPlacemark)
let directionRequest = MKDirections.Request()
directionRequest.source = sourceMapItem
directionRequest.destination = destinationMapItem
directionRequest.transportType = transportType
// Calculate the direction
let directions = MKDirections(request: directionRequest)
// And get the routes
directions.calculate { response, error in
guard let response = response else {
if let error = error {
print("\(type(of: self)).\(#function): *** Error: \(error.localizedDescription)")
}
completion(nil, error)
return
}
completion(response.routes, nil)
}
}
/// Adds the route overlay
public func draw(route: MKRoute) {
mapView.addOverlay(route.polyline)
}
/// Renders the overlays, inclusion the route
public func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
// If you want to draw a circle to fit your specifics
if overlay is MKCircle {
let renderer = MKCircleRenderer(overlay: overlay)
renderer.fillColor = UIColor.blue.withAlphaComponent(0.1)
renderer.strokeColor = .blue
renderer.lineWidth = 1
return renderer
}
// If you want to draw a route (polyline) to fit your specifics
if overlay is MKPolyline {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor.init(displayP3Red: 0.15, green: 0.5, blue: 1, alpha: 0.9)
renderer.lineWidth = 10.0
return renderer
}
return MKOverlayRenderer(overlay: overlay)
}
Андиих правильно понял. MapKit не позволит вам этого сделать. К сожалению, Google тоже не позволит вам делать то, что вы хотите.
Когда Apple анонсировала MapKit и все остальное, они также прямо заявили, что любые навигационные приложения будут BYOM: Bring Your Own Maps, поэтому любое навигационное приложение использует свой собственный набор инструментов отображения.
Условия использования Google запрещают вам даже отображать маршруты поверх своих карт:
http://code.google.com/intl/de/apis/maps/iphone/terms.html
Ограничения лицензии :
10.9 использовать Сервис или Контент с любыми продуктами, системами или приложениями для или в связи с:
(a) навигацией в реальном времени или указаниями по маршруту , включая, помимо прочего для пошаговых указаний по маршруту, которые синхронизируются с положением сенсорного устройства пользователя;
(b) любые системы или функции для {{ 1}} автоматический или автономный контроль поведения автомобиля; или
(c) диспетчеризация, управление парком, отслеживание бизнес-активов или аналогичные корпоративные приложения (Google Maps API может использоваться для отслеживания активов {{1} } (например, автомобили, автобусы или другие транспортные средства), если приложение отслеживания доступно для общественности бесплатно. Например, вы может предлагать бесплатную общедоступную реализацию API Карт , которая отображает в режиме реального времени информацию о статусе общественного транспорта или другого транспорта .
К сожалению, это включает в себя то, что вы хотели бы сделать . Надеюсь, что однажды MapKit будет расширен, чтобы позволить такие функции ... хотя маловероятно.
Удачи.
Возможно, вы захотите взглянуть на https://github.com/leviathan/nvpolyline Это решение особенно нацелено на версии iPhone OS до версии 4.0
Хотя это также может быть используется в версии 4.0. Надеюсь, это поможет.