Подгонка карты к объектам в мобильном SDK Carto
У меня есть массив NTVectorElements, как мне установить границы карты, чтобы она соответствовала каждому элементу на экране? Я вижу функцию moveToFitBounds, но я не уверен, как это реализовать. У вас есть пример?
1 ответ
Я имел дело с этой проблемой раньше. Выяснить это не было тривиальной задачей, но я могу привести пример фрагмента, который решает эту проблему.
Вы должны предоставить границы экрана, а также границы карты, то есть минимальное и максимальное положение, необходимое для рисования ограничивающего прямоугольника.
NTVectorElements: нет способа немедленно получить границы объекта, вам нужно пройти через все элементы в массиве, чтобы найти глобальный максимум и минимум их геометрии
Вот фрагмент кода, чтобы подогнать карту к загруженным в данный момент сайтам, вам нужно всего лишь несколько изменений, чтобы она соответствовала вашему варианту использования:
-(void)fitMapToCurrentlyLoadedSites {
int siteCount = (int)[_sitesOrderArray count];
if (siteCount > 0) {
if (siteCount == 1) {
//zoom in on single site
GenericMapMarker *siteMarker = [_sitesOrderArray objectAtIndex:0];
NTMapPos *sitePosition = [CommonFunctions getMapPosFromCoordinate:_ntMapView coordinate:siteMarker.coordinate];
[_ntMapView setFocusPos:sitePosition durationSeconds:0];
[_ntMapView setZoom:15.0 durationSeconds:0];
} else {
//create vector of multiple sites
NTMapPosVector* posVector = [[NTMapPosVector alloc] init];
for (int i = 0; i < siteCount; i++) {
GenericMapMarker *siteMarker = [_sitesOrderArray objectAtIndex:i];
//get mapPos from coordinate
NTMapPos *mapPos = [CommonFunctions getMapPosFromCoordinate:_ntMapView coordinate:siteMarker.coordinate];
[posVector add:mapPos];
}
//create envelope of vectors
NTMapEnvelope *envelope = [[NTMapEnvelope alloc] initWithConvexHull:posVector];
//get mapBounds of envelope
NTMapBounds *bounds = [envelope getBounds];
[_ntMapView moveToFitBounds:bounds screenBounds:[self findScreenBounds] integerZoom:TRUE durationSeconds:1.0f];
}
}
}
И найти границы экрана:
-(NTScreenBounds *)findScreenBounds {
float screenWidth = self.view.frame.size.width;
float screenHeight = self.view.frame.size.height;
NTScreenPos *minScreenPos = [[NTScreenPos alloc] initWithX:0.0 y:0.0];
NTScreenPos *maxScreenPos = [[NTScreenPos alloc] initWithX:screenWidth y:screenHeight];
return [[NTScreenBounds alloc] initWithMin:minScreenPos max:maxScreenPos];
}