지도와 포지셔닝 (6) 고덕지도 서비스 2
33970 단어 지도 및 위치 지정
1. 오버레이
Overlay는 폴리라인, 다각형(오목과 볼록), 원, 대지 곡선, 이미지 커버, 사용자 정의 커버 등 5가지 유형을 포함하는 다중 커버물이라고 부른다.또한 데이터와 View를 분리하는 원칙을 적용합니다.
지도에 Overlay를 추가하려면 다음과 같이 하십시오.
1.1 폴리라인
폴리라인 클래스는 경위도 좌표 세트로 구성된 MAPolyline이며 일련의 선 세그먼트를 질서정연한 시퀀스로 구성합니다.iOS SDK는 3D 벡터 맵에 화살표나 텍스쳐 같은 스타일의 폴리라인을 그릴 수 있으며, 폴리라인 끝점과 연결점 유형을 설정하여 다양한 폴리라인이 그려진 장면을 만족시킬 수 있습니다.맵에 폴리라인을 추가하려면 다음과 같이 하십시오.
코드 예:
#import "ViewController.h"
#import
@interface ViewController ()<MAMapViewDelegate>
{
MAMapView *_mapView;//
}
@end
@implementation ViewController
-(void) viewDidLoad {
//
CLLocationCoordinate2D commonPolylineCoords[4];
commonPolylineCoords[0].latitude = 39.832136;
commonPolylineCoords[0].longitude = 116.34095;
commonPolylineCoords[1].latitude = 39.832136;
commonPolylineCoords[1].longitude = 116.42095;
commonPolylineCoords[2].latitude = 39.902136;
commonPolylineCoords[2].longitude = 116.42095;
commonPolylineCoords[3].latitude = 39.902136;
commonPolylineCoords[3].longitude = 116.44095;
//
MAPolyline *commonPolyline = [MAPolyline polylineWithCoordinates:commonPolylineCoords count:4];
//
[_mapView addOverlay: commonPolyline];
}
//
- (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id )overlay {
if ([overlay isKindOfClass:[MAPolyline class]])
{
//
MAPolylineView *polylineView = [[MAPolylineView alloc] initWithPolyline:overlay];
//
polylineView.lineWidth = 10.f;
polylineView.strokeColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.6];
polylineView.lineJoin = kCGLineJoinRound;//
polylineView.lineCap = kCGLineCapRound;//
return polylineView;
}
return nil;
}
@end
위의 리셋 함수에서 MAPolylineView의loadStrokeTextureImage 방법을 호출하면 접선 무늬 그림을 설정할 수 있습니다. (3D 벡터 맵만 지원)
: , 2 , 64*64, ; , 、 , 。
텍스쳐 이미지를 설정하는 코드는 다음과 같습니다.
[polylineView loadStrokeTextureImage:[UIImage imageNamed:@"arrowTexture"]];
1.2 다각형
다각형 클래스는 MAPolygon으로 MAPolyline과 유사하며 질서정연한 서열의 일련의 좌표를 포함하지만 다각형은 내부 구역을 포함한다.맵에 다각형을 추가하려면 다음과 같이 하십시오.
코드 예:
-(void) loadRect {
//
CLLocationCoordinate2D coordinates[4];
coordinates[0].latitude = 39.810892;
coordinates[0].longitude = 116.233413;
coordinates[1].latitude = 39.816600;
coordinates[1].longitude = 116.331842;
coordinates[2].latitude = 39.762187;
coordinates[2].longitude = 116.357932;
coordinates[3].latitude = 39.733653;
coordinates[3].longitude = 116.278255;
MAPolygon *polygon = [MAPolygon polygonWithCoordinates:coordinates count:4];
//
[_mapView addOverlay: polygon];
}
- (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id )overlay {
if ([overlay isKindOfClass:[MAPolygon class]])
{
MAPolygonView *polygonView = [[MAPolygonView alloc] initWithPolygon:overlay];
polygonView.lineWidth = 5.f;
polygonView.strokeColor = [UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:0.8];
polygonView.fillColor = [UIColor colorWithRed:0.77 green:0.88 blue:0.94 alpha:0.8];
polygonView.lineJoin = kCGLineJoinRound;//
return polygonView;
}
return nil;
}
1.3 원
원 클래스는 MACircle이며, 원 객체는 중심점(경위도)과 반지름(m)으로 구성됩니다.맵에서 원을 그리려면 다음과 같이 하십시오.
코드 예:
-(void) loadCircle{
//
MACircle *circle = [MACircle circleWithCenterCoordinate:CLLocationCoordinate2DMake(39.952136, 116.50095) radius:5000];
//
[_mapView addOverlay: circle];
}
- (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id )overlay {
if ([overlay isKindOfClass:[MACircle class]])
{
MACircleView *circleView = [[MACircleView alloc] initWithCircle:overlay];
circleView.lineWidth = 5.f;
circleView.strokeColor = [UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:0.8];
circleView.fillColor = [UIColor colorWithRed:1.0 green:0.8 blue:0.0 alpha:0.8];
return circleView;
}
return nil;
}
1.4 대지 곡선
대지 곡선류는 MAGeodesicPolyline으로 MAPolyline에서 계승되었다.지도에 대지 곡선을 추가하려면 다음과 같이 하십시오.
코드 예:
- (void) loadGeodesicPolyline {
CLLocationCoordinate2D geodesicCoords[2];
geodesicCoords[0].latitude = 39.905151;
geodesicCoords[0].longitude = 116.401726;
geodesicCoords[1].latitude = 38.905151;
geodesicCoords[1].longitude = 70.401726;
//
MAGeodesicPolyline *geodesicPolyline = [MAGeodesicPolyline polylineWithCoordinates:geodesicCoords count:2];
[_mapView addOverlay:geodesicPolyline];
}
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id )overlay
{
if ([overlay isKindOfClass:[MAGeodesicPolyline class]])
{
MAPolylineRenderer *polylineRenderer = [[MAPolylineRenderer alloc] initWithPolyline:overlay];
polylineRenderer.lineWidth = 4.f;
polylineRenderer.strokeColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1];
return polylineRenderer;
}
return nil;
}
1.5 이미지 커버물
그림 덮어쓰기 클래스는 MAGround Overlay입니다. 그림 한 장을 지도가 지정한 위치에 적당한 크기로 붙이는 기능을 완성할 수 있습니다.그림 덮어쓰기를 추가하려면 다음과 같이 하십시오.
코드 예:
- (void)loadGroundOverlay {
MACoordinateBounds coordinateBounds = MACoordinateBoundsMake(CLLocationCoordinate2DMake(39.939577, 116.388331),CLLocationCoordinate2DMake(39.935029, 116.384377));
MAGroundOverlay *groundOverlay = [MAGroundOverlay groundOverlayWithBounds:coordinateBounds icon:[UIImage imageNamed:@"category_3"]];
[_mapView addOverlay:groundOverlay];
_mapView.visibleMapRect = groundOverlay.boundingMapRect;
}
- (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id )overlay
{
if ([overlay isKindOfClass:[MAGroundOverlay class]])
{
MAGroundOverlayView *groundOverlayView = [[MAGroundOverlayView alloc] initWithGroundOverlay:overlay];
return groundOverlayView;
}
return nil;
}
1.6 사용자 정의 레이어
사용자 정의 도층을 통해 기초 밑바닥 지도에 추가 특성을 추가할 수 있다. 예를 들어 특정한 백화점의 실내 정보, 특정한 관광지의 상세한 정보 등이다.사용자 정의 도면층 클래스는 MATile Overlay로 기본 밑바닥 지도에 추가할 수 있는 그림 집합을 정의합니다.
사용자 정의 도층을 추가하는 전제는 구면 묵카토 투영을 사용하여 해당하는 기와를 생성하고 생성된 형식에 따라 서버에 배치하는 것이다.지도에 사용자 정의 도면층을 표시하려면 다음과 같이 하십시오.
코드 예:
#define TileOverlayViewControllerCoordinate CLLocationCoordinate2DMake(39.910695, 116.372830)
- (void)loadTileOverlay {
_mapView.centerCoordinate = TileOverlayViewControllerCoordinate;
_mapView.zoomLevel = 19;
[_mapView addOverlay:[self constructTileOverlayWithFloor:2]];
}
- (MATileOverlay *)constructTileOverlayWithFloor:(NSInteger)floor {
/* tileOverlay URL . */
NSString *URLTemplate = [NSString stringWithFormat: @"http://sdkdemo.amap.com:8080/tileserver/Tile?x={x}&y={y}&z={z}&f=%ld", (long)floor];
MATileOverlay *tileOverlay = [[MATileOverlay alloc] initWithURLTemplate:URLTemplate];
tileOverlay.minimumZ = 18; // Zoom
tileOverlay.maximumZ = 20; // Zoom
tileOverlay.boundingMapRect = MAMapRectForCoordinateRegion(MACoordinateRegionMakeWithDistance(TileOverlayViewControllerCoordinate, 200, 200)); //
return tileOverlay;
}
- (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id )overlay {
if ([overlay isKindOfClass:[MATileOverlay class]]) {
MATileOverlayView *tileOverlayView = [[MATileOverlayView alloc] initWithTileOverlay:overlay];
return tileOverlayView;
}
return nil;
}
1.7 히트맵 레이어
열도 도면층은 분포 상황을 색깔 변화로 나타내는 도면층이다.고덕지도 iOS SDK 자체 V2.6.0 버전은 열도 도면층의 그리기 기능을 제공하고 개발자는 자체 데이터(입학열력도, 인류열력도 등)를 이용하여 귀하의 결정을 지도할 수 있는 열력도를 만들 수 있습니다.지도에 열 다이어그램을 추가하려면 다음과 같이 하십시오.
코드 예:
- (void)loadHeatMapTileOverlay {
//
MAHeatMapTileOverlay *heatMapTileOverlay = [[MAHeatMapTileOverlay alloc] init];
// , locations.json
NSMutableArray* data = [NSMutableArray array];
NSData *jsdata = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"heatMapData" ofType:@"json"]];
if (jsdata)
{
NSArray *dicArray = [NSJSONSerialization JSONObjectWithData:jsdata options:NSJSONReadingAllowFragments error:nil];
for (NSDictionary *dic in dicArray)
{
MAHeatMapNode *node = [[MAHeatMapNode alloc] init];
CLLocationCoordinate2D coordinate;
coordinate.latitude = [dic[@"lat"] doubleValue];
coordinate.longitude = [dic[@"lng"] doubleValue];
node.coordinate = coordinate;
node.intensity = 1;//
[data addObject:node];
}
}
heatMapTileOverlay.data = data;
//
MAHeatMapGradient *gradient = [[MAHeatMapGradient alloc] initWithColor:@[[UIColor blueColor],[UIColor greenColor], [UIColor redColor]] andWithStartPoints:@[@(0.2),@(0.5),@(0.9)]];
heatMapTileOverlay.gradient = gradient;
//
[_mapView addOverlay: heatMapTileOverlay];
}
- (MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id )overlay
{
if ([overlay isKindOfClass:[MATileOverlay class]])
{
MATileOverlayView *tileOverlayView = [[MATileOverlayView alloc] initWithTileOverlay:overlay];
return tileOverlayView;
}
return nil;
}
2. 지도 컨트롤
지도 컨트롤러는 현재 지도의 상태를 직관적으로 파악할 수 있습니다. iOS SDK는'지도 로고','나침반','비례자'세 가지 지도 컨트롤러를 제공합니다.
2.1 지도 로고
iOS SDK의 기본 로고는'고덕지도'라는 글자로 지도의 왼쪽 아래에 표시됩니다.맵 Logo는 제거할 수 없지만 MAMAPView를 통해 제거할 수 있습니다.logoCenter 속성은 Logo의 표시 위치를 조정합니다.
2.2 나침반
나침반은 기본적으로 열려 있으며 지도의 오른쪽 상단에 표시됩니다.MAMapView의 showsCompass 속성을 사용하여 나침반의 가시성을 제어합니다.compassOrigin 속성은 나침반의 표시 위치를 변경합니다.
2.3 비례자 비례자는 지도상에서 두 점 사이의 거리와 실제 이에 대응하는 두 점 거리의 비례를 나타낸다. 서로 다른 축소 단계에서 비례자가 대표하는 길이도 다르다.iOS SDK에서 축척은 기본적으로 맵의 왼쪽 위 모서리에 표시됩니다.MAMapView의 showScale 속성은 비례자의 가시성을 제어하고 scaleOrigin 속성은 비례자의 표시 위치를 바꾸는 데 사용됩니다.
코드 예:
#import "ViewController.h"
#import
@interface ViewController ()<MAMapViewDelegate>
{
MAMapView *_mapView;//
}
@end
@implementation ViewController
-(void) viewDidLoad {
//
_mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
_mapView.delegate = self;
[self.view addSubview:_mapView];
// logo
_mapView.logoCenter = CGPointMake(self.view.frame.size.width -100, self.view.frame.size.height -100);
//
_mapView.showsCompass= YES; // NO ;YES
_mapView.compassOrigin= CGPointMake(_mapView.compassOrigin.x, 100); //
//
_mapView.showsScale= YES; // NO ;YES
_mapView.scaleOrigin= CGPointMake(_mapView.scaleOrigin.x, 100); //
}
@end
3. 지도 제스처
iOS SDK는 다양한 지도 인터랙티브 제스처 기능을 지원하며, 코드를 통해서도 대응하는 제스처 기능을 구현할 수 있다.제스처 기능은 기본적으로 켜져 있으며 코드를 통해 비활성화할 수 있습니다.
3.1 확대/축소 제스처
확대/축소 제스처는 다음과 같이 맵의 확대/축소 수준을 변경합니다.
3.2 초점이동(슬라이딩) 제스처
사용자는 손가락으로 지도를 끌어서 사방으로 굴리거나 손가락으로 지도를 미끄러뜨릴 수 있다.MAMapView의 scrollEnabled 속성에서 초점이동(슬라이딩) 제스처를 비활성화하거나 켤 수 있습니다.지도를 평이할 때, 축소 레벨이 변하지 않으며, 지도의 중심점을 바꾸어 지도를 이동할 수 있습니다.
3.3 회전 제스처(3D)
사용자는 두 손가락으로 지도를 돌릴 수 있으며 3D 벡터 지도를 돌릴 수 있다.클래스 MAMapView의 rotateEnabled 속성을 호출하여 회전 제스처를 비활성화하거나 켭니다.회전 각도의 범위는 시계 반대 방향으로 [0.f 360.f]입니다.맵의 회전 각도를 설정하려면 MAMapView의 setRotationDegree 메서드를 호출합니다.
3.4 기울기 제스처(3D)
사용자는 지도에 두 손가락을 놓고 함께 아래로 이동하거나 위로 올라가 경사각을 늘리거나 줄일 수 있다.MAMapView의 rotateCameraEnabled 속성에서 기울기 제스처를 비활성화하거나 활성화합니다.경사 각도 범위는 [0.f, 45f]이며,MAMAPView의 setCameraDegree 방법을 사용하여 지도의 경사 각도를 설정합니다.
4. 지도 캡처
iOS SDK는 선택한 스크린맵 영역(CGRect)을 캡처할 수 있습니다. 캡처한 내용은 지도, 맵 덮어쓰기, 팝업 기포입니다.MAMapView에서 TakeSnapshotInRect 방법을 사용하여 UIImage 객체를 반환하는 캡처합니다.
: , : , 。
5. 오프라인 맵(3D)
이 기능은 사용자에게 와이파이 방식으로 오프라인 지도 데이터를 다운로드하고 오프라인 지도 데이터는 MAOfflineItem 단위로 다운로드한다.오프라인 데이터 항목인 MAOffline Item은 도시 인코딩, 도시 이름, 데이터 상태 등 오프라인 지도 데이터 패키지의 기본 정보를 포함하고 오프라인 데이터 절약 정보(MAOffline Province)와 오프라인 데이터 도시 정보(MAOffline City)의 기본 유형이다.오프라인 데이터 도시 정보(MAOfflineCity)는 세 개의 하위 클래스를 파생시킨다.
5.1 오프라인 데이터 항목 가져오기
코드 예:
- (void)setupCities {
self.sectionTitles = @[@" ", @" ", @" "];
self.cities = [MAOfflineMap sharedOfflineMap].cities;//
self.provinces = [MAOfflineMap sharedOfflineMap].provinces;//
self.municipalities = [MAOfflineMap sharedOfflineMap].municipalities;//
}
- (MAOfflineItem *)itemForIndexPath:(NSIndexPath *)indexPath {
MAOfflineItem *item = nil;
switch (indexPath.section) {
case 0:{
item = [MAOfflineMap sharedOfflineMap].nationWide;//
break;
} case 1:{
item = self.municipalities[indexPath.row];//
break;
} case 2:{
item = nil;
break;
} default:{
MAOfflineProvince *pro = self.provinces[indexPath.section - self.sectionTitles.count];
if (indexPath.row == 0) {
item = pro; //
} else {
item = pro.cities[indexPath.row - 1]; //
}
break;
}
}
return item;
}
5.2 오프라인 맵 데이터 항목 다운로드(MAOfflineItem 매개변수)
코드 예:
- (void)download:(MAOfflineItem *)item
{
if (item == nil || item.itemStatus == MAOfflineItemStatusInstalled)
{
return;
}
NSLog(@"download :%@", item.name);
[[MAOfflineMap sharedOfflineMap] downloadItem:item shouldContinueWhenAppEntersBackground:YES downloadBlock:^(MAOfflineMapDownloadStatus downloadStatus, id info) {
/* Manipulations to your application’s user interface must occur on the main thread. */
dispatch_async(dispatch_get_main_queue(), ^{
if (downloadStatus == MAOfflineMapDownloadStatusWaiting)
{
NSLog(@" : %@", @" ");
}
else if(downloadStatus == MAOfflineMapDownloadStatusStart)
{
NSLog(@" : %@", @" ");
}
else if(downloadStatus == MAOfflineMapDownloadStatusProgress)
{
NSLog(@" : %@", @" ");
}
else if(downloadStatus == MAOfflineMapDownloadStatusCancelled) {
NSLog(@" : %@", @" ");
}
else if(downloadStatus == MAOfflineMapDownloadStatusCompleted) {
NSLog(@" : %@", @" ");
}
else if(downloadStatus == MAOfflineMapDownloadStatusUnzip) {
NSLog(@" : %@", @" , ");
}
else if(downloadStatus == MAOfflineMapDownloadStatusError) {
NSLog(@" : %@", @" ");
}
else if(downloadStatus == MAOfflineMapDownloadStatusFinished) {
NSLog(@" : %@", @" ");
[self.mapView reloadMap]; //
}
});
}];
}
5.3 오프라인 데이터 항목 일시 중지(MAOfflineItem 매개변수)
코드 예:
- (void)pause:(MAOfflineItem *)item {
NSLog(@"pause :%@", item.name);
[[MAOfflineMap sharedOfflineMap] pauseItem:item];
// :
[[MAOfflineMap sharedOfflineMap] cancelAll];
}
6. 실내외 올인원(3D)
백화점, 기차역, 공항 등 대형 실내 건물을 지원하는 실내외 일체화 지도.층 컨트롤을 통해 실내 대응 층을 자유롭게 전환하고 실내 정밀화 지도를 표시할 수 있습니다.MAMapView 클래스의 showsIndoorMap 인터페이스를 통해 실내 지도를 표시할지 여부를 설정합니다. 기본 상태는 다음과 같습니다:mapView.showsIndoorMap = YES;
실내 지도 표시를 켜면 대리 방법을 통해 실내 지도의 층수 변화를 얻을 수 있습니다. 예시 코드:
/**
*
* @param mapView View
* @param indoorBuilding
*/
- (void)mapview:(MAMapView *)mapView didIndoorBuildingValueChanged:(MAIndoorBuilding *)indoorBuilding
{
MAIndoorBuilding *indoorInfo = indoorBuilding;
NSLog(@"floorName = %@",indoorBuilding.floorName); //
NSLog(@"floor = %d",indoorBuilding.floor); //
NSLog(@"buildingName = %@",indoorBuilding.buildingName); // ( )
NSLog(@"poiID = %@",indoorBuilding.poiID); // ID
NSLog(@"numberOfFloor = %d",indoorBuilding.numberOfFloor);//
}