Подгонка карты к объектам в мобильном 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];
}
Другие вопросы по тегам