Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit 25635a5

Browse files
committed
[ios,macos] Add MGLLocationCoordinate2DFromPoint
1 parent 26b2c70 commit 25635a5

File tree

4 files changed

+67
-54
lines changed

4 files changed

+67
-54
lines changed

platform/darwin/src/MGLGeometry_Private.h

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ NS_INLINE mbgl::Point<double> MGLPointFromLocationCoordinate2D(CLLocationCoordin
1818
return mbgl::Point<double>(coordinate.longitude, coordinate.latitude);
1919
}
2020

21+
NS_INLINE CLLocationCoordinate2D MGLLocationCoordinate2DFromPoint(mbgl::Point<double> point) {
22+
return CLLocationCoordinate2DMake(point.y, point.x);
23+
}
24+
2125
NS_INLINE CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) {
2226
return CLLocationCoordinate2DMake(latLng.latitude(), latLng.longitude());
2327
}

platform/darwin/src/MGLPolygon.mm

+8-17
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,9 @@ - (NSUInteger)hash {
5656
}
5757

5858
- (CLLocationCoordinate2D)coordinate {
59-
CLLocationCoordinate2D centroid;
60-
6159
// pole of inaccessibility
6260
auto poi = mapbox::polylabel([self polygon]);
63-
centroid.latitude = poi.y;
64-
centroid.longitude = poi.x;
61+
CLLocationCoordinate2D centroid = MGLLocationCoordinate2DFromPoint(poi);
6562

6663
return centroid;
6764
}
@@ -168,26 +165,16 @@ - (NSUInteger)hash {
168165
}
169166

170167
- (CLLocationCoordinate2D)coordinate {
171-
CLLocationCoordinate2D centroid;
168+
MGLPolygon *firstPolygon = self.polygons.firstObject;
172169

173-
mbgl::Polygon<double> geometry;
174-
for (MGLPolygon *polygon in self.polygons) {
175-
geometry.push_back(polygon.ring);
176-
}
177-
178-
// pole of inaccessibility
179-
auto poi = mapbox::polylabel(geometry);
180-
centroid.latitude = poi.y;
181-
centroid.longitude = poi.x;
182-
183-
return centroid;
170+
return firstPolygon.coordinate;
184171
}
185172

186173
- (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds {
187174
return MGLCoordinateBoundsIntersectsCoordinateBounds(_overlayBounds, overlayBounds);
188175
}
189176

190-
- (mbgl::Geometry<double>)geometryObject {
177+
- (mbgl::MultiPolygon<double>)multiPolygon {
191178
mbgl::MultiPolygon<double> multiPolygon;
192179
multiPolygon.reserve(self.polygons.count);
193180
for (MGLPolygon *polygon in self.polygons) {
@@ -201,6 +188,10 @@ - (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds {
201188
return multiPolygon;
202189
}
203190

191+
- (mbgl::Geometry<double>)geometryObject {
192+
return [self multiPolygon];
193+
}
194+
204195
- (NSDictionary *)geoJSONDictionary {
205196
NSMutableArray *coordinates = [[NSMutableArray alloc] initWithCapacity:self.polygons.count];
206197
for (MGLPolygonFeature *feature in self.polygons) {

platform/darwin/src/MGLPolyline.mm

+10-21
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,12 @@ - (BOOL)isEqual:(id)other {
5454
}
5555

5656
- (CLLocationCoordinate2D)coordinate {
57-
CLLocationCoordinate2D centroid;
58-
59-
mbgl::Polygon<double> multiLineString;
60-
multiLineString.push_back([self lineString]);
57+
mbgl::Polygon<double> polyline;
58+
polyline.push_back([self lineString]);
6159

6260
// pole of inaccessibility
63-
auto poi = mapbox::polylabel(multiLineString);
64-
centroid.latitude = poi.y;
65-
centroid.longitude = poi.x;
61+
auto poi = mapbox::polylabel(polyline);
62+
CLLocationCoordinate2D centroid = MGLLocationCoordinate2DFromPoint(poi);
6663

6764
return centroid;
6865
}
@@ -130,20 +127,12 @@ - (NSUInteger)hash {
130127
}
131128

132129
- (CLLocationCoordinate2D)coordinate {
133-
CLLocationCoordinate2D centroid;
134-
135-
mbgl::Polygon<double> multiLineString;
136-
multiLineString.reserve(self.polylines.count);
137-
for (MGLPolyline *polyline in self.polylines) {
138-
multiLineString.push_back([polyline lineString]);
139-
}
140-
141-
// pole of inaccessibility
142-
auto poi = mapbox::polylabel(multiLineString);
143-
centroid.latitude = poi.y;
144-
centroid.longitude = poi.x;
145-
146-
return centroid;
130+
MGLPolyline *polyline = self.polylines.firstObject;
131+
CLLocationCoordinate2D *coordinates = polyline.coordinates;
132+
NSAssert([polyline pointCount] > 0, @"Polyline must have coordinates");
133+
CLLocationCoordinate2D firstCoordinate = coordinates[0];
134+
135+
return firstCoordinate;
147136
}
148137

149138
- (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds {

platform/darwin/test/MGLCodingTests.m

+45-16
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,12 @@ - (void)testPolyline {
7272
CLLocationCoordinate2DMake(101.0, 0.0),
7373
};
7474

75-
NSUInteger lnc = sizeof(lineCoordinates) / sizeof(CLLocationCoordinate2D);
76-
MGLPolyline *line = [MGLPolyline polylineWithCoordinates:lineCoordinates count:lnc];
75+
NSUInteger lineCoordinatesCount = sizeof(lineCoordinates) / sizeof(CLLocationCoordinate2D);
76+
MGLPolyline *line = [MGLPolyline polylineWithCoordinates:lineCoordinates count:lineCoordinatesCount];
7777
CLLocationCoordinate2D lineCenter = CLLocationCoordinate2DMake(100.0, 0.0);
7878

79-
XCTAssert([line coordinate].latitude == lineCenter.latitude &&
80-
[line coordinate].longitude == lineCenter.longitude);
79+
XCTAssertEqual([line coordinate].latitude, lineCenter.latitude);
80+
XCTAssertEqual([line coordinate].longitude, lineCenter.longitude);
8181

8282
}
8383

@@ -110,12 +110,12 @@ - (void)testPolygon {
110110
CLLocationCoordinate2DMake(100.0, 1.0),
111111
};
112112

113-
NSUInteger snc = sizeof(squareCoordinates) / sizeof(CLLocationCoordinate2D);
114-
MGLPolygon *squarePolygon = [MGLPolygon polygonWithCoordinates:squareCoordinates count:snc];
113+
NSUInteger squareCoordinatesCount = sizeof(squareCoordinates) / sizeof(CLLocationCoordinate2D);
114+
MGLPolygon *squarePolygon = [MGLPolygon polygonWithCoordinates:squareCoordinates count:squareCoordinatesCount];
115115
CLLocationCoordinate2D squareCenter = CLLocationCoordinate2DMake(100.5, 0.5);
116116

117-
XCTAssert([squarePolygon coordinate].latitude == squareCenter.latitude &&
118-
[squarePolygon coordinate].longitude == squareCenter.longitude);
117+
XCTAssertEqual([squarePolygon coordinate].latitude, squareCenter.latitude);
118+
XCTAssertEqual([squarePolygon coordinate].longitude, squareCenter.longitude);
119119

120120
}
121121

@@ -200,6 +200,11 @@ - (void)testPointCollection {
200200
NSUInteger numberOfCoordinates = sizeof(coordinates) / sizeof(CLLocationCoordinate2D);
201201

202202
MGLPointCollection *pointCollection = [MGLPointCollection pointCollectionWithCoordinates:coordinates count:numberOfCoordinates];
203+
CLLocationCoordinate2D pointsCenter = CLLocationCoordinate2DMake(0, 1);
204+
205+
XCTAssertEqual([pointCollection coordinate].latitude, pointsCenter.latitude);
206+
XCTAssertEqual([pointCollection coordinate].longitude, pointsCenter.longitude);
207+
203208
NSString *filePath = [self temporaryFilePathForClass:[MGLPointCollection class]];
204209
[NSKeyedArchiver archiveRootObject:pointCollection toFile:filePath];
205210

@@ -249,6 +254,30 @@ - (void)testMultiPolyline {
249254
CLLocationCoordinate2DMake(20, 21),
250255
CLLocationCoordinate2DMake(30, 31),
251256
};
257+
258+
CLLocationCoordinate2D line1[] = {
259+
CLLocationCoordinate2DMake(100, 40),
260+
CLLocationCoordinate2DMake(105, 45),
261+
CLLocationCoordinate2DMake(110, 55)
262+
};
263+
264+
CLLocationCoordinate2D line2[] = {
265+
CLLocationCoordinate2DMake(105, 40),
266+
CLLocationCoordinate2DMake(110, 45),
267+
CLLocationCoordinate2DMake(115, 55)
268+
};
269+
270+
NSUInteger road1CoordinatesCount = sizeof(line1) / sizeof(CLLocationCoordinate2D);
271+
NSUInteger road2CoordinatesCount = sizeof(line2) / sizeof(CLLocationCoordinate2D);
272+
273+
MGLPolyline *road1Polyline = [MGLPolyline polylineWithCoordinates:line1 count:road1CoordinatesCount];
274+
MGLPolyline *road2Polyline = [MGLPolyline polylineWithCoordinates:line1 count:road2CoordinatesCount];
275+
276+
MGLMultiPolyline *roads = [MGLMultiPolyline multiPolylineWithPolylines:@[road1Polyline, road2Polyline]];
277+
CLLocationCoordinate2D roadCenter = CLLocationCoordinate2DMake(100, 40);
278+
279+
XCTAssertEqual([roads coordinate].latitude, roadCenter.latitude);
280+
XCTAssertEqual([roads coordinate].longitude, roadCenter.longitude);
252281

253282
NSUInteger numberOfCoordinates = sizeof(coordinates) / sizeof(CLLocationCoordinate2D);
254283

@@ -280,7 +309,7 @@ - (void)testMultiPolygon {
280309
CLLocationCoordinate2DMake(30, 31),
281310
};
282311

283-
CLLocationCoordinate2D outterSquare[] = {
312+
CLLocationCoordinate2D outerSquare[] = {
284313
CLLocationCoordinate2DMake(100.0, 0.0),
285314
CLLocationCoordinate2DMake(101.0, 0.0),
286315
CLLocationCoordinate2DMake(101.0, 1.0),
@@ -294,16 +323,16 @@ - (void)testMultiPolygon {
294323
CLLocationCoordinate2DMake(100.35, 0.65),
295324
};
296325

297-
NSUInteger noc = sizeof(outterSquare) / sizeof(CLLocationCoordinate2D);
298-
NSUInteger nic = sizeof(innerSquare) / sizeof(CLLocationCoordinate2D);
326+
NSUInteger outerCoordinatesCount = sizeof(outerSquare) / sizeof(CLLocationCoordinate2D);
327+
NSUInteger innerCoordinatesCount = sizeof(innerSquare) / sizeof(CLLocationCoordinate2D);
299328

300-
MGLPolygon *outterPolygonSquare = [MGLPolygon polygonWithCoordinates:outterSquare count:noc];
301-
MGLPolygon *innerPolygonSquare = [MGLPolygon polygonWithCoordinates:innerSquare count:nic];
302-
MGLMultiPolygon *squares = [MGLMultiPolygon multiPolygonWithPolygons:@[outterPolygonSquare, innerPolygonSquare]];
329+
MGLPolygon *innerPolygonSquare = [MGLPolygon polygonWithCoordinates:innerSquare count:innerCoordinatesCount];
330+
MGLPolygon *outerPolygonSquare = [MGLPolygon polygonWithCoordinates:outerSquare count:outerCoordinatesCount interiorPolygons:@[innerPolygonSquare]];
331+
MGLMultiPolygon *squares = [MGLMultiPolygon multiPolygonWithPolygons:@[outerPolygonSquare, innerPolygonSquare]];
303332
CLLocationCoordinate2D squareCenter = CLLocationCoordinate2DMake(100.5, 0.5);
304333

305-
XCTAssert([squares coordinate].latitude == squareCenter.latitude &&
306-
[squares coordinate].longitude == squareCenter.longitude);
334+
XCTAssertEqual([squares coordinate].latitude, squareCenter.latitude);
335+
XCTAssertEqual([squares coordinate].longitude, squareCenter.longitude);
307336

308337
NSUInteger numberOfCoordinates = sizeof(coordinates) / sizeof(CLLocationCoordinate2D);
309338

0 commit comments

Comments
 (0)