5

2 つの座標セットがあり、マップ ビューにポリラインを描画しようとしています。1 セットの座標でポリラインを描画できますが、2 つのポリラインを描画できませんでした。

以下はコードです...

func drawRouteOnMap()
{
    var centerCoordinate : CLLocationCoordinate2D = CLLocationCoordinate2DMake(icRouteLat[0], icRouteLong[0])
    let span = MKCoordinateSpanMake(0.001, 0.001)
    var centerPosition = MKCoordinateRegionMake(centerCoordinate, span)
    mapView.setRegion(centerPosition,animated:true)
    self.mapView.mapType = MKMapType.Hybrid

    routePointer = "one";
    // first route line
    //----------able to draw polyline with this set of coordinates
    for i in 0..<routeLat.count-1
    {
        var fromCoordinate :CLLocation = CLLocation(latitude: routeLat[i], longitude: routeLong[i])
        var toCoordinate   :CLLocation = CLLocation(latitude: routeLat[i+1], longitude: routeLong[i+1])
        var locations = [fromCoordinate, toCoordinate];
        var coordinates = locations.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate});
        var polyLine = MKPolyline(coordinates: &coordinates, count: locations.count);
        mapView.addOverlay(polyLine);
    }

    routePointer = "second";
    // IC route line
    //------Polyline for this set of coordinates doesn't appear on map view
    for j in 0..<icRouteLat.count-1
    {
        var fromCoordinateIC :CLLocation = CLLocation(latitude: icRouteLat[j], longitude: icRouteLat[j])
        var toCoordinateIC :CLLocation = CLLocation(latitude: icRouteLong[j+1], longitude: icRouteLong[j+1])
        var locationsIC = [fromCoordinateIC, toCoordinateIC];
        var coordinatesIC = locationsIC.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate});
        var polyLineIC = MKPolyline(coordinates: &coordinatesIC, count: locationsIC.count);
        mapView.addOverlay(polyLineIC);
    }
}

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    let route: MKPolyline = overlay as MKPolyline
    let routeRenderer = MKPolylineRenderer(polyline:route)
    routeRenderer.lineWidth = 3.0
    if routePointer == "one"
    {
        routeRenderer.strokeColor = UIColor(red: 240.0/255.0, green: 68.0/255.0, blue: 0.0/255.0, alpha: 1);
    }
    else if routePointer == "second"
    {
        routeRenderer.strokeColor = UIColor(red: 45.0/255.0, green: 200.0/255.0, blue: 0.0/255.0, alpha: 1);
    }
    return routeRenderer
}

配列routeLat[], routeLong[]icRouteLat[] and icRouteLong[]は 2 つの座標セットです。

ここで見逃しているものはありますか?または、これは実装する正しい方法ですか?

編集

提案に基づいてコードを更新しました...

func drawRouteOnMap()
{
    var centerCoordinate : CLLocationCoordinate2D = CLLocationCoordinate2DMake(icRouteLat[0], icRouteLong[0])
    let span = MKCoordinateSpanMake(0.001, 0.001)
    var centerPosition = MKCoordinateRegionMake(centerCoordinate, span)
    mapView.setRegion(centerPosition,animated:true)
    self.mapView.mapType = MKMapType.Hybrid
    var polyLine: MKPolyline!
    var polyLineIC: MKPolyline!

    // first route line
    for i in 0..<routeLat.count-1
    {
        var fromCoordinate :CLLocation = CLLocation(latitude: routeLat[i], longitude: routeLong[i])
        var toCoordinate   :CLLocation = CLLocation(latitude: routeLat[i+1], longitude: routeLong[i+1])
        var locations = [fromCoordinate, toCoordinate];
        var coordinates = locations.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate});
        polyLine = MKPolyline(coordinates: &coordinates, count: locations.count);
        polyLine.title = "one";
        mapView.addOverlay(polyLine);
    }

    // IC route line
    for j in 0..<icRouteLat.count-1
    {
        var fromCoordinateIC :CLLocation = CLLocation(latitude: icRouteLat[j], longitude: icRouteLong[j])
        var toCoordinateIC :CLLocation = CLLocation(latitude: icRouteLat[j+1], longitude: icRouteLong[j+1])
        var locationsIC = [fromCoordinateIC, toCoordinateIC];
        var coordinatesIC = locationsIC.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate});
        polyLineIC = MKPolyline(coordinates: &coordinatesIC, count: locationsIC.count);
        polyLineIC.title = "ic";
        mapView.addOverlay(polyLineIC);
    }
}

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if overlay is MKPolyline
    {
        let route: MKPolyline = overlay as MKPolyline
        let routeRenderer = MKPolylineRenderer(polyline:route)
        routeRenderer.lineWidth = 3.0
        if overlay.title == "one"
        {
            routeRenderer.strokeColor = UIColor(red: 240.0/255.0, green: 68.0/255.0, blue: 0.0/255.0, alpha: 1);
        }
        else if overlay.title == "ic"
        {
            routeRenderer.strokeColor = UIColor(red: 45.0/255.0, green: 200.0/255.0, blue: 0.0/255.0, alpha: 1);
        }
        return routeRenderer
    }

    return nil
}

最終編集

更新されたコード:

func drawRouteOnMap()
{
    var centerCoordinate : CLLocationCoordinate2D = icRoute[0];
    let span = MKCoordinateSpanMake(0.001, 0.001)
    var centerPosition = MKCoordinateRegionMake(centerCoordinate, span)
    mapView.setRegion(centerPosition,animated:true)
    self.mapView.mapType = MKMapType.Hybrid

    // first route line
    polyLine = MKPolyline(coordinates: &firstRoute, count: firstRoute.count);
    polyLine.title = "one";
    mapView.addOverlay(polyLine);

    // IC route line
    polyLine = MKPolyline(coordinates: &icRoute, count: icRoute.count);
    polyLine.title = "ic";
    mapView.addOverlay(polyLine);

}

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if overlay is MKPolyline
    {
        let route: MKPolyline = overlay as MKPolyline
        let routeRenderer = MKPolylineRenderer(polyline:route)
        routeRenderer.lineWidth = 3.0
        if overlay.title == "one"
        {
            routeRenderer.strokeColor = UIColor(red: 240.0/255.0, green: 68.0/255.0, blue: 0.0/255.0, alpha: 1);
        }
        else if overlay.title == "ic"
        {
            routeRenderer.strokeColor = UIColor(red: 45.0/255.0, green: 200.0/255.0, blue: 0.0/255.0, alpha: 1);
        }
        return routeRenderer
    }

    return nil
}
4

1 に答える 1

4

主な問題は 2 番目のforループにあります。

var fromCoordinateIC :CLLocation = 
    CLLocation(latitude: icRouteLat[j], 
              longitude: icRouteLat[j])  //<-- should be icRouteLong

var toCoordinateIC :CLLocation = 
    CLLocation(latitude: icRouteLong[j+1], //<-- should be icRouteLat
              longitude: icRouteLong[j+1])

2 番目の線は、間違った座標を取得しているため、表示されません (または予期した場所に表示されません)。


ただし、指摘したい追加事項がいくつかあります(主な問題の原因または関連はありません)。

  1. デリゲート メソッドではrendererForOverlay、コードは外部変数を使用しroutePointerて線の色を設定しています。これはお勧めできません。 デリゲート メソッドがいつ、どのくらいの頻度で呼び出されるかを想定してはなりません。を実行した直後にデリゲート メソッドが呼び出されるという保証はありませんaddOverlay。同じオーバーレイに対してデリゲート メソッドを複数回呼び出すこともできます。

    このため、受信overlayオブジェクトに直接関連付けられたデータを使用してレンダラーのプロパティを設定する必要があります。現在の例では、各ポリラインのtitleプロパティを「one」または「second」に設定し、routePointer変数を削除することをお勧めします。

  2. rendererForOverlayデリゲート メソッドでは、型のように扱う前に型であるかどうかを最初に確認することをお勧めしますoverlay。やMKPolylineなど、他のタイプのオーバーレイを後で追加することができます。MKCircleMKPolygon

  3. 現在、コードは各ルートのライン セグメントごとMKPolylineに個別に作成しています。したがって、ルート「1」に 10 個のライン セグメントがあり、ルート「2 番目」に 15 個のライン セグメントがある場合、コードは現在 25 個のオーバーレイを追加しています。これは必要ありません。は複数の線分を描くことができます。ルートのすべての座標を配列に追加し、ループので. そうすれば、オーバーレイを 2 つだけ追加できます。MKPolylineMKPolyline

    ルートごとに複数のオーバーレイを作成する代わりに、ルートごとに 1 つのオーバーレイを作成する例 (ルートの線分ごとに 1 つ):

    //First add all the coordinates to an array...
    var coordinates: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]()
    for i in 0 ..< routeLat.count
    {
        var coordinate  = CLLocationCoordinate2DMake(routeLat[i], routeLong[i])
        coordinates.append(coordinate)
    }
    //Then create a single overlay with ALL the coordinates in the route...
    polyLine = MKPolyline(coordinates: &coordinates, count: coordinates.count);
    polyLine.title = "one";
    mapView.addOverlay(polyLine);
    
  4. 各配列が double のリストである場合、緯度と経度に個別の配列を定義する必要はありません。CLLocationCoordinate2Dルートごとに 1 つの座標配列 (タイプ ) を保持すると、はるかに効率的になり、コードが大幅に簡素化されます。MKPolylineその後、ループなしでこの配列からanを作成できます。

    CLLocationCoordinate2Dルートごとに の1 つの配列を使用する例:

    var routeOneCoordinates = [CLLocationCoordinate2DMake(30.0, -87.0),
                                CLLocationCoordinate2DMake(32.0, -84.0),
                                CLLocationCoordinate2DMake(31.5, -83.5),
                                CLLocationCoordinate2DMake(31.0, -83.0),
                                CLLocationCoordinate2DMake(33.5, -82.0)]
    polyLine = MKPolyline(coordinates: &routeOneCoordinates, count: routeOneCoordinates.count);
    polyLine.title = "one";
    mapView.addOverlay(polyLine);
    
于 2014-11-25T15:52:38.283 に答える