lcsdust
lcsdust

Reputation: 31

the map could not show my location

I want to display a map and show the location. My code is running well, but the location could not be displayed on the map. I do not know how to do it.

Well here are my classes:

ViewController.h

@interface ViewController : 
UIViewController<AGSMapViewLayerDelegate,CLLocationManagerDelegate>
{
    AGSMapView *_mapView;
    AGSGraphicsLayer  *_graphicsLayer;
    AGSTiledMapServiceLayer *_tiledLayer;
    CLLocationManager *locationManager;
    CLLocation *startingPoint;   
}

@property (nonatomic,retain) IBOutlet AGSMapView *mapView;
@property (nonatomic, retain) AGSTiledMapServiceLayer *tiledLayer;
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain)  AGSGraphicsLayer  *graphicsLayer;
@property (nonatomic, retain) CLLocation *startingPoint;

ViewController.m

@interface ViewController()

@end

@implementation ViewController

@synthesize mapView = _mapView;
@synthesize graphicsLayer = _graphicsLayer;
@synthesize tiledLayer = _tiledLayer;
@synthesize locationManager;
@synthesize startingPoint;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.mapView.layerDelegate =self;
    self.graphicsLayer = [AGSGraphicsLayer graphicsLayer];
    [self.mapView addMapLayer:self.graphicsLayer withName:@"graphicsLayer"];

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self; // send loc updates to myself
    self.locationManager.distanceFilter = 1000.0f;  // 1 kilometer
    self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;       
}

- (void)mapViewDidLoad:(AGSMapView *)mapView{
    [self.locationManager startUpdatingLocation];  //启用位置监控
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    self.startingPoint = [locations lastObject];
    [self.locationManager stopUpdatingLocation]; //获取位置信息

    CGPoint coord;
    coord.x = startingPoint.coordinate.longitude;
    coord.y = startingPoint.coordinate.latitude;

    //将坐标用AGSPoint来表示
    AGSPoint *mappoint = [[AGSPoint alloc]initWithX:coord.x y:coord.y spatialReference:nil];
    //[self.graphicsLayer removeAllGraphics];
    AGSPictureMarkerSymbol *pt;
    pt = [AGSPictureMarkerSymbol pictureMarkerSymbolWithImageNamed:@"LocationDisplay.png"];
    AGSGraphic *LocationDisplay = [[AGSGraphic alloc] initWithGeometry:mappoint symbol:pt attributes:nil infoTemplateDelegate:nil];

    // 添加要素到GraphicsLayer
    [self.graphicsLayer addGraphic:LocationDisplay];
    [self.graphicsLayer refresh];

    //漫游到指定级别
    [self.mapView centerAtPoint:mappoint animated:YES];
    int levelToZoomTo = 12;
    AGSLOD* lod = [self.tiledLayer.mapServiceInfo.tileInfo.lods objectAtIndex:levelToZoomTo];
    float zoomFactor = lod.resolution/self.mapView.resolution;
    AGSMutableEnvelope *newEnv = [AGSMutableEnvelope envelopeWithXmin:self.mapView.visibleAreaEnvelope.xmin
                                    ymin:self.mapView.visibleAreaEnvelope.ymin
                                    xmax:self.mapView.visibleAreaEnvelope.xmax
                                    ymax:self.mapView.visibleAreaEnvelope.ymax
                                    spatialReference:self.mapView.spatialReference];
    [newEnv expandByFactor:zoomFactor];
    [self.mapView zoomToEnvelope:newEnv animated:YES];
}

Upvotes: 3

Views: 861

Answers (3)

EPage_Ed
EPage_Ed

Reputation: 1183

func mapViewDidLoad(mapView: AGSMapView!) {
    //do something now that the map is loaded
    //for example, show the current location on the map
    mapView.locationDisplay.startDataSource()
}

Upvotes: 0

progrmr
progrmr

Reputation: 77291

You need to provide a spatial reference when you create the AGSPoint from the CLLocation coordinates. Use [AGSSpatialReference wgs84SpatialReference]

If the map is not using WGS84 spatial reference then you need to reproject the point to the map spatial reference before you add it to the map using the geometry engine.

OR

you can use the locationDisplay property built into AGSMapView, by setting mapView.locationDisplay.startDataSource to display your current location.

See the docs for AGSMapView

Upvotes: 3

Vinodh Sampath
Vinodh Sampath

Reputation: 11

Try setting mapview.showUserLocation = YES ; or set it in XIB

Upvotes: -1

Related Questions