ios - 在 Apple Maps 中绘制 GeoJson 作为叠加层

标签 ios mkmapview mapkit geojson

有人能告诉我如何在苹果 map 中绘制 GeoJson 文件作为叠加层吗?我想要一个完整的示例,我的形状是多边形还是多边形?

此文件 Countries GeoJSON如果您向我提供代码或库以使用 MKMapView

渲染它,对我来说就足够了

最佳答案

我找到了解决方案,以防有人也需要帮助。

@interface HHLViewController

+ (NSArray *)countriesOverlays;

@end

@implementation HHLViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *overlays = [HHLViewController countriesOverlays];
    [self.stateMapView addOverlays:overlays];
}

+ (NSArray *)countriesOverlays {
    NSString *fileName = [[NSBundle mainBundle] pathForResource:@"countries" ofType:@"json"];
    NSData *overlayData = [NSData dataWithContentsOfFile:fileName];

    NSArray *countries = [[NSJSONSerialization JSONObjectWithData:overlayData options:NSJSONReadingAllowFragments error:nil] objectForKey:@"features"];

    NSMutableArray *overlays = [NSMutableArray array];

    for (NSDictionary *country in countries) {

        NSDictionary *geometry = country[@"geometry"];
        if ([geometry[@"type"] isEqualToString:@"Polygon"]) {
            MKPolygon *polygon = [HHLViewController overlaysFromPolygons:geometry[@"coordinates"] id:country[@"properties"][@"name"]];
            if (polygon) {
                [overlays addObject:polygon];
            }


        } else if ([geometry[@"type"] isEqualToString:@"MultiPolygon"]){
            for (NSArray *polygonData in geometry[@"coordinates"]) {
                MKPolygon *polygon = [HHLViewController overlaysFromPolygons:polygonData id:country[@"properties"][@"name"]];
                if (polygon) {
                    [overlays addObject:polygon];
                }
            }
        } else {
            NSLog(@"Unsupported type: %@", geometry[@"type"]);
        }
    }

    return overlays;

}

+ (MKPolygon *)overlaysFromPolygons:(NSArray *)polygons id:(NSString *)title
{
    NSMutableArray *interiorPolygons = [NSMutableArray arrayWithCapacity:[polygons count] - 1];
    for (int i = 1; i < [polygons count]; i++) {
        [interiorPolygons addObject:[HHLViewController polygonFromPoints:polygons[i] interiorPolygons:nil]];
    }

    MKPolygon *overlayPolygon = [HHLViewController polygonFromPoints:polygons[0] interiorPolygons:interiorPolygons];
    overlayPolygon.title = title;


    return overlayPolygon;
}

+ (MKPolygon *)polygonFromPoints:(NSArray *)points interiorPolygons:(NSArray *)polygons
{
    NSInteger numberOfCoordinates = [points count];
    CLLocationCoordinate2D *polygonPoints = malloc(numberOfCoordinates * sizeof(CLLocationCoordinate2D));

    NSInteger index = 0;
    for (NSArray *pointArray in points) {
        polygonPoints[index] = CLLocationCoordinate2DMake([pointArray[1] floatValue], [pointArray[0] floatValue]);
        index++;
    }

    MKPolygon *polygon;

    if (polygons) {
        polygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates interiorPolygons:polygons];
    } else {
        polygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates];
    }
    free(polygonPoints);

    return polygon;
}
@end

关于ios - 在 Apple Maps 中绘制 GeoJson 作为叠加层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823772/

相关文章:

iOS 10/Xcode 8 TestFairy 不记录

iOS swift : MKPointAnnotation not always showing title

ios - 确定 MKMapView 是否被拖动/移动

ios - 以编程方式刷新 mapview 用户位置

来自 Web 应用程序的 iOS 外部附件框架

ios - 使用 Alamofire 将嵌套数组从 JSON 数据显示到 TableView

ios - Xcode 9.2 的正确应用程序图标 (appicon) 命名约定是什么?

customtableview单元格中的iOS swift mapview

arrays - 从 plist 加载时基于 MapKit 的应用程序崩溃

ios - iOS 6 MapKit 是否适用于早期版本的 iOS?