9

iOS 4.0 で MKMapView に MKPolygon をプロットしようとしています。緯度/経度のプロパティを含むカスタム オブジェクトを含む NSArray があります。以下にコードサンプルがあります。

- (void)viewDidLoad {
    [super viewDidLoad];
    dataController = [[DataController alloc] initWithMockData];
    coordinateData = [dataController getCordData];

    CLLocationCoordinate2D *coords = NULL;
    NSUInteger coordsLen = 0;

    /* How do we actually define an array of CLLocationCoordinate2d? */

    MKPolygon *polygon = [MKPolygon polygonWithCoordinates:coords count:coordsLen];
    [mapView addOverlay: polygon];

}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolygonView *polygonView = [[MKPolygonView alloc] initWithPolygon: routePolygon]; 
    NSLog(@"Attempting to add Overlay View");   
    return polygonView;
}

私がそれを理解する方法は次のとおりです。

  1. MKPolygon を作成する必要があります
  2. MapView にオーバーレイを追加する
  3. これにより、MKPolygonView の作成がトリガーされます。

私の質問は、ポリゴンが解釈してレンダリングできるように、NSArray (coordinateData) に含まれるカスタム オブジェクトを取得し、これらのオブジェクトを CLLocationCoordinate2d の配列に変換する方法です。CLLocationCoordinate2d がどのように配列であるかわかりませんか? 誰かがこれについて明確にすることができますか?

4

4 に答える 4

17

pornWithCoordinatesメソッドには、CLLocationCoordinate2D構造体のC配列が必要です。mallocアレイにメモリを割り当てる(およびfreeメモリを解放する)ために使用できます。NSArrayをループして、構造体配列の各要素に設定します。

例えば:

coordsLen = [coordinateData count];
CLLocationCoordinate2D *coords = malloc(sizeof(CLLocationCoordinate2D) * coordsLen);
for (int i=0; i < coordsLen; i++)
{
    YourCustomObj *coordObj = (YourCustomObj *)[coordinateData objectAtIndex:i];
    coords[i] = CLLocationCoordinate2DMake(coordObj.latitude, coordObj.longitude);
}
MKPolygon *polygon = [MKPolygon polygonWithCoordinates:coords count:coordsLen];
free(coords);
[mapView addOverlay:polygon];

viewForOverlayメソッドは次のようになります。

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolygonView *polygonView = [[[MKPolygonView alloc] initWithPolygon:overlay] autorelease]; 
    polygonView.lineWidth = 1.0;
    polygonView.strokeColor = [UIColor redColor];
    polygonView.fillColor = [UIColor greenColor];
    return polygonView;
}
于 2011-03-29T15:07:08.357 に答える
2

iOS 7.0 以降では、MKPolygonRenderer代わりにMKPolygonView,

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
   MKPolygonRenderer * polygonView = [[MKPolygonRenderer alloc] initWithPolygon:overlay];
   polygonView.fillColor   = [UIColor greenColor];
   polygonView.strokeColor = [UIColor redColor] ;
   polygonView.lineWidth   = 1.0;
   return polygonView;
}
于 2014-11-12T11:40:46.257 に答える
1

Swift 4 のコード

json の座標の場合:

{
"coordinates": [
    [-73.947676,40.660297],
    [-73.947264,40.656437],
    [-73.947159,40.655594],
    [-73.946479,40.6491],
    [-73.947467,40.649039]
}

座標を読み取ります。

let coordinates = json["coordinates"] as! [[Double]] 

ポイント配列を作成します。

var locationCoordinates = [CLLocationCoordinate2D]()    
for coordinate in coordinates{
   locationCoordinates.append(CLLocationCoordinate2DMake(coordinate.last!, coordinate.first!))
}

ポリゴンを作成してマップに追加します。

map.addOverlay(MKPolyline(coordinates: locationCoordinates, 
                                count: locationCoordinates.count))

あなたのVCが直面していることを確認してくださいMKMapViewDelegate

class ViewController: UIViewController, MKMapViewDelegate { ... }

そして、このメソッドを追加します:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKPolygon {
        let polygonView = MKPolygonRenderer(overlay: overlay)
        polygonView.fillColor = .black
        polygonView.strokeColor = .red
        polygonView.lineWidth = 2.0

        return polygonView

    return MKOverlayRenderer()
}
于 2019-06-18T10:46:54.497 に答える