RMMarkerManager.m
3.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
//
// RMMarkerManager.m
// MapView
//
// Created by olivier on 11/5/08.
// Copyright 2008 NA. All rights reserved.
//
#import "RMMarkerManager.h"
#import "RMMercatorToScreenProjection.h"
#import "RMProjection.h"
@implementation RMMarkerManager
@synthesize contents;
- (id)initWithContents:(RMMapContents *)mapContents
{
if (![super init])
return nil;
contents = mapContents;
return self;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark
#pragma mark Adding / Removing / Displaying Markers
- (void) addMarker: (RMMarker*)marker
{
[[contents overlay] addSublayer:marker];
}
- (void) addMarker: (RMMarker*)marker AtLatLong:(CLLocationCoordinate2D)point
{
[marker setLocation:[[contents projection]latLongToPoint:point]];
[self addMarker: marker];
}
- (void) addDefaultMarkerAt: (CLLocationCoordinate2D)point
{
RMMarker *marker = [[RMMarker alloc] initWithKey:RMMarkerRedKey];
[self addMarker:marker AtLatLong:point];
[marker release];
}
- (void) removeMarkers
{
[[contents overlay] setSublayers:[NSArray arrayWithObjects:nil]];
}
- (void) hideAllMarkers
{
[[contents overlay] setHidden:YES];
}
- (void) unhideAllMarkers
{
[[contents overlay] setHidden:NO];
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark
#pragma mark Marker information
- (NSArray *)getMarkers
{
return [[contents overlay] sublayers];
}
- (void) removeMarker:(RMMarker *)marker
{
[marker removeFromSuperlayer];
}
- (CGPoint) getMarkerScreenCoordinate: (RMMarker *)marker
{
return [[contents mercatorToScreenProjection] projectXYPoint:[marker location]];
}
- (CLLocationCoordinate2D) getMarkerCoordinate2D: (RMMarker *) marker
{
return [contents pixelToLatLong:[self getMarkerScreenCoordinate:marker]];
}
- (NSArray *) getMarkersForScreenBounds
{
NSMutableArray *markersInScreenBounds = [NSMutableArray array];
CGRect rect = [[contents mercatorToScreenProjection] screenBounds];
for (RMMarker *marker in [self getMarkers]) {
if ([self isMarker:marker withinBounds:rect]) {
[markersInScreenBounds addObject:marker];
}
}
return markersInScreenBounds;
}
- (BOOL) isMarkerWithinScreenBounds:(RMMarker*)marker
{
return [self isMarker:marker withinBounds:[[contents mercatorToScreenProjection] screenBounds]];
}
- (BOOL) isMarker:(RMMarker*)marker withinBounds:(CGRect)rect
{
if (![self managingMarker:marker]) {
return NO;
}
CGPoint markerCoord = [self getMarkerScreenCoordinate:marker];
if ( markerCoord.x > rect.origin.x
&& markerCoord.x < rect.origin.x + rect.size.width
&& markerCoord.y > rect.origin.y
&& markerCoord.y < rect.origin.y + rect.size.height)
{
return YES;
}
return NO;
}
- (BOOL) managingMarker:(RMMarker*)marker
{
if (marker != nil && [[self getMarkers] indexOfObject:marker] != NSNotFound) {
return YES;
}
return NO;
}
- (void) moveMarker:(RMMarker *)marker AtLatLon:(RMLatLong)point
{
[marker setLocation:[[contents projection]latLongToPoint:point]];
[marker setPosition:[[contents mercatorToScreenProjection] projectXYPoint:[[contents projection] latLongToPoint:point]]];
}
- (void) moveMarker:(RMMarker *)marker AtXY:(CGPoint)point
{
[marker setLocation:[[contents mercatorToScreenProjection] projectScreenPointToXY:point]];
[marker setPosition:point];
}
@end