216 lines
8.5 KiB
Objective-C
216 lines
8.5 KiB
Objective-C
//
|
||
// AMapConvertUtil.m
|
||
// amap_map
|
||
//
|
||
// Created by lly on 2020/10/30.
|
||
//
|
||
|
||
#import "AMapConvertUtil.h"
|
||
|
||
@implementation AMapConvertUtil
|
||
|
||
|
||
/// 经纬度坐标转字符串
|
||
/// @param coordinate 经纬度坐标
|
||
+ (NSString *)stringFromCoordinate:(CLLocationCoordinate2D)coordinate {
|
||
return [NSString stringWithFormat:@"{%.6f,%.6f}", coordinate.longitude, coordinate.latitude];
|
||
}
|
||
|
||
+ (UIColor*)colorFromNumber:(NSNumber*)numberColor {
|
||
if (numberColor == nil || [numberColor isKindOfClass:[NSNumber class]] == NO) {
|
||
return nil;
|
||
}
|
||
unsigned long value = [numberColor unsignedLongValue];
|
||
return [UIColor colorWithRed:((float)((value & 0xFF0000) >> 16)) / 255.0
|
||
green:((float)((value & 0xFF00) >> 8)) / 255.0
|
||
blue:((float)(value & 0xFF)) / 255.0
|
||
alpha:((float)((value & 0xFF000000) >> 24)) / 255.0];
|
||
}
|
||
|
||
+ (CGPoint)pointFromArray:(NSArray*)data {
|
||
NSAssert((data != nil && [data isKindOfClass:[NSArray class]] && data.count == 2), @"数组类型转point格式错误");
|
||
return CGPointMake([data[0] doubleValue],
|
||
[data[1] doubleValue]);
|
||
}
|
||
|
||
/// 从数据中解析经纬度
|
||
/// @param array 经纬度数组对(默认第一个当做维度,第二个当做经度)
|
||
+ (CLLocationCoordinate2D)coordinateFromArray:(NSArray *)array {
|
||
CLLocationCoordinate2D location = kCLLocationCoordinate2DInvalid;
|
||
if (array.count == 2) {
|
||
double latitude = [array[0] doubleValue];
|
||
double longitude = [array[1] doubleValue];
|
||
if ([self checkValidLatitude:latitude longitude:longitude]) {
|
||
location = CLLocationCoordinate2DMake(latitude, longitude);
|
||
} else if ([self checkValidLatitude:longitude longitude:latitude]) {//交换二者
|
||
location = CLLocationCoordinate2DMake(longitude, latitude);
|
||
} else {
|
||
NSLog(@"经纬度参数异常,解析为无效经纬度");
|
||
}
|
||
} else {
|
||
NSLog(@"经纬度参数异常,解析为无效经纬度");
|
||
}
|
||
return location;
|
||
}
|
||
|
||
+ (NSArray *)jsonFromCoordinate:(CLLocationCoordinate2D )coord {
|
||
if (CLLocationCoordinate2DIsValid(coord)) {
|
||
return @[@(coord.latitude),@(coord.longitude)];
|
||
} else {
|
||
NSLog(@"经纬度无效,返回为空");
|
||
return @[];
|
||
}
|
||
}
|
||
|
||
/// 检测经纬度是否有效
|
||
/// @param latitude 维度
|
||
/// @param longitude 经度
|
||
+ (BOOL)checkValidLatitude:(double)latitude longitude:(double)longitude {
|
||
if (latitude > 90 || latitude < -90) {
|
||
return false;
|
||
}
|
||
if (longitude > 180 || longitude < -180) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
+ (NSArray<NSNumber *> *)jsonArrayFromCoordinate:(CLLocationCoordinate2D)coordinate {
|
||
if (CLLocationCoordinate2DIsValid(coordinate)) {
|
||
return @[ @(coordinate.latitude), @(coordinate.longitude) ];
|
||
} else {
|
||
return @[];
|
||
}
|
||
}
|
||
|
||
|
||
+ (UIImage*)scaleImage:(UIImage*)image param:(NSNumber*)scaleParam {
|
||
double scale = 1.0;
|
||
if ([scaleParam isKindOfClass:[NSNumber class]]) {
|
||
scale = scaleParam.doubleValue;
|
||
}
|
||
if (fabs(scale - 1) > 1e-3) {
|
||
return [UIImage imageWithCGImage:[image CGImage]
|
||
scale:(image.scale * scale)
|
||
orientation:(image.imageOrientation)];
|
||
}
|
||
return image;
|
||
}
|
||
|
||
|
||
+ (UIImage*)imageFromRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar iconData:(NSArray*)iconData {
|
||
UIImage* image;
|
||
if ([iconData.firstObject isEqualToString:@"defaultMarker"]) {
|
||
image = [UIImage imageNamed:[registrar lookupKeyForAsset:@"packages/amap_map/res/marker_default.png"]];//默认的图片资源
|
||
CGFloat screenScale = [[UIScreen mainScreen] scale];
|
||
image = [self scaleImage:image param:[NSNumber numberWithFloat:screenScale]];
|
||
//添加默认图片
|
||
} else if ([iconData.firstObject isEqualToString:@"fromAsset"]) {
|
||
if (iconData.count == 2) {
|
||
image = [UIImage imageNamed:[registrar lookupKeyForAsset:iconData[1]]];
|
||
CGFloat screenScale = [[UIScreen mainScreen] scale];
|
||
image = [self scaleImage:image param:[NSNumber numberWithFloat:screenScale]];
|
||
}
|
||
} else if ([iconData.firstObject isEqualToString:@"fromAssetImage"]) {
|
||
if (iconData.count == 3) {
|
||
image = [UIImage imageNamed:[registrar lookupKeyForAsset:iconData[1]]];
|
||
NSNumber* scaleParam = iconData[2];
|
||
image = [self scaleImage:image param:scaleParam];
|
||
} else {
|
||
NSString* error =
|
||
[NSString stringWithFormat:@"'fromAssetImage' should have exactly 3 arguments. Got: %lu",
|
||
(unsigned long)iconData.count];
|
||
NSException* exception = [NSException exceptionWithName:@"InvalidBitmapDescriptor"
|
||
reason:error
|
||
userInfo:nil];
|
||
@throw exception;
|
||
}
|
||
} else if ([iconData[0] isEqualToString:@"fromBytes"]) {
|
||
if (iconData.count == 2) {
|
||
@try {
|
||
FlutterStandardTypedData* byteData = iconData[1];
|
||
CGFloat screenScale = [[UIScreen mainScreen] scale];
|
||
image = [UIImage imageWithData:[byteData data] scale:screenScale];
|
||
} @catch (NSException* exception) {
|
||
@throw [NSException exceptionWithName:@"InvalidByteDescriptor"
|
||
reason:@"Unable to interpret bytes as a valid image."
|
||
userInfo:nil];
|
||
}
|
||
} else {
|
||
NSString* error = [NSString
|
||
stringWithFormat:@"fromBytes should have exactly one argument, the bytes. Got: %lu",
|
||
(unsigned long)iconData.count];
|
||
NSException* exception = [NSException exceptionWithName:@"InvalidByteDescriptor"
|
||
reason:error
|
||
userInfo:nil];
|
||
@throw exception;
|
||
}
|
||
}
|
||
|
||
return image;
|
||
}
|
||
|
||
/// 检测图标相关的描述,是否修改过
|
||
/// @param previousIcon 之前的图标
|
||
/// @param currentIcon 当前新的图标
|
||
/// @return 修改了,则返回yes,否则返回NO
|
||
+ (BOOL)checkIconDescriptionChangedFrom:(NSArray *)previousIcon to:(NSArray *)currentIcon {
|
||
if (previousIcon.count != currentIcon.count) {
|
||
return YES;
|
||
}
|
||
//两个数组的数量一样
|
||
for (NSUInteger index = 0; index < previousIcon.count; index ++) {
|
||
if ([previousIcon[index] isKindOfClass:[NSString class]]) {
|
||
if ([previousIcon[index] isEqualToString:currentIcon[index]] == NO) {
|
||
return YES;
|
||
}
|
||
} else if ([previousIcon[index] isKindOfClass:[NSNumber class]]) {
|
||
if (fabs([previousIcon[index] doubleValue] - [currentIcon[index] doubleValue]) > 0.000001) {
|
||
return YES;
|
||
}
|
||
} else {//其它数据无法比较,直接默认强制更新
|
||
return NO;
|
||
}
|
||
}
|
||
return NO;
|
||
}
|
||
|
||
+ (BOOL)isEqualWith:(CLLocationCoordinate2D)coord1 to:(CLLocationCoordinate2D)coord2 {
|
||
if (fabs(coord1.latitude - coord2.latitude) > 0.000001 || fabs(coord1.longitude - coord2.longitude) > 0.000001) {
|
||
return NO;
|
||
}
|
||
return YES;
|
||
}
|
||
|
||
+ (NSDictionary *)dictFromTouchPOI:(MATouchPoi *)poi {
|
||
if (poi == nil) {
|
||
return nil;
|
||
}
|
||
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:3];
|
||
if (poi.name) {
|
||
[dict setObject:poi.name forKey:@"name"];
|
||
}
|
||
if (CLLocationCoordinate2DIsValid(poi.coordinate)) {
|
||
[dict setObject:[AMapConvertUtil jsonArrayFromCoordinate:poi.coordinate] forKey:@"latLng"];
|
||
}
|
||
if (poi.uid) {
|
||
[dict setObject:poi.uid forKey:@"id"];
|
||
}
|
||
return [dict copy];
|
||
}
|
||
|
||
+ (MAMapRect)mapRectFromArray:(NSArray *)array {
|
||
NSAssert((array && [array isKindOfClass:[NSArray class]] && array.count == 2), @"解析mapRect的参数有误");
|
||
CLLocationCoordinate2D southwest = [AMapConvertUtil coordinateFromArray:array[0]];
|
||
CLLocationCoordinate2D northeast = [AMapConvertUtil coordinateFromArray:array[1]];
|
||
MAMapPoint mapNorthEastPoint = MAMapPointForCoordinate(northeast);
|
||
MAMapPoint mapSouthWestPoint = MAMapPointForCoordinate(southwest);
|
||
double width = fabs(mapNorthEastPoint.x - mapSouthWestPoint.x);
|
||
double height = fabs(mapNorthEastPoint.y - mapSouthWestPoint.y);
|
||
MAMapRect limitRect = MAMapRectMake(mapSouthWestPoint.x, mapNorthEastPoint.y, width, height);
|
||
return limitRect;
|
||
}
|
||
|
||
|
||
@end
|