有人可以告诉我如何在苹果地图上绘制GeoJson文件作为叠加层吗? 我需要一个完整的示例,我有多边形或多个多边形的形状?
如果您提供了用于使用MKMapView
渲染它的代码或库,此文件Countries GeoJSON就足够了。
有人可以告诉我如何在苹果地图上绘制GeoJson文件作为叠加层吗? 我需要一个完整的示例,我有多边形或多个多边形的形状?
如果您提供了用于使用MKMapView
渲染它的代码或库,此文件Countries GeoJSON就足够了。
如果有人需要帮助,我已经找到了解决方案。
@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
我为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
HHLViewController
是什么,这将对任何人都没有帮助。 - Julian F. WeinertHHLViewController
是当前的类 - 在代码中仅用于引用 @mohamede1945 添加的构建覆盖层的类方法。 - Mike