[ios, macos] More MGLGeoJSONSource options

MGLGeoJSONSource can now be initialized with GeoJSON data. Replaced the data property with a geoJSONData property and added features and URL properties alongside it. Each property may be set or unset based on how the object was initialized.

Fixes #5965, fixes #5966.
This commit is contained in:
Minh Nguyễn
2016-08-15 23:39:45 -07:00
committed by Minh Nguyễn
parent 61df0b1bfa
commit 7b1f9011db
2 changed files with 70 additions and 18 deletions

View File

@@ -1,9 +1,60 @@
#import "MGLSource.h"
#import "MGLTypes.h"
NS_ASSUME_NONNULL_BEGIN
@protocol MGLFeature;
@interface MGLGeoJSONSource : MGLSource
@property (nonatomic, readonly, copy) NSString *data;
/**
The contents of the source.
If the receiver was initialized using `-initWithSourceIdentifier:URL:`, this
property is set to `nil`. This property is unavailable until the receiver is
passed into `-[MGLStyle addSource]`.
*/
@property (nonatomic, readonly, nullable) NS_ARRAY_OF(id <MGLFeature>) *features;
/**
A GeoJSON representation of the contents of the source.
Use the `features` property instead to get an object representation of the
contents. Alternatively, use NSJSONSerialization with the value of this
property to transform it into Foundation types.
If the receiver was initialized using `-initWithSourceIdentifier:URL:`, this
property is set to `nil`. This property is unavailable until the receiver is
passed into `-[MGLStyle addSource]`.
*/
@property (nonatomic, readonly, nullable, copy) NSData *geoJSONData;
/**
The URL to the GeoJSON document that specifies the contents of the source.
If the receiver was initialized using `-initWithSourceIdentifier:geoJSONData:`,
this property is set to `nil`.
*/
@property (nonatomic, readonly, nullable) NSURL *URL;
/**
Initializes a source with the given identifier and GeoJSON data.
@param sourceIdentifier A string that uniquely identifies the source.
@param geoJSONData An NSData object representing GeoJSON source code.
*/
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data NS_DESIGNATED_INITIALIZER;
/**
Initializes a source with the given identifier and URL.
@param sourceIdentifier A string that uniquely identifies the source.
@param URL An HTTP(S) URL, absolute file URL, or local file URL relative to the
current application’s resource bundle.
*/
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url NS_DESIGNATED_INITIALIZER;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,26 +1,24 @@
#import "MGLGeoJSONSource.h"
#import "MGLSource_Private.h"
#import "MGLFeature_Private.h"
#import "NSURL+MGLAdditions.h"
#include <mbgl/style/sources/geojson_source.hpp>
@interface MGLGeoJSONSource ()
@property (nonatomic, copy) NSURL *URL;
@end
@implementation MGLGeoJSONSource
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url
{
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data {
if (self = [super initWithSourceIdentifier:sourceIdentifier]) {
_geoJSONData = data;
}
return self;
}
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url {
if (self = [super initWithSourceIdentifier:sourceIdentifier]) {
_URL = url;
if (url.isFileURL) {
_data = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL];
} else {
_data = url.absoluteString;
}
}
return self;
}
@@ -28,11 +26,14 @@
- (std::unique_ptr<mbgl::style::Source>)mbgl_source
{
auto source = std::make_unique<mbgl::style::GeoJSONSource>(self.sourceIdentifier.UTF8String);
if (_URL.isFileURL) {
const auto geojson = mapbox::geojson::parse(self.data.UTF8String).get<mapbox::geojson::feature_collection>();
source->setGeoJSON(geojson);
if (self.URL) {
NSURL *url = self.URL.mgl_URLByStandardizingScheme;
source->setURL(url.absoluteString.UTF8String);
} else {
source->setURL(self.data.UTF8String);
NSString *string = [[NSString alloc] initWithData:self.geoJSONData encoding:NSUTF8StringEncoding];
const auto geojson = mapbox::geojson::parse(string.UTF8String).get<mapbox::geojson::feature_collection>();
source->setGeoJSON(geojson);
_features = MGLFeaturesFromMBGLFeatures(geojson);
}
return std::move(source);
}