[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:
committed by
Minh Nguyễn
parent
61df0b1bfa
commit
7b1f9011db
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user