Swift & MapKit でポリラインとポリゴンに注釈を追加するにはどうすればよいですか? ポイントで簡単です。
1 に答える
S.、
ここで何を尋ねているのかわかりませんが、ポリラインのどこかに注釈を表示したいと思っていると思います。
最初に、ポリラインを取得する方法の紹介: マップ上にポリラインを描画する CLLocation オブジェクトの配列があると仮定します。この位置オブジェクトの配列を myLocations と呼び、タイプは [CLLocation] です。アプリのどこかで、ポリラインを作成するメソッドを呼び出します。このメソッドを createOverlayObject(locations: [CLLocation]) -> MKPolyline と呼びます。
呼び出しは次のようになります。
let overlayPolyline = createOverlayObject(myLocations)
次に呼び出したメソッドは次のようになります。
func createOverlayObject(locations: [CLLocation]) -> MKPolyline {
//This method creates the polyline overlay that you want to draw.
var mapCoordinates = [CLLocationCoordinate2D]()
for overlayLocation in locations {
mapCoordinates.append(overlayLocation.coordinate)
}
let polyline = MKPolyline(coordinates: &mapCoordinates[0], count: mapCoordinates.count)
return polyline
}
これは最初の部分でした。線をレンダリングするために mapView(_: rendererForOverlay overlay:) を実装することを忘れないでください。この部分は次のようになります。
func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
//This function creatss the renderer for the polyline overlay. This makes the polyline actually display on screen.
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = mapLineColor //The color you want your polyline to be.
renderer.lineWidth = self.lineWidth
return renderer
}
2 番目の部分は、マップ上のどこかで注釈を取得します。注釈を付けたい場所の座標がわかっている場合、これは実際には簡単です。myNiceMapView というマップ ビューを定義していると仮定すると、注釈の作成と表示は簡単です。
func createAnnotation(myCoordinate: CLLocationCoordinate2D) {
let myAnnotation = MKPointAnnotation()
myAnnotation.title = "My nice title"
startAnnotation.coordinate = myCoordinate
self.myNiceMapView.addAnnotations([myAnnotation])
}
mapView(_: MKMapView, viewForAnnotation 注釈:) -> MKAnnotationView を実装することを忘れないでください? メソッドは次のようになります。
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
//This is the mapview delegate method that adjusts the annotation views.
if annotation.isKindOfClass(MKUserLocation) {
//We don't do anything with the user location, so ignore an annotation that has to do with the user location.
return nil
}
let identifier = "customPin"
let trackAnnotation = MKAnnotationView.init(annotation: annotation, reuseIdentifier: identifier)
trackAnnotation.canShowCallout = true
if annotation.title! == "Some specific title" { //Display a different image
trackAnnotation.image = UIImage(named: "StartAnnotation")
let offsetHeight = (trackAnnotation.image?.size.height)! / 2.0
trackAnnotation.centerOffset = CGPointMake(0, -offsetHeight)
} else { //Display a standard image.
trackAnnotation.image = UIImage(named: "StopAnnotation")
let offsetHeight = (trackAnnotation.image?.size.height)! / 2.0
trackAnnotation.centerOffset = CGPointMake(0, -offsetHeight)
}
return trackAnnotation
}
ここでの課題は、注釈を配置する正しい座標を見つけることです。注釈を配置する場所を参照する CLLocationCoordinate2D があることよりも優れたものは見つかりません。次に、for-in ループを使用して、注釈を配置する場所を見つけます。次のようになります。
for location in myLocations {
if (location.latitude == myReferenceCoordinate.latitude) && (location.longitude == myReferenceCoordinate.longitude) {
self.createAnnotation(location: CLLOcationCoordinate2D)
}
}
これがあなたの質問に答えることを願っています。