3

MKMapView でオーバーレイを実装する方法について、いくつかの StackOverflow の投稿と Apple のドキュメントを見てきました。私の場合、マップ上に MKPolygon オブジェクトを表示することに特に関心があります。基本的に、プロセスは次のように要約されることがわかりました。

  • MapKit および CoreLocation フレームワークへのリンク
  • MKMapKit オブジェクトへのアウトレットを作成し、View Controller をデリゲートとして宣言します。
  • ポリゴンのポイントを含む CLLocationCoordinate2D 配列を宣言し、クラス メソッド polygonWithCoordinates:count を使用して MKPolygon オブジェクトを作成します。
  • マップの addOverlay: を呼び出し、新しく作成された MKPolygon オブジェクトをパラメーターとして渡します
  • 実装 (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay

後で、マップ上で特定の時間に 20 ~ 30 のポリゴンを表示する必要が生じる可能性があります。しかし、オーバーレイを表示する方法 (ファイルからデータを読み込むのではなく、今はテスト例をハードコーディングしている) を調べているうちに、一部のオーバーレイは表示できるが、他のものは表示できないことがわかりました。Apple の Location Awareness Programming Guide を読んで、コロラド州の上にポリゴンを重ねた例を見つけました。それはうまくいきました。しかし、カンザス州をカバーするポリゴンを作成しようとすると、うまくいきませんでした。自分で作成しようとしたポリゴン (Embry-Riddle Aeronautical University ポリゴンと Kansas ポリゴン) は表示されないようですが、オンラインで入手したものは完全に機能します。Google Earth を使用してポリゴンを作成し、それらを KML ファイルとしてエクスポートして座標を取得しました。

私のViewControllerの実装のためのコードは以下の通りです。この問題を作成するために、意図せずに間違っている可能性があることを見つけようとしているだけです。助けてくれてありがとう。

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()

@end

@implementation ViewController

@synthesize mapView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // Array of coordinates for polygon covering state of Colorado ... DISPLAYS PERFECTLY

    CLLocationCoordinate2D points[4];

    points[0] = CLLocationCoordinate2DMake(41.000512, -109.050116);
    points[1] = CLLocationCoordinate2DMake(36.99892, -109.045267);
    points[2] = CLLocationCoordinate2DMake(36.993076, -102.041981);
    points[3] = CLLocationCoordinate2DMake(41.002371, -102.052066);

    MKPolygon *polygon = [MKPolygon polygonWithCoordinates:points count:4];
    [mapView addOverlay:polygon];
    [polygon release];

    // Array of coordinates for polygon covering state of Kansas ... DOESN'T DISPLAY

    CLLocationCoordinate2D kansasPoints[9];

    kansasPoints[0] = CLLocationCoordinate2DMake(-102.0595440241806, 39.99774930940907);
    kansasPoints[1] = CLLocationCoordinate2DMake(-102.0424467175215, 36.99846609483674);
    kansasPoints[2] = CLLocationCoordinate2DMake(-94.62550551403953, 36.98936020770036);
    kansasPoints[3] = CLLocationCoordinate2DMake(-94.58798745384412, 39.11683771419185);
    kansasPoints[4] = CLLocationCoordinate2DMake(-94.79955391183, 39.21290793052091);
    kansasPoints[5] = CLLocationCoordinate2DMake(-95.13489191971419, 39.51613476830012);
    kansasPoints[6] = CLLocationCoordinate2DMake(-94.86553124171813, 39.78380472206268);
    kansasPoints[7] = CLLocationCoordinate2DMake(-95.02618283417986, 39.89072859904893);
    kansasPoints[8] = CLLocationCoordinate2DMake(-95.31904155494097, 39.99390420513669);

    MKPolygon *kansasPolygon = [MKPolygon polygonWithCoordinates:kansasPoints count:9];
    [mapView addOverlay:kansasPolygon];
    [kansasPolygon release];

    // Array of coordinates for polygon covering part of Daytona Beach, FL campus
    // of Embry-Riddle Aeronautical University... DOESN'T DISPLAY

    CLLocationCoordinate2D erauPoints[7];

    erauPoints[0] = CLLocationCoordinate2DMake(-81.05176, 29.18492);
    erauPoints[1] = CLLocationCoordinate2DMake(-81.04409, 29.18801);
    erauPoints[2] = CLLocationCoordinate2DMake(-81.05166, 29.19293);
    erauPoints[3] = CLLocationCoordinate2DMake(-81.05365, 29.19536);
    erauPoints[4] = CLLocationCoordinate2DMake(-81.05465, 29.19493);
    erauPoints[5] = CLLocationCoordinate2DMake(-81.05376, 29.19323);
    erauPoints[6] = CLLocationCoordinate2DMake(-81.05506, 29.19188);

    MKPolygon *erauPolygon = [MKPolygon polygonWithCoordinates:erauPoints count:7];
    [mapView addOverlay:erauPolygon];
    [erauPolygon release];

    // Array of coordinates taken from http://www.shawngrimes.me/2011/04/adding-polygon-map-overlays/
    // for commuter parking lot at Capitol College in Maryland ... DISPLAYS PERFECTLY

    CLLocationCoordinate2D commuterLotCoords[5]={
        CLLocationCoordinate2DMake(39.048019,-76.850535),
        CLLocationCoordinate2DMake(39.048027,-76.850234),
        CLLocationCoordinate2DMake(39.047407,-76.850181),
        CLLocationCoordinate2DMake(39.047407,-76.8505),
        CLLocationCoordinate2DMake(39.048019,-76.850535)
    };

    MKPolygon *commuterPoly1 = [MKPolygon polygonWithCoordinates:commuterLotCoords count:5];
    [mapView addOverlay:commuterPoly1];
    [commuterPoly1 release];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay {
    if ([overlay isKindOfClass:[MKPolygon class]]) {
        MKPolygonView *polygonView = [[[MKPolygonView alloc] initWithOverlay:overlay] autorelease];
        polygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.3f];
        polygonView.strokeColor = [UIColor redColor];
        polygonView.lineWidth = 1.0f;

        return polygonView;
    }

    return nil;
}

@end
4

1 に答える 1

2

表示されないポリゴンの座標の緯度経度パラメータが逆になっているようです。

たとえば、次のようになります。

kansasPoints[0] = CLLocationCoordinate2DMake(-102.0595440241806, 39.99774930940907);

する必要があります

kansasPoints[0] = CLLocationCoordinate2DMake(39.99774930940907, -102.0595440241806);


また、自動解放されるため、使用して作成しているオブジェクトをrelease呼び出す べきではありません。MKPolygonpolygonWithCoordinates

于 2012-08-23T02:17:23.160 に答える