You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
577 lines
18 KiB
Objective-C
577 lines
18 KiB
Objective-C
//
|
|
// BMFOverlayHandles.m
|
|
// flutter_bmfmap
|
|
//
|
|
// Created by zhangbaojin on 2020/2/12.
|
|
//
|
|
|
|
#import "BMFOverlayHandles.h"
|
|
#import "BMFMapView.h"
|
|
#import "BMFOverlayMethodConst.h"
|
|
#import "BMFFileManager.h"
|
|
#import "UIColor+BMFString.h"
|
|
#import "BMFMapModels.h"
|
|
#import "BMFPolyline.h"
|
|
#import "BMFArcline.h"
|
|
#import "BMFPolygon.h"
|
|
#import "BMFCircle.h"
|
|
#import "BMFTileModel.h"
|
|
#import "BMFURLTileLayer.h"
|
|
#import "BMFAsyncTileLayer.h"
|
|
#import "BMFSyncTileLayer.h"
|
|
#import "BMFGroundOverlay.h"
|
|
|
|
@interface BMFOverlayHandles ()
|
|
{
|
|
NSDictionary *_handles;
|
|
}
|
|
@end
|
|
|
|
@implementation BMFOverlayHandles
|
|
|
|
static BMFOverlayHandles *_instance = nil;
|
|
+ (instancetype)defalutCenter{
|
|
if (!_instance) {
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
_instance = [[BMFOverlayHandles alloc] init];
|
|
});
|
|
}
|
|
return _instance;
|
|
}
|
|
|
|
- (NSDictionary<NSString *, NSString *> *)overlayHandles{
|
|
if (!_handles) {
|
|
_handles = @{
|
|
kBMFMapAddPolylineMethod: NSStringFromClass([BMFAddPolyline class]),
|
|
kBMFMapAddArcineMethod: NSStringFromClass([BMFAddArcline class]),
|
|
kBMFMapAddPolygonMethod: NSStringFromClass([BMFAddPolygon class]),
|
|
kBMFMapAddCircleMethod: NSStringFromClass([BMFAddCircle class]),
|
|
kBMFMapAddTileMethod: NSStringFromClass([BMFAddTile class]),
|
|
kBMFMapAddGroundMethod: NSStringFromClass([BMFAddGround class]),
|
|
kBMFMapRemoveOverlayMethod: NSStringFromClass([BMFRemoveOverlay class]),
|
|
kBMFMapRemoveTileMethod: NSStringFromClass([BMFRemoveTileOverlay class]),
|
|
kBMFMapUpdatePolylineMemberMethod: NSStringFromClass([BMFUpdatePolyline class])
|
|
};
|
|
}
|
|
return _handles;
|
|
}
|
|
@end
|
|
|
|
|
|
#pragma mark - overlay
|
|
|
|
@implementation BMFAddPolyline
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
BMKPolyline *polyline = [BMKPolyline polylineWith:call.arguments];
|
|
if (polyline) {
|
|
[_mapView addOverlay:polyline];
|
|
result(@YES);
|
|
} else {
|
|
result(@NO);
|
|
}
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation BMFAddArcline
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
BMKArcline *arcline = [BMKArcline arclineWith:call.arguments];
|
|
if (arcline) {
|
|
[_mapView addOverlay:arcline];
|
|
result(@YES);
|
|
} else {
|
|
result(@NO);
|
|
}
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@implementation BMFAddPolygon
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
BMKPolygon *polygon = [BMKPolygon polygonWith:call.arguments];
|
|
if (polygon) {
|
|
[_mapView addOverlay:polygon];
|
|
result(@YES);
|
|
} else {
|
|
result(@NO);
|
|
}
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@implementation BMFAddCircle
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
BMKCircle *circle = [BMKCircle circlelineWith:call.arguments];
|
|
if (circle) {
|
|
[_mapView addOverlay:circle];
|
|
result(@YES);
|
|
return;
|
|
} else {
|
|
result(@NO);
|
|
}
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation BMFAddTile
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
if (!call.arguments) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
BMFTileModel *model = [BMFTileModel bmf_modelWith:call.arguments];
|
|
model.tileOptions = [BMFTileModelOptions bmf_modelWith:call.arguments];
|
|
// NSLog(@"%@", [model bmf_toDictionary]);
|
|
if (!model) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
if (model.tileOptions.tileLoadType == kBMFTileLoadUrl && model.tileOptions.url) {
|
|
BMFURLTileLayer *urlTileLayer = [BMFURLTileLayer urlTileLayerWith:model];
|
|
[_mapView addOverlay:urlTileLayer];
|
|
result(@YES);
|
|
return;
|
|
} else if (model.tileOptions.tileLoadType == kBMFTileLoadLocalAsync) {
|
|
BMFAsyncTileLayer *asyncTileLayer = [BMFAsyncTileLayer asyncTileLayerWith:model];
|
|
[_mapView addOverlay:asyncTileLayer];
|
|
result(@YES);
|
|
return;
|
|
} else if (model.tileOptions.tileLoadType == kBMFTileLoadLocalSync) {
|
|
BMFSyncTileLayer *syncTileLayer = [BMFSyncTileLayer syncTileLayerWith:model];
|
|
[_mapView addOverlay:syncTileLayer];
|
|
result(@YES);
|
|
return;
|
|
} else {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation BMFAddGround
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
BMKGroundOverlay *ground = [BMKGroundOverlay groundOverlayWith:call.arguments];
|
|
if (ground) {
|
|
[_mapView addOverlay:ground];
|
|
result(@YES);
|
|
return;
|
|
} else {
|
|
result(@NO);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
@implementation BMFRemoveOverlay
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
if (!call.arguments || !call.arguments[@"id"]) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
NSString *ID = [call.arguments safeValueForKey:@"id"];
|
|
__weak __typeof__(_mapView) weakMapView = _mapView;
|
|
[_mapView.overlays enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
// 折线
|
|
if ([obj isKindOfClass:[BMKPolyline class]]) {
|
|
BMKPolyline *overlay = (BMKPolyline *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
// 多边形
|
|
if ([obj isKindOfClass:[BMKPolygon class]]) {
|
|
BMKPolygon *overlay = (BMKPolygon *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
// 弧线
|
|
if ([obj isKindOfClass:[BMKArcline class]]) {
|
|
BMKArcline *overlay = (BMKArcline *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
// 圆
|
|
if ([obj isKindOfClass:[BMKCircle class]]) {
|
|
BMKCircle *overlay = (BMKCircle *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
// ground
|
|
if ([obj isKindOfClass:[BMKGroundOverlay class]]) {
|
|
BMKGroundOverlay *overlay = (BMKGroundOverlay *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
// 瓦片图
|
|
if ([obj isKindOfClass:[BMFURLTileLayer class]]) {
|
|
BMFURLTileLayer *overlay = (BMFURLTileLayer *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
if ([obj isKindOfClass:[BMFAsyncTileLayer class]]) {
|
|
BMFAsyncTileLayer *overlay = (BMFAsyncTileLayer *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
if ([obj isKindOfClass:[BMFSyncTileLayer class]]) {
|
|
BMFSyncTileLayer *overlay = (BMFSyncTileLayer *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
|
|
}];
|
|
}
|
|
|
|
|
|
@end
|
|
|
|
@implementation BMFRemoveTileOverlay
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
|
|
if (!call.arguments || !call.arguments[@"id"]) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
NSString *ID = [call.arguments safeValueForKey:@"id"];
|
|
__weak __typeof__(_mapView) weakMapView = _mapView;
|
|
[_mapView.overlays enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
// 瓦片图
|
|
if ([obj isKindOfClass:[BMFURLTileLayer class]]) {
|
|
BMFURLTileLayer *overlay = (BMFURLTileLayer *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
if ([obj isKindOfClass:[BMFAsyncTileLayer class]]) {
|
|
BMFAsyncTileLayer *overlay = (BMFAsyncTileLayer *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
if ([obj isKindOfClass:[BMFSyncTileLayer class]]) {
|
|
BMFSyncTileLayer *overlay = (BMFSyncTileLayer *)obj;
|
|
if ([ID isEqualToString:overlay.Id]) {
|
|
[weakMapView removeOverlay:obj];
|
|
result(@YES);
|
|
*stop = YES;
|
|
return;
|
|
}
|
|
}
|
|
|
|
}];
|
|
}
|
|
|
|
|
|
@end
|
|
|
|
#pragma mark - Update
|
|
@implementation BMFUpdatePolyline
|
|
|
|
@synthesize _mapView;
|
|
|
|
- (nonnull NSObject<BMFMapViewHandler> *)initWith:(nonnull BMFMapView *)mapView {
|
|
_mapView = mapView;
|
|
return self;
|
|
}
|
|
|
|
- (void)handleMethodCall:(nonnull FlutterMethodCall *)call result:(nonnull FlutterResult)result {
|
|
if (!call.arguments || !call.arguments[@"id"]) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
NSString *ID = [call.arguments safeValueForKey:@"id"];
|
|
__block BMKPolyline *polyline;
|
|
[_mapView.overlays enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
if ([obj isKindOfClass:[BMKPolyline class]]) {
|
|
BMKPolyline *line = (BMKPolyline *)obj;
|
|
if ([ID isEqualToString:line.Id]) {
|
|
polyline = line;
|
|
*stop = YES;
|
|
}
|
|
}
|
|
}];
|
|
if (!polyline) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
NSString *member = [call.arguments safeValueForKey:@"member"];
|
|
|
|
// kBMFColorLine = 0, ///< 单色折线
|
|
// kBMFColorsLine, ///< 多色折线
|
|
// kBMFTextureLine, ///< 单纹理折线
|
|
// kBMFTexturesLine, ///< 多纹理折线
|
|
// kBMFDashLine, ///< 虚线
|
|
// kBMFMultiDashLine ///< 多色虚线
|
|
|
|
if ([member isEqualToString:@"coordinates"]) {
|
|
|
|
NSArray<NSDictionary *> *coordinates = [call.arguments safeObjectForKey:@"value"];
|
|
if (!coordinates || coordinates.count <= 1) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
|
|
CLLocationCoordinate2D coords[coordinates.count];
|
|
for (size_t i = 0, count = coordinates.count; i < count; i++) {
|
|
BMFCoordinate *coord = [BMFCoordinate bmf_modelWith:coordinates[i]];
|
|
coords[i] = [coord toCLLocationCoordinate2D];
|
|
}
|
|
switch (polyline.lineType) {
|
|
case kBMFColorLine:
|
|
case kBMFTextureLine:
|
|
case kBMFDashLine: {
|
|
[polyline setPolylineWithCoordinates:coords count:coordinates.count];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
}
|
|
break;
|
|
case kBMFColorsLine:
|
|
case kBMFTexturesLine:
|
|
case kBMFMultiDashLine: {
|
|
if (![call.arguments safeObjectForKey:@"indexs"]) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
NSMutableArray<NSNumber *> *indexs = [NSMutableArray array];
|
|
for (NSNumber *value in call.arguments[@"indexs"]) {
|
|
[indexs addObject:value];
|
|
}
|
|
[polyline setPolylineWithCoordinates:coords count:coordinates.count textureIndex:indexs];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
} else if ([member isEqualToString:@"width"]) {
|
|
BMKPolylineView *view = (BMKPolylineView *)[_mapView viewForOverlay:polyline];
|
|
view.lineWidth = [[call.arguments safeValueForKey:@"value"] floatValue];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"colors"]) {
|
|
NSArray *colorsData = [call.arguments safeObjectForKey:@"value"];
|
|
if (!colorsData || colorsData.count <= 0) {
|
|
result(@NO);
|
|
return;
|
|
}
|
|
BMKPolylineView *view = (BMKPolylineView *)[_mapView viewForOverlay:polyline];
|
|
NSMutableArray<UIColor *> *colors = [NSMutableArray array];
|
|
for (NSString *color in colorsData) {
|
|
[colors addObject:[UIColor fromColorString:color]];
|
|
}
|
|
if (polyline.lineType == kBMFColorsLine || polyline.lineType == kBMFMultiDashLine) {
|
|
view.colors = [colors copy];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if (polyline.lineType ==kBMFColorLine || polyline.lineType == kBMFDashLine) {
|
|
view.strokeColor = [colors firstObject];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
return;
|
|
} else {
|
|
NSLog(@"ios - 纹理折线不支持更新colors");
|
|
result(@NO);
|
|
return;
|
|
}
|
|
|
|
|
|
} else if ([member isEqualToString:@"lineDashType"]) {
|
|
if (polyline.lineType == kBMFTextureLine || polyline.lineType == kBMFTexturesLine) {
|
|
NSLog(@"ios - 纹理折线不支持虚线类型");
|
|
result(@NO);
|
|
return;
|
|
}
|
|
BMFPolylineModel *model = polyline.polylineModel;
|
|
model.polylineOptions.lineDashType = [[call.arguments safeValueForKey:@"value"] intValue];
|
|
[_mapView removeOverlay:polyline];
|
|
|
|
BMKPolyline *dashLine = [BMKPolyline polylineWithModel:model];
|
|
[_mapView addOverlay:dashLine];
|
|
// BMKPolylineView *view = (BMKPolylineView *)[_mapView viewForOverlay:polyline];
|
|
// view.lineDashType = [[call.arguments safeValueForKey:@"value"] intValue];
|
|
// [_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"lineCapType"]) {
|
|
if (polyline.lineType == kBMFDashLine || polyline.lineType == kBMFMultiDashLine) {
|
|
NSLog(@"ios - lineCapType不支持虚线");
|
|
result(@NO);
|
|
return;
|
|
}
|
|
BMKPolylineView *view = (BMKPolylineView *)[_mapView viewForOverlay:polyline];
|
|
view.lineCapType = [[call.arguments safeValueForKey:@"value"] intValue];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"lineJoinType"]) {
|
|
if (polyline.lineType == kBMFDashLine || polyline.lineType == kBMFMultiDashLine) {
|
|
NSLog(@"ios - lineJoinType不支持虚线");
|
|
result(@NO);
|
|
return;
|
|
}
|
|
BMKPolylineView *view = (BMKPolylineView *)[_mapView viewForOverlay:polyline];
|
|
view.lineJoinType = [[call.arguments safeValueForKey:@"value"] intValue];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"isThined"]) {
|
|
polyline.isThined = [[call.arguments safeValueForKey:@"value"] boolValue];
|
|
[_mapView setMapStatus:_mapView.getMapStatus];
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"textures"]) {
|
|
NSLog(@"ios - 暂不支持更新textures");
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"clickable"]) {
|
|
NSLog(@"ios - 暂不支持设置clickable");
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"isKeepScale"]) {
|
|
NSLog(@"ios - 暂不支持设置isKeepScale");
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"isFocus"]) {
|
|
NSLog(@"ios - 暂不支持设置isFocus");
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"visible"]) {
|
|
NSLog(@"ios - 暂不支持设置visible");
|
|
result(@YES);
|
|
return;
|
|
|
|
} else if ([member isEqualToString:@"zIndex"]) {
|
|
NSLog(@"ios - 暂不支持设置zIndex");
|
|
result(@YES);
|
|
return;
|
|
|
|
} else {
|
|
result(@YES);
|
|
}
|
|
|
|
}
|
|
|
|
@end
|