Files
ln-ios/ln_jq_app/ios/AMapNavIOSSDK/AMapNavIOSSDK/Classes/Class/ARoutePlaneController.m
2026-03-09 09:38:22 +08:00

931 lines
33 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// ARoutePlaneController.m
// ANavDemo
//
// Created by admin on 2026/2/5.
//
#import "ARoutePlaneController.h"
#import <AMapNaviKit/MAMapKit.h>
#import <AMapNaviKit/AMapNaviKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
#import <AMapSearchKit/AMapSearchAPI.h>
#import "ASearchAddressController.h"
#import "AMapNavSDKManager.h"
#import "AMapPrivacyUtility.h"
#define kRouteIndicatorViewHeight 64.f
#import "AMapHyStationModel.h"
#import "AMapNavHttpUtil.h"
@interface ARoutePlaneController ()<MAMapViewDelegate, AMapNaviDriveManagerDelegate,AMapNaviCompositeManagerDelegate , AMapLocationManagerDelegate , UITextFieldDelegate >
@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) MAMapView *mapView;
@property (nonatomic,strong) AMapLocationManager *locationService; //定位服务
/**
* 经纬度
*/
@property (nonatomic, assign) double latitude;
@property (nonatomic, assign) double longitude;
@property (nonatomic, strong) UITextField *startTf;
@property (nonatomic, strong) UITextField *dstTf;
@property (nonatomic, strong) UIButton *navBtn;
@property (nonatomic, strong) AMapPOI *startPoi;
@property (nonatomic, strong) AMapPOI *dstPoi;
@property (nonatomic, strong) AMapNaviCompositeManager *compositeManager;//nav
@property (nonatomic, assign) BOOL calRouteSuccess;
@property (nonatomic, strong) NSDictionary * currentCalRoutePaths;//当前规划的路线
@property (nonatomic , assign)BOOL isStartNav;//开始导航
@property (nonatomic, strong) NSArray * lastOverLays;
@property (nonatomic , strong)NSArray * hyStationArr;//站点数据
@property (nonatomic , assign)BOOL startQueryCurrnetNodeFlag;//开始查询当前节点;
@end
@implementation ARoutePlaneController
- (void)viewDidLoad {
[super viewDidLoad];
_startQueryCurrnetNodeFlag = NO;
[self observePrivacyStatus];
[self checkPrivacyStatus];
////
// [self.naviManager independentCalculateDriveRouteWithStartPOIInfo:startPOIInfo
// endPOIInfo:endPOIInfo
// wayPOIInfos:wayPOIInfos
// strategy:AMapNaviDrivingStrategyMultipleDefault
// callback:^(AMapNaviRouteGroup *routeGroup, NSError *error) {
// if (error == nil) {
// // 算路成功routeGroup 包含路线数据
// [self startNaviWithRoute:routeGroup];
// }
// }];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[AMapPrivacyUtility handlePrivacyAgreeStatusIn:self];
}
#pragma mark - request
-(void)requestHyListWithParms:(NSDictionary*)dic {
NSString * url = @"https://beta-esg.api.lnh2e.com/appointment/station/getNearbyHydrogenStationsByLocation";
/**
//汽车公园有数据
"longitude": "121.30461400",
"latitude": "31.17321100"
*/
// NSDictionary * dic = @{@"longitude":@"121.16661700" , @"latitude":@"31.27981600"};
[AMapNavHttpUtil postRequestWithURL:url parameters:dic requestHeader:@{@"Content-Type":@"application/json; charset=UTF-8"} successHandler:^(NSDictionary * _Nonnull data, NSURLResponse * _Nonnull response) {
AMapHyResponse * resp = [AMapHyResponse mj_objectWithKeyValues:data];
if (resp.code == 0 && resp.data) {
NSArray * allData = resp.data;
NSArray * dst = allData;
NSInteger len = allData.count;
if (allData.count > len) {
dst = [resp.data subarrayWithRange:NSMakeRange(0, len)];
}
[self updateMapAnnotationWithData:dst];
}else {
NSLog(@">>>>>>>请求站点:%@" ,resp.message);
}
} failureHandler:^(NSError * _Nonnull error) {
NSLog(@">>>>>>>请求站点err%@" ,error.debugDescription);
}];
}
-(void)requestHyDetailWithParms:(NSDictionary*)dic {
NSString * url = @"https://beta-esg.api.lnh2e.com/appointment/station/getStationInfoByArea";
[AMapNavHttpUtil postRequestWithURL:url parameters:dic requestHeader:@{@"Content-Type":@"application/json; charset=UTF-8"} successHandler:^(NSDictionary * _Nonnull data, NSURLResponse * _Nonnull response) {
AMapHyResponse * resp = [AMapHyResponse mj_objectWithKeyValues:data];
if (resp.code == 0) {
NSDictionary * resData = data[@"data"];
AMapHyStationModel * station = [AMapHyStationModel mj_objectWithKeyValues:resData];
[self updateHeadAddressWithStation:station];
}else {
NSLog(@">>>>>>>请求站点detail%@" ,resp.message);
}
} failureHandler:^(NSError * _Nonnull error) {
NSLog(@">>>>>>>请求站点err%@" ,error.debugDescription);
}];
}
-(void)updateHeadAddressWithStation:(AMapHyStationModel*)model {
AMapPOI * aoi = [[AMapPOI alloc] init];
aoi.location = [AMapGeoPoint locationWithLatitude:[model.latitude doubleValue] longitude:[model.longitude doubleValue]];
aoi.name = model.name;
self.dstPoi = aoi;
///地址栏
[self updateUIWithData:aoi textField:self.dstTf];
///地图显示
[self updateMapAnnotationWithData:@[model]];
}
-(void)updateMapAnnotationWithData:(NSArray *)dataArr {
self.hyStationArr = dataArr;
if (!(dataArr && dataArr.count > 0)) {
return;
}
///添加标注
NSMutableArray * points = [NSMutableArray arrayWithCapacity:dataArr.count];
for (AMapHyStationModel * model in dataArr) {
MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];
if (!(model.latitude && model.longitude)) {
continue;
}
pointAnnotation.coordinate = CLLocationCoordinate2DMake([model.latitude doubleValue], [model.longitude doubleValue]);
pointAnnotation.title = model.name;
[points addObject:pointAnnotation];
}
// 1. 先获取当前地图区域
// MACoordinateRegion currentRegion = self.mapView.region;
// 2. 添加标注但不改变地图显示
[self.mapView addAnnotations:points];
// 保持地图中心点为当前位置
if (self.latitude && self.longitude) {
[self.mapView setCenterCoordinate: CLLocationCoordinate2DMake(self.latitude, self.longitude) animated:YES];
}
// 3. 保持当前区域不变
// [self.mapView setRegion:currentRegion animated:NO];
}
#pragma mark -
-(void)initSubview {
UITextField * startTf = [[UITextField alloc] init];
startTf.borderStyle = UITextBorderStyleRoundedRect;
startTf.placeholder = @"起点";
startTf.tag = 100;
startTf.delegate = self;
startTf.font = [UIFont systemFontOfSize:13];
[self.view addSubview:startTf];
[startTf mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view).offset(kRoutePlanStatusBarHeight + 35);
make.left.mas_equalTo(self.view).offset(5);
make.width.mas_equalTo(@120);
make.height.mas_equalTo(@32);
}];
self.startTf = startTf;
UITextField * dstTf = [[UITextField alloc] init];
dstTf.borderStyle = UITextBorderStyleRoundedRect;
dstTf.placeholder = @"终点";
dstTf.tag = 200;
dstTf.delegate = self;
dstTf.font = [UIFont systemFontOfSize:13];
[self.view addSubview:dstTf];
[dstTf mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(startTf);
make.left.mas_equalTo(startTf.mas_right).offset(15);
// make.right.mas_equalTo(self.view).offset(-5);
make.width.height.mas_equalTo(startTf);
}];
self.dstTf = dstTf;
UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:@"规划线路" forState:UIControlStateNormal];
btn.backgroundColor = [UIColor whiteColor];
btn.titleLabel.font = [UIFont systemFontOfSize:14];
btn.layer.borderColor = [UIColor blueColor].CGColor;
btn.layer.borderWidth = 1;
btn.layer.cornerRadius = 5;
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(calRoutePath) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(dstTf.mas_right).offset(12);
make.top.mas_equalTo(startTf);
make.right.mas_equalTo(self.view).offset(-5);
make.height.mas_equalTo(@30);
}];
UIButton * navBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[navBtn setTitle:@"导航>" forState:UIControlStateNormal];
navBtn.backgroundColor = [UIColor whiteColor];
navBtn.titleLabel.font = [UIFont systemFontOfSize:14];
navBtn.layer.borderColor = [UIColor blueColor].CGColor;
navBtn.layer.borderWidth = 1;
navBtn.layer.cornerRadius = 6;
[navBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[navBtn addTarget:self action:@selector(navAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:navBtn];
[navBtn mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(self.view).offset(12);
// make.centerX.equalTo(self.view);
make.right.equalTo(self.view).offset(-15);
make.bottom.equalTo(self.view).offset(-118);
make.height.mas_equalTo(@30);
make.width.mas_equalTo(@60);
}];
[self.mapView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.view);
// make.top.equalTo(startTf.mas_bottom).offset(5);
make.top.equalTo(self.view).offset(0);
// make.bottom.equalTo(navBtn.mas_top).offset(-3);
make.bottom.equalTo(self.view).offset(0);
}];
[self.view bringSubviewToFront:navBtn];
}
- (void)initDriveManager
{
//请在 dealloc 函数中执行 [AMapNaviDriveManager destroyInstance] 来销毁单例
[[AMapNaviDriveManager sharedInstance] setDelegate:self];
}
- (void)initMapView
{
if (self.mapView == nil)
{
self.mapView = [[MAMapView alloc] initWithFrame:CGRectZero];
[self.mapView setDelegate:self];
self.mapView.showsUserLocation = YES;
self.mapView.userTrackingMode = MAUserTrackingModeFollowWithHeading;
self.mapView.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; // 定位精度
_mapView.showsScale= YES;
CGFloat ze = self.mapView.zoomLevel;
self.mapView.zoomLevel = 9;
// 2. 禁用所有不必要的动画和自动调整
// self.mapView.autoresizesSubviews = NO;
// [self.mapView setShowsWorldMap:NO]; // 不显示世界地图
// 3. 固定缩放级别
// [self.mapView setMinZoomLevel:6.0];
// [self.mapView setMaxZoomLevel:20.0];
// [self.mapView setZoomLevel:10.0 animated:NO];
// 4. 禁用自动调整
// [self.mapView setAutoCheckMapBoundary:NO];
[self.view addSubview:self.mapView];
if (@available(iOS 14.0, *)) {
// iOS14+ 需要额外处理
CLAuthorizationStatus status = [[[CLLocationManager alloc] init] authorizationStatus];
if (status == kCLAuthorizationStatusNotDetermined) {
[[[CLLocationManager alloc] init] requestWhenInUseAuthorization];
}
}
///TEST
// MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];
// pointAnnotation.coordinate = CLLocationCoordinate2DMake(31.19, 121.32);
// pointAnnotation.title = @"嘉兴经开站";
// [_mapView addAnnotation:pointAnnotation];
//
// MAPointAnnotation *pointAnnotation2 = [[MAPointAnnotation alloc] init];
// pointAnnotation2.coordinate = CLLocationCoordinate2DMake(30.81669400, 120.94291800);
// pointAnnotation2.title = @"测试站点1";
// [_mapView addAnnotation:pointAnnotation2];
UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[AMapNavCommonUtil imageWithName:@"icon_local"] forState:UIControlStateNormal];
btn.backgroundColor = [UIColor lightGrayColor];
btn.titleLabel.font = [UIFont systemFontOfSize:14];
btn.layer.cornerRadius = 20;
[btn addTarget:self action:@selector(updateUserLocalAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.view).offset(-10);
make.width.height.equalTo(@40);
make.top.equalTo(self.view).offset(150);
}];
}
}
-(void)updateUserLocalAction {
// 如果已经有位置,直接移动视角
if (_mapView.userLocation.location) {
CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(self.latitude, self.longitude);
[_mapView setCenterCoordinate:coord animated:YES];
// [_mapView setZoomLevel:10 animated:YES];
} else {
// 如果尚未获取到位置,进入跟踪模式等待回调
[_mapView setUserTrackingMode:MAUserTrackingModeFollow animated:YES];
}
}
- (void)initAnnotations
{
NaviPointAnnotation *beginAnnotation = [[NaviPointAnnotation alloc] init];
[beginAnnotation setCoordinate:CLLocationCoordinate2DMake(self.startPoi.location.latitude, self.startPoi.location.longitude)];
beginAnnotation.title = @"起始点";
beginAnnotation.navPointType = NaviPointAnnotationStart;
[self.mapView addAnnotation:beginAnnotation];
// NaviPointAnnotation *endAnnotation = [[NaviPointAnnotation alloc] init];
// [endAnnotation setCoordinate:CLLocationCoordinate2DMake(self.dstPoi.location.latitude, self.dstPoi.location.longitude)];
// endAnnotation.title = @"终点";
// endAnnotation.navPointType = NaviPointAnnotationEnd;
//
// [self.mapView addAnnotation:endAnnotation];
}
- (AMapLocationManager *)locationService {
if (!_locationService) {
_locationService = [[AMapLocationManager alloc] init];
_locationService.delegate = self;
_locationService.desiredAccuracy = kCLLocationAccuracyBest; // 最高精度模式
_locationService.distanceFilter = 5;
_locationService.locatingWithReGeocode = YES;
}
return _locationService;
}
- (void)dealloc {
[self.locationService stopUpdatingLocation];
}
- (AMapNaviCompositeManager *)compositeManager {
if (!_compositeManager) {
_compositeManager = [[AMapNaviCompositeManager alloc] init]; // 初始化
_compositeManager.delegate = self; // 如果需要使用AMapNaviCompositeManagerDelegate的相关回调如自定义语音、获取实时位置等需要设置delegate
}
return _compositeManager;
}
// 监听隐私状态变化
- (void)observePrivacyStatus {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handlePrivacyUpdate)
name:@"ksAMapPrivacyDidUpdateNotification" // 自定义通知
object:nil];
}
-(void)handlePrivacyUpdate {
[self checkPrivacyStatus];
}
// 检查当前隐私状态
- (void)checkPrivacyStatus {
BOOL hasAgreed = [[NSUserDefaults standardUserDefaults] boolForKey:@"usragreeStatus"];
if (hasAgreed) {
/// 开启定位
[self.locationService startUpdatingLocation];
// [self.mapView reloadMap];
[self initMapView];
[self initSubview];
[self initDriveManager];
} else {
}
}
#pragma mark - Action
///选择方式
-(void)navAction {
[self showSelectNavType];
}
-(void)showSelectNavType {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"选择导航类型" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *sure = [UIAlertAction actionWithTitle:@"SDK导航" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self navigationType_sdk];
}];
UIAlertAction *sure2 = [UIAlertAction actionWithTitle:@"高德地图导航" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self navigationType_app];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:sure];
[alert addAction:sure2];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil];
}
-(void)navigationType_app {
NSURL* scheme = [NSURL URLWithString:@"iosamap://"];
BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:scheme];
if (!canOpen) {
[self showAlertWithMessage:@"请先安装高德地图客户端"]; return;
}
NSString *myLocationScheme = [NSString stringWithFormat:@"iosamap://navi?sourceApplication=ANavDemo&lat=31.2304&lon=121.4737&t=0&dev=1"];
NSString *encodedUrlString = [myLocationScheme stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *gaodeUrl = [NSURL URLWithString:encodedUrlString];
[[UIApplication sharedApplication] openURL:gaodeUrl options:@{} completionHandler:^(BOOL res) {
}];
}
-(void)navigationType_sdk {
id delegate = [AMapNaviDriveManager sharedInstance].delegate;
if (!delegate) {
[AMapNaviDriveManager sharedInstance].delegate = self;
}
NSDictionary * routes = [AMapNaviDriveManager sharedInstance].naviRoutes;
if (!routes) {
NSLog(@"暂无路线信息!!!!!!!!!");
self.isStartNav = YES;
[self calRoutePath];
return;
}
AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
// [config setRoutePlanPOIType:AMapNaviRoutePlanPOITypeEnd location:[AMapNaviPoint locationWithLatitude:32.21 longitude:121.34] name:@"故宫22" POIId:nil];
[config setStartNaviDirectly:YES]; //直接进入导航界面
[config setNeedCalculateRouteWhenPresent:NO];//不在算路
[config setMultipleRouteNaviMode:NO];//直接单线路径导航
// [config setNeedDestoryDriveManagerInstanceWhenDismiss:NO];
self.isStartNav = NO;
[self.compositeManager presentRoutePlanViewControllerWithOptions:config];
}
#pragma mark - 计算线路
///计算线路
-(void)calRoutePath {
// [self.mapView removeOverlays:self.mapView.overlays];
// self.startTf.text = @"click calpath";
// return;
[self initAnnotations];
AMapNaviPoint * startPoint = [AMapNaviPoint locationWithLatitude:self.startPoi.location.latitude longitude:self.startPoi.location.longitude];
AMapNaviPoint * endPoint = [AMapNaviPoint locationWithLatitude:self.dstPoi.location.latitude longitude:self.dstPoi.location.longitude];
AMapNaviDrivingStrategy strategy = ConvertDrivingPreferenceToDrivingStrategy(0,
0,
0,
0,
0);
id delegate = [AMapNaviDriveManager sharedInstance].delegate;
if (!delegate) {
[AMapNaviDriveManager sharedInstance].delegate = self;
}
[[AMapNaviDriveManager sharedInstance] calculateDriveRouteWithStartPoints:@[startPoint]
endPoints:@[endPoint]
wayPoints:nil
drivingStrategy:strategy];
}
- (void)driveManagerOnCalculateRouteSuccess:(AMapNaviDriveManager *)driveManager
{
NSLog(@"onCalculateRouteSuccess");
//算路成功后显示路径
[self showNaviRoutes];
}
- (void)showNaviRoutes
{
if ([[AMapNaviDriveManager sharedInstance].naviRoutes count] <= 0)
{
return;
}
self.lastOverLays = self.mapView.overlays;
[self.mapView removeOverlays:self.mapView.overlays];
// [self.routeIndicatorInfoArray removeAllObjects];
self.currentCalRoutePaths = [AMapNaviDriveManager sharedInstance].naviRoutes;
NSInteger routeId = 0;
//将路径显示到地图上
for (NSNumber *aRouteID in [[AMapNaviDriveManager sharedInstance].naviRoutes allKeys])
{
AMapNaviRoute *aRoute = [[[AMapNaviDriveManager sharedInstance] naviRoutes] objectForKey:aRouteID];
int count = (int)[[aRoute routeCoordinates] count];
//添加路径Polyline
CLLocationCoordinate2D *coords = (CLLocationCoordinate2D *)malloc(count * sizeof(CLLocationCoordinate2D));
for (int i = 0; i < count; i++)
{
AMapNaviPoint *coordinate = [[aRoute routeCoordinates] objectAtIndex:i];
coords[i].latitude = [coordinate latitude];
coords[i].longitude = [coordinate longitude];
}
MAPolyline *polyline = [MAPolyline polylineWithCoordinates:coords count:count];
SelectableOverlay *selectablePolyline = [[SelectableOverlay alloc] initWithOverlay:polyline];
[selectablePolyline setRouteID:[aRouteID integerValue]];
[self.mapView addOverlay:selectablePolyline];
free(coords);
routeId = [aRouteID integerValue];
}
// 1. 先获取当前地图区域
MACoordinateRegion currentRegion = self.mapView.region;
[self.mapView showAnnotations:self.mapView.annotations animated:NO];
// 3. 保持当前区域不变
[self.mapView setRegion:currentRegion animated:NO];
[self selectNaviRouteWithID:routeId];
///如果已开始导航,直接进入导航
if (self.isStartNav) {
[self navigationType_sdk];
}
}
- (void)selectNaviRouteWithID:(NSInteger)routeID
{
//在开始导航前进行路径选择
if ([[AMapNaviDriveManager sharedInstance] selectNaviRouteWithRouteID:routeID])
{
[self selecteOverlayWithRouteID:routeID];
}
else
{
NSLog(@"路径选择失败!");
}
}
- (void)selecteOverlayWithRouteID:(NSInteger)routeID
{
[self.mapView.overlays enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id<MAOverlay> overlay, NSUInteger idx, BOOL *stop)
{
if ([overlay isKindOfClass:[SelectableOverlay class]])
{
SelectableOverlay *selectableOverlay = overlay;
/* 获取overlay对应的renderer. */
MAPolylineRenderer * overlayRenderer = (MAPolylineRenderer *)[self.mapView rendererForOverlay:selectableOverlay];
if (selectableOverlay.routeID == routeID)
{
/* 设置选中状态. */
selectableOverlay.selected = YES;
/* 修改renderer选中颜色. */
overlayRenderer.fillColor = selectableOverlay.selectedColor;
overlayRenderer.strokeColor = selectableOverlay.selectedColor;
/* 修改overlay覆盖的顺序. */
[self.mapView exchangeOverlayAtIndex:idx withOverlayAtIndex:self.mapView.overlays.count - 1];
}
else
{
/* 设置选中状态. */
selectableOverlay.selected = NO;
/* 修改renderer选中颜色. */
overlayRenderer.fillColor = selectableOverlay.regularColor;
overlayRenderer.strokeColor = selectableOverlay.regularColor;
}
}
}];
}
#pragma mark - AMapLocationManagerDelegate
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode
{
if (!location) {
return;
}
self.latitude = location.coordinate.latitude;
self.longitude = location.coordinate.longitude;
AMapNavSDKManager * sdk = [AMapNavSDKManager sharedManager];
sdk.localCity = reGeocode.city;
sdk.locationAddressDetail = reGeocode.POIName;
// 设置地图中心为用户位置
// MACoordinateRegion region = MACoordinateRegionMake(location.coordinate,
// MACoordinateSpanMake(0.1, 0.1));
// [self.mapView setRegion:region animated:YES];
//更新出发点
AMapPOI * aoi = [[AMapPOI alloc] init];
#ifdef kAMapSDKDebugFlag
aoi.location = [AMapGeoPoint locationWithLatitude:31.23 longitude:121.48 ];
aoi.name =@"人民大道185号";
#else
aoi.location = [AMapGeoPoint locationWithLatitude:self.latitude longitude:self.longitude ];
aoi.name = reGeocode.POIName;
#endif
self.startPoi = aoi;
[self updateUIWithData:aoi textField:self.startTf];
//获取附近站点
if (!self.startQueryCurrnetNodeFlag && reGeocode) {
self.startQueryCurrnetNodeFlag = YES;
NSString * province = reGeocode.province;
NSString * city = reGeocode.city;
NSString * district = reGeocode.district;
NSString * longitude = [NSString stringWithFormat:@"%f",self.longitude];
NSString * latitude = [NSString stringWithFormat:@"%f",self.latitude];
if (province && city && district) {
NSDictionary * dic = @{@"province":province , @"city":city , @"district":district , @"longitude":longitude , @"latitude":latitude};
[self requestHyDetailWithParms:dic];
}
[self requestHyListWithParms:@{@"longitude":longitude , @"latitude":latitude}];
}
}
#pragma mark - MAMapView 渲染
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
if ([annotation isKindOfClass:[NaviPointAnnotation class]])
{
static NSString *annotationIdentifier = @"NaviPointAnnotationIdentifier";
MAPinAnnotationView *pointAnnotationView = (MAPinAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if (pointAnnotationView == nil)
{
pointAnnotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:annotationIdentifier];
}
pointAnnotationView.animatesDrop = NO;
pointAnnotationView.canShowCallout = YES;
pointAnnotationView.draggable = NO;
NaviPointAnnotation *navAnnotation = (NaviPointAnnotation *)annotation;
if (navAnnotation.navPointType == NaviPointAnnotationStart)
{
[pointAnnotationView setPinColor:MAPinAnnotationColorGreen];
}
else if (navAnnotation.navPointType == NaviPointAnnotationEnd)
{
[pointAnnotationView setPinColor:MAPinAnnotationColorRed];
}
return pointAnnotationView;
}
if ( [annotation isMemberOfClass:[MAPointAnnotation class]])
{
MAUserLocation *user = (MAUserLocation *)annotation;
static NSString *pointReuseIndentifier = @"pointReuseIndentifier";
MAPinAnnotationView*annotationView = (MAPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:pointReuseIndentifier];
if (annotationView == nil)
{
annotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndentifier];
}
annotationView.canShowCallout= YES; //设置气泡可以弹出默认为NO
annotationView.animatesDrop = NO; //设置标注动画显示默认为NO
annotationView.draggable = NO; //设置标注可以拖动默认为NO
annotationView.pinColor = MAPinAnnotationColorPurple;
// 设置自定义的气泡背景色
if (@available(iOS 14.0, *)) {
// iOS 14+ 可以使用 tintColor
annotationView.tintColor = [UIColor systemBlueColor];
} else {
// iOS 13 及以下
annotationView.tintColor = [UIColor colorWithRed:0.1 green:0.6 blue:0.9 alpha:1.0];
}
return annotationView;
}
return nil;
}
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id<MAOverlay>)overlay
{
if ([overlay isKindOfClass:[SelectableOverlay class]])
{
SelectableOverlay * selectableOverlay = (SelectableOverlay *)overlay;
id<MAOverlay> actualOverlay = selectableOverlay.overlay;
MAPolylineRenderer *polylineRenderer = [[MAPolylineRenderer alloc] initWithPolyline:actualOverlay];
polylineRenderer.lineWidth = 8.f;
polylineRenderer.strokeColor = selectableOverlay.isSelected ? selectableOverlay.selectedColor : selectableOverlay.regularColor;
return polylineRenderer;
}
return nil;
}
// 当地图添加完标注视图后调用
- (void)mapView:(MAMapView *)mapView didAddAnnotationViews:(NSArray *)views {
// 遍历所有被添加的标注视图
# if 0
for (MAAnnotationView *view in views) {
// 检查是否为需要的标注类型,例如大头针标注
if ([view.annotation isMemberOfClass:[MAPointAnnotation class]]) {
// 延迟零点几秒执行,以确保视图添加动画完成(可选,但可使效果更平滑)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 选中该标注,从而使其气泡弹出
[mapView selectAnnotation:view.annotation animated:YES];
});
}
}
#endif
}
- (void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view {
NSLog(@"didSelectAnnotationView: %s" , __func__);
}
// 当标注被取消选中时调用
- (void)mapView:(MAMapView *)mapView didDeselectAnnotationView:(MAAnnotationView *)view {
if ([view.annotation isMemberOfClass:[MAPointAnnotation class]]) {
// 可以立即或稍作延迟后重新选中
// [mapView selectAnnotation:view.annotation animated:NO];
}
}
//选中一个点
- (void)mapView:(MAMapView *)mapView didAnnotationViewCalloutTapped:(MAAnnotationView *)view {
id pointAnnotation = view.annotation;
if ([pointAnnotation isMemberOfClass:MAPointAnnotation.class]) {
MAPointAnnotation *point = (MAPointAnnotation *)view.annotation;
NSLog(@"point: %@" , point.title);
AMapPOI * aoi = [[AMapPOI alloc] init];
aoi.location = [AMapGeoPoint locationWithLatitude:point.coordinate.latitude longitude:point.coordinate.longitude];
aoi.name = point.title;
self.dstPoi = aoi;
[self updateUIWithData:aoi textField:self.dstTf];
}
NSLog(@"didSelectAnnotationView: %s" , __func__);
}
#pragma mark - AMapNaviCompositeManagerDelegate
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager didStartNavi:(AMapNaviMode)naviMode {
}
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager onDriveStrategyChanged:(AMapNaviDrivingStrategy)driveStrategy {
NSLog(@"%s" , __func__ );
}
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
ASearchAddressController * vc = [[ASearchAddressController alloc] init];
UINavigationController * nav = [[UINavigationController alloc]initWithRootViewController:vc];
//UIModalPresentationOverFullScreen/UIModalPresentationFullScreen触发离开
nav.modalPresentationStyle = UIModalPresentationOverFullScreen;
nav.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
__weak typeof(self)weakSelf = self;
vc.selectAddressBlk = ^(AMapPOI * _Nonnull poi) {
[weakSelf updateUIWithData:poi textField:textField];
};
[self presentViewController:nav animated:YES completion:^{
}];
return NO;
}
-(void)updateUIWithData: (AMapPOI*)poi textField: (UITextField*)tf {
BOOL isStart = tf.tag == 100;
tf.text = poi.name;
if (isStart) {
self.startPoi = poi;
}else {
self.dstPoi = poi;
}
}
#pragma mark - tool
-(void)showAlertWithMessage:(NSString *)msg {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:msg preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sure = [UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:sure];
[self.navigationController presentViewController:alert animated:YES completion:nil];
}
@end