在苹果地图中绘制GeoJson叠加层

8

有人可以告诉我如何在苹果地图上绘制GeoJson文件作为叠加层吗? 我需要一个完整的示例,我有多边形或多个多边形的形状?

如果您提供了用于使用MKMapView渲染它的代码或库,此文件Countries GeoJSON就足够了。

2个回答

12

如果有人需要帮助,我已经找到了解决方案。

@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

3
如果您不告诉我们HHLViewController是什么,这将对任何人都没有帮助。 - Julian F. Weinert
1
@Julian - HHLViewController 是当前的类 - 在代码中仅用于引用 @mohamede1945 添加的构建覆盖层的类方法。 - Mike
我能给特定的县填充颜色吗?请帮帮我。 - kalpesh

1

我为MultiPolygon制作了一些Swift版本

import Foundation
import MapKit

struct MapGeoGeometry: Codable {
    let type: String
    let coordinates: [[[[Double]]]]
}

struct MapGeoFeature: Codable {
    let type: String
    let geometry: MapGeoGeometry
}

extension MapGeoFeature {

    func toPolygons() -> [MKPolygon] {

        return geometry.coordinates
            .map { data in return data.map { MapGeoFeature.polygon(from: $0) } }
            .reduce([], +)
    }

    static func polygon(from points: [[Double]]) -> MKPolygon {
        let coords = points.map { CLLocationCoordinate2D(latitude: $0[1], longitude: $0[0]) }

        return MKPolygon(coordinates: coords, count: coords.count, interiorPolygons: nil)
    }

}



谢谢!这很有帮助。在获取 [MKPolygon] 后,我必须使用 MKMapViewDelegate 的 mapView(_:rendererFor:) 来设置渲染器的描边颜色,以便在我的 MKMapView 上看到它。 - xta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接