একবারে একাধিক টীকা দেখানোর জন্য এমকেম্যাপভিউ স্থিতি করা হচ্ছে


94

আমি আমার এমকেম্যাপভিউতে যোগ করতে চাই বেশ কয়েকটি টিকা পেয়েছি (এটি 0-n আইটেম পারে, যেখানে এন সাধারণত 5 এর কাছাকাছি থাকে)। আমি টীকাগুলি সূক্ষ্মভাবে যুক্ত করতে পারি, তবে সমস্ত টিকা অনস্ক্রিনে একবারে ফিট করার জন্য আমি মানচিত্রটির আকার পরিবর্তন করতে চাই এবং এটি কীভাবে করবেন তা সম্পর্কে আমি নিশ্চিত নই।

আমি তাকিয়ে ছিলাম -regionThatFits:তবে আমি এটির সাথে কী করব তা পুরোপুরি নিশ্চিত নই। আমি এখন পর্যন্ত কী পেয়েছি তা দেখানোর জন্য কিছু কোড পোস্ট করব। আমি মনে করি এটি সাধারণভাবে সোজা কাজ হওয়া উচিত তবে আমি এ পর্যন্ত ম্যাপকিটটিতে কিছুটা অভিভূত বোধ করছি।

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

location = newLocation.coordinate;
//One location is obtained.. just zoom to that location

MKCoordinateRegion region;
region.center = location;

//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = 0.015;
span.longitudeDelta = 0.015;
region.span = span;
// Set the region here... but I want this to be a dynamic size
// Obviously this should be set after I've added my annotations
[mapView setRegion:region animated:YES];

// Test data, using these as annotations for now
NSArray *arr = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil];
float ex = 0.01;
for (NSString *s in arr) {
    JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];
    [mapView addAnnotation:placemark];
    ex = ex + 0.005;
}
    // What do I do here?
    [mapView setRegion:[mapView regionThatFits:region] animated:YES];
}

লক্ষ্য করুন, আমি একটি অবস্থান আপডেট পাওয়ার সাথে সাথে এই সমস্ত ঘটে ... এটি করার উপযুক্ত স্থান কিনা তা আমি জানি না। তা না হলে এর চেয়ে ভাল জায়গা আর কোথায় থাকবে?-viewDidLoad?

আগাম ধন্যবাদ.

উত্তর:



137

লিংক জিম পোস্ট করেছে এখন মৃত, কিন্তু আমি কোড খুঁজে পেতে সক্ষম ছিল (যা আমি বুকমার্ক কোথাও ছিল)। আশাকরি এটা সাহায্য করবে.

- (void)zoomToFitMapAnnotations:(MKMapView *)mapView { 
    if ([mapView.annotations count] == 0) return; 

    CLLocationCoordinate2D topLeftCoord; 
    topLeftCoord.latitude = -90; 
    topLeftCoord.longitude = 180; 

    CLLocationCoordinate2D bottomRightCoord; 
    bottomRightCoord.latitude = 90; 
    bottomRightCoord.longitude = -180; 

    for(id<MKAnnotation> annotation in mapView.annotations) { 
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude); 
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude); 
        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude); 
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude); 
    } 

    MKCoordinateRegion region; 
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5; 
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;      

    // Add a little extra space on the sides
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; 

    region = [mapView regionThatFits:region]; 
    [mapView setRegion:region animated:YES]; 
}

14
আমি তোমাকে চুমু খেতে পারি এটি আমার বেশিরভাগ সময় সাশ্রয় করেছে। আমি 1 অবস্থানটি পরিচালনা করতে উপরের কোডটিতে যুক্ত করেছি। এটি কিছুটা কাছাকাছি এবং ব্যক্তিগত হয়ে উঠেছে। আমি প্রতিক্রিয়া হিসাবে পোস্ট করব যেহেতু মন্তব্যে কোড চিবানো।
মাইকেল রিড

আপনাকে অনেক ধন্যবাদ. আমি এটির একটি সাবক্লাসে যুক্ত করেছি MKMapViewএবং পদ্ধতিটি পরিবর্তিত করেছি - (void) zoomToFitAnnotations:(BOOL)animated। পুরোপুরি কাজ করে!
সিমোনবস

4
এটা খুব ভাল কাজ করছে। এছাড়াও এটি দরকারী। আপনি জুম আউট বা মান জুম পরিবর্তন করতে পারেন। সুতরাং অঞ্চল.স্প্যান.লিটটিডডেল্টা = কল্পবিজ্ঞান (শীর্ষলিফটকর্ডার.লিটটিউড - নীচেআরাইটকর্ডার.লিটটিউড) * 1.1; /// পরিবর্তন মান। যখন আপনি মান বৃদ্ধি করবেন: জুম আউট ........ যখন আপনি মান হ্রাস করবেন: উদাহরণস্বরূপ অঞ্চল: স্প্যান.লিটটিডডেল্টা = কড়া (টপ লেফটকর্ডার.লিটটিউড - নীচে রাইটকর্ড.লিটটিউড) * ৪.১;
এরহান ডেমিরসি

4
@ মিঃ মোস্তফা: এটি কার্যকর, দুর্দান্ত! তবে আমি মনে করি না যে সমস্যার সমাধান যথেষ্ট। সুতরাং দয়া করে কেউ আমাকে ব্যাখ্যা করুন এটি কীভাবে কাজ করে। বা কোনও লিঙ্কের মাধ্যমে। আমি নির্বোধ যদি দুঃখিত, আমি একটি শিক্ষানবিস। প্লাস সমর্থন। আপনাকে ধন্যবাদ
সিদ্ধার্থ শিলাবৃষ্টি

4
@ মুস্তফা ... ধন্যবাদ এটি আমার দিনটি বাঁচিয়েছে।
Vvk

133

এত জটিল কেন?

MKCoordinateRegion coordinateRegionForCoordinates(CLLocationCoordinate2D *coords, NSUInteger coordCount) {
    MKMapRect r = MKMapRectNull;
    for (NSUInteger i=0; i < coordCount; ++i) {
        MKMapPoint p = MKMapPointForCoordinate(coords[i]);
        r = MKMapRectUnion(r, MKMapRectMake(p.x, p.y, 0, 0));
    }
    return MKCoordinateRegionForMapRect(r);
}

6
পোস্টের বিকল্পগুলির চেয়ে এটি কতটা সহজ, পরিষ্কার এবং সহজ এটি অবিশ্বাস্য। প্রকৃতপক্ষে, আপনি এটিকে আরও সহজ করতে পারেন কারণ এমকেকর্ডিনেটরিজিয়নে রূপান্তর করার প্রয়োজন নেই - কেবল সেটভিজিবল্যাপ্রেট কল করুন: আপনি এখানে তৈরি এমকেম্যাপরেট দিয়ে আপনার এমকেম্যাপভিউতে।
লেন্সভেট

4
টীকাগুলি কখনও কখনও মানচিত্রের শীর্ষে আটকে থাকে এবং দৃশ্যমান হয় না। এমকেকর্ডিনেটরিজেশন তৈরি হওয়ার পরে জুম বাড়ানোর সর্বোত্তম পদ্ধতির কোনও ইনপুট?
কাইল সি

4
@ কাইলি[mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f) animated:animated];
ব্যবহারকারী 21

আপনি CLLocationCoordinate2D *coordsঅ্যারে কিভাবে তৈরি করবেন ? ব্যবহার করছেন malloc()?
হ্লুং

4
@ কাইলসি। ফিরে আসার আগে আমি এটি যুক্ত করেছিলাম rযা মূলত 20 শতাংশ জুম আউট করেCGFloat zoomOutPercent = 0.2f; r = MKMapRectMake(r.origin.x-r.size.width*zoomOutPercent, r.origin.y-r.size.height*zoomOutPercent, r.size.width*(1+zoomOutPercent*2), r.size.height*(1+zoomOutPercent*2));
লুজি

45

আমি জুম আউট (বা ইন) একটি পয়েন্ট টীকা এবং বর্তমান অবস্থান অন্তর্ভুক্ত এর সাথে কিছু করার জন্য কিছু করতে পেরেছি। আপনি আপনার টিকাশ দ্বারা লুপ করে এটিকে প্রসারিত করতে পারেন।

প্রাথমিক পদক্ষেপগুলি হ'ল:

  • মিনিট ল্যাট / লম্ব গণনা করুন
  • সর্বোচ্চ ল্যাট / লম্ব গণনা করুন
  • এই দুটি পয়েন্টের জন্য CLLocation অবজেক্ট তৈরি করুন
  • পয়েন্টগুলির মধ্যে দূরত্ব গণনা করুন
  • বিন্দু এবং দূরত্বকে ডিগ্রীতে রূপান্তর করে কেন্দ্র বিন্দু ব্যবহার করে অঞ্চল তৈরি করুন
  • সামঞ্জস্য করতে অঞ্চল ম্যাপভিউতে পাস করুন
  • মানচিত্রের অঞ্চল সেট করতে সমন্বিত অঞ্চল ব্যবহার করুন Use
    -(IBAction)zoomOut:(id)sender {

        CLLocationCoordinate2D southWest = _newLocation.coordinate;
        CLLocationCoordinate2D northEast = southWest;

        southWest.latitude = MIN(southWest.latitude, _annotation.coordinate.latitude);
        southWest.longitude = MIN(southWest.longitude, _annotation.coordinate.longitude);

        northEast.latitude = MAX(northEast.latitude, _annotation.coordinate.latitude);
        northEast.longitude = MAX(northEast.longitude, _annotation.coordinate.longitude);

        CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude];
        CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude];

        // This is a diag distance (if you wanted tighter you could do NE-NW or NE-SE)
        CLLocationDistance meters = [locSouthWest getDistanceFrom:locNorthEast];

        MKCoordinateRegion region;
        region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0;
        region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0;
        region.span.latitudeDelta = meters / 111319.5;
        region.span.longitudeDelta = 0.0;

        _savedRegion = [_mapView regionThatFits:region];
        [_mapView setRegion:_savedRegion animated:YES];

        [locSouthWest release];
        [locNorthEast release];
    }

এটি দেখতে যাওয়ার মতো মনে হচ্ছে। ধন্যবাদ!
jbrennan

4
এটি ব্যবহার করে এটির কাজ পেতে পরিচালিত MKCoordinateRegionMake: gist.github.com/1599700 যদি কেউ এখনও এইভাবে এটি করতে চান তবে।
চকৃত

অঞ্চল.সেন্টার.লিটটিউড = (দক্ষিণপশ্চিম.লিটটিউড + উত্তরইস্ট.লিটটিউড) / ২.০; এর জন্য ধন্যবাদ
টনি

এই মেরিডিয়ান উভয় পক্ষের পয়েন্ট সঙ্গে কাজ করে? বিষুবরেখা?
এলিয়ট

4
এই কোডগুলি লোকেশনগুলিতে অফস্ক্রিন রাখে যখন অবস্থানগুলির একটি সমান ওয়াই-মান থাকে। উদাহরণস্বরূপ, (50, -4) এবং (100, -3) এ দুটি অবস্থান দেখানো ম্যাপটিকে খুব দূরে জুম করবে, স্ক্রিনের বাম এবং ডানদিকে স্থানাঙ্ক স্থাপন করবে।
ব্যবহারকারী

21

আমার একটা আলাদা উত্তর আছে। আমি জুম-টু-ফিট অ্যালগরিদম নিজেকে বাস্তবায়ন করতে যাচ্ছে, কিন্তু আমি মূর্ত অ্যাপল যে আবশ্যক কি আমরা এত কাজ ছাড়া চেয়েছিলেন করতে একটি উপায় আছে। এপিআই ডকো ব্যবহার করে তাড়াতাড়ি দেখানো হয়েছিল যে আমি যা প্রয়োজন তার জন্য এমকেপলিগন ব্যবহার করতে পারি:

/* this simply adds a single pin and zooms in on it nicely */
- (void) zoomToAnnotation:(MapAnnotation*)annotation {
    MKCoordinateSpan span = {0.027, 0.027};
    MKCoordinateRegion region = {[annotation coordinate], span};
    [mapView setRegion:region animated:YES];
}

/* This returns a rectangle bounding all of the pins within the supplied
   array */
- (MKMapRect) getMapRectUsingAnnotations:(NSArray*)theAnnotations {
    MKMapPoint points[[theAnnotations count]];

    for (int i = 0; i < [theAnnotations count]; i++) {
        MapAnnotation *annotation = [theAnnotations objectAtIndex:i];
        points[i] = MKMapPointForCoordinate(annotation.coordinate);
    }

    MKPolygon *poly = [MKPolygon polygonWithPoints:points count:[theAnnotations count]];

    return [poly boundingMapRect];
}

/* this adds the provided annotation to the mapview object, zooming 
   as appropriate */
- (void) addMapAnnotationToMapView:(MapAnnotation*)annotation {
    if ([annotations count] == 1) {
        // If there is only one annotation then zoom into it.
        [self zoomToAnnotation:annotation];
    } else {
        // If there are several, then the default behaviour is to show all of them
        //
        MKCoordinateRegion region = MKCoordinateRegionForMapRect([self getMapRectUsingAnnotations:annotations]);

        if (region.span.latitudeDelta < 0.027) {
            region.span.latitudeDelta = 0.027;
        }

        if (region.span.longitudeDelta < 0.027) {
            region.span.longitudeDelta = 0.027;
        }
        [mapView setRegion:region];
    }

    [mapView addAnnotation:annotation];
    [mapView selectAnnotation:annotation animated:YES];
}

আশাকরি এটা সাহায্য করবে.


কোন সমস্যা নাই. আপনি ইচ্ছুক হলে এবং এটিতে ব্যয় করার জন্য সময় থাকলে সাধারণত আরও ভাল উপায় থাকে।
পিকেসিএলসফট

আমি পিনগুলি পর্দার প্রান্ত থেকে খুব কাছাকাছি রাখে found টীকা যুক্ত করার চেষ্টা করুনআগ্রেশন.স্প্যান.এলটিউশনডেল্টা = টিকাশী রেজিওন.স্প্যান.এলটিটিডেল্টা * কেভেনটম্যাপডেটেলবার্ডারফ্যাক্টর; সেটগ্রেশন এর ঠিক আগে
অ্যাডাম ইবারবাচ

আপনি ঠিক @ অ্যাডামএবারবাচ, তবে মনে হচ্ছে আপনার ক্লিপটিতে একটি ধ্রুবক রয়েছে যা উপলভ্য নয়। আপনি কি এমন কোনও মান খুঁজে পেয়েছেন যা পিনের চারপাশে "সুন্দর" সীমানা সরবরাহ করেছিল?
পিকেসিএলসফট

আইওএস 7 এর সাথে নতুন শোঅনোটেশন পদ্ধতি ব্যবহার করার বিষয়ে নীচে কোড কমান্ডারের উত্তরটি একটি দুর্দান্ত মার্জিন যুক্ত করেছে, যা এই কোডটি শীতল হলেও এটি আরও ভালভাবে কাজ করে।
জেমস টুমি

14

আপনি এটি এইভাবে করতে পারেন ..

// Position the map so that all overlays and annotations are visible on screen.
MKMapRect regionToDisplay = [self mapRectForAnnotations:annotationsToDisplay];
if (!MKMapRectIsNull(regionToDisplay)) myMapView.visibleMapRect = regionToDisplay;

- (MKMapRect) mapRectForAnnotations:(NSArray*)annotationsArray
{
    MKMapRect mapRect = MKMapRectNull;

    //annotations is an array with all the annotations I want to display on the map
    for (id<MKAnnotation> annotation in annotations) { 

        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);

        if (MKMapRectIsNull(mapRect)) 
        {
            mapRect = pointRect;
        } else 
        {
            mapRect = MKMapRectUnion(mapRect, pointRect);
        }
    }

     return mapRect;
}

13

প্রত্যেকের তথ্য এবং পরামর্শের ভিত্তিতে আমি নিম্নলিখিতটি নিয়ে এসেছি। অবদানের জন্য এই আলোচনার জন্য প্রত্যেককে ধন্যবাদ :) এটি মানচিত্রের ভিউতে থাকা নিয়ামক দর্শনে যাবে।

- (void)zoomToFitMapAnnotations { 

if ([self.mapView.annotations count] == 0) return; 

int i = 0;
MKMapPoint points[[self.mapView.annotations count]];

//build array of annotation points
for (id<MKAnnotation> annotation in [self.mapView annotations])
        points[i++] = MKMapPointForCoordinate(annotation.coordinate);

MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i];

[self.mapView setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect]) animated:YES]; 
}

এটি আরও ভোট পেতে হবে। খুব সুনির্দিষ্ট এবং বিন্দু।
নাতাশা

6

সুইফট, একটি বহুভুজ এবং কিছু অতিরিক্ত প্যাডিং ব্যবহার করে আমি নিম্নলিখিতটি ব্যবহার করেছি:

func zoomToFit() {
    var allLocations:[CLLocationCoordinate2D] = [
        CLLocationCoordinate2D(latitude: 32.768805, longitude: -117.167119),
        CLLocationCoordinate2D(latitude: 32.770480, longitude: -117.148385),
        CLLocationCoordinate2D(latitude: 32.869675, longitude: -117.212929)
    ]

    var poly:MKPolygon = MKPolygon(coordinates: &allLocations, count: allLocations.count)

    self.mapView.setVisibleMapRect(poly.boundingMapRect, edgePadding: UIEdgeInsetsMake(40.0, 40.0, 40.0, 40.0), animated: false)
}


setVisibleMapRect (...)। আমি নিজেই গণিতটি করছিলাম ... খারাপভাবে।
কোডেরিপার

5

আমার ক্ষেত্রে, আমি CLLocation অবজেক্ট দিয়ে শুরু করছি এবং তাদের প্রত্যেকের জন্য টীকা তৈরি করছি।
আমার কেবল দুটি টিকাগুলি রাখা দরকার, সুতরাং পয়েন্টগুলির অ্যারে তৈরি করার জন্য আমার কাছে একটি সহজ পদ্ধতি রয়েছে, তবে এটি খুব সহজেই সিএলএলকের একটি সেট দিয়ে একটি নির্বিচার দৈর্ঘ্য সহ একটি অ্যারে তৈরি করতে বাড়ানো যেতে পারে।

এখানে আমার বাস্তবায়ন (এমকেম্যাপপয়েন্টগুলি তৈরি করার প্রয়োজন নেই):

//start with a couple of locations
CLLocation *storeLocation = store.address.location.clLocation;
CLLocation *userLocation = [LBLocationController sharedController].currentLocation;

//build an array of points however you want
CLLocationCoordinate2D points[2] = {storeLocation.coordinate, userLocation.coordinate};

//the magic part
MKPolygon *poly = [MKPolygon polygonWithCoordinates:points count:2];
[self.mapView setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect])];

4

মোস্তফার উত্তরগুলির জন্য এখানে সুইফট সমতুল্য (কনফার্ম ওয়ার্কিং ইন: এক্সকোড 6.1, এসডিকে 8.2) রয়েছে:

func zoomToFitMapAnnotations() {
    if self.annotations.count == 0 {return}

    var topLeftCoordinate = CLLocationCoordinate2D(latitude: -90, longitude: 180)
    var bottomRightCoordinate = CLLocationCoordinate2D(latitude: 90, longitude: -180)

    for object in self.annotations {
        if let annotation = object as? MKAnnotation {
            topLeftCoordinate.longitude = fmin(topLeftCoordinate.longitude, annotation.coordinate.longitude)
            topLeftCoordinate.latitude = fmax(topLeftCoordinate.latitude, annotation.coordinate.latitude)
            bottomRightCoordinate.longitude = fmax(bottomRightCoordinate.longitude, annotation.coordinate.longitude)
            bottomRightCoordinate.latitude = fmin(bottomRightCoordinate.latitude, annotation.coordinate.latitude)
        }
    }

    let center = CLLocationCoordinate2D(latitude: topLeftCoordinate.latitude - (topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 0.5, longitude: topLeftCoordinate.longitude - (topLeftCoordinate.longitude - bottomRightCoordinate.longitude) * 0.5)

    print("\ncenter:\(center.latitude) \(center.longitude)")
    // Add a little extra space on the sides
    let span = MKCoordinateSpanMake(fabs(topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 1.01, fabs(bottomRightCoordinate.longitude - topLeftCoordinate.longitude) * 1.01)
    print("\nspan:\(span.latitudeDelta) \(span.longitudeDelta)")

    var region = MKCoordinateRegion(center: center, span: span)


    region = self.regionThatFits(region)

    self.setRegion(region, animated: true)

}

4
আরে আইওএস_ ডেভেলপার। সুইফ্ট রূপান্তর করার জন্য ধন্যবাদ। আমার জন্য এটি কাজ করছে না কারণ আমি মনে করি আপনি শীর্ষ লেফটকর্ডিনেট.লিটটিউড এবং নীচে রাইটকর্ডিনেট.লংটিচিউডের জন্য "fmin" এর পরিবর্তে দুটি "fmax" মিস করছেন।
ফিলিপ অটো

3

আইওএস 7 এর মতো 'এমকেম্যাপভিউ'তে একটি নতুন পদ্ধতি রয়েছে যা আপনি ব্যবহার করতে পারেন

ঘোষণা

সুইফট

func showAnnotations(_ annotations: [AnyObject]!,
            animated animated: Bool)

উদ্দেশ্য গ

- (void)showAnnotations:(NSArray *)annotations
               animated:(BOOL)animated

পরামিতি

টীকাগুলি যে টীকাগুলি আপনি মানচিত্রে দৃশ্যমান হতে চান। আপনি যদি মানচিত্রের অঞ্চলটি অ্যানিমেটেড করতে চান তবে অ্যানিমেটেড হ্যাঁ বা অ্যানিমেশন ছাড়াই মানচিত্রটি নতুন অঞ্চলটি তত্ক্ষণাত প্রদর্শিত করতে চাইলে না।

আলোচনা

এই পদ্ধতিটি কল করে নতুন মানচিত্রের অঞ্চলটি প্রতিবিম্বিত করতে অঞ্চলের সম্পত্তি এবং সম্ভাব্য অন্যান্য বৈশিষ্ট্যের মান আপডেট হয়।


3

আমি জানি এটি একটি পুরানো প্রশ্ন তবে, আপনি যদি মানচিত্রে আগেই সমস্ত টীকা প্রদর্শন করতে চান তবে এটি ব্যবহার করুন:

 mapView.showAnnotations(mapView.annotations, animated: true)

2

একটি সম্ভাব্য সমাধান হ'ল বর্তমান অবস্থান এবং সমস্ত টীকাগুলির মধ্যে দূরত্ব পরিমাপ করা এবং MKCoordinateRegionMakeWithDistance পদ্ধতিটি এমন একটি অঞ্চলে তৈরি করার জন্য যা সর্বাধিক টীকাটির চেয়ে কিছুটা বেশি দূরত্ব রয়েছে।

এটি অবশ্যই আপনি আরও বেশি টীকা যুক্ত করলে ধীর হয়ে যাবে।


আমি শুধুমাত্র নিজেকে বৈধ করার জন্য মন্তব্য বিভাগের মধ্য দিয়ে যাচ্ছিলাম। খুশি হলাম যে অন্য কেউ আমার মতো করে মনে করে :-) যেহেতু আমি মাত্র দুটি টিকা (শুরু এবং শেষ পয়েন্ট) যুক্ত করি, তাই আমি কোনও আস্তে অনুভব করিনি।
থানডাসুরু

2
- (void)zoomToFitMapAnnotations {

if ([self.mapview.annotations count] == 0) return;

int i = 0;
MKMapPoint points[[self.mapview.annotations count]];

//build array of annotation points
for (id<MKAnnotation> annotation in [self.mapview annotations])
    points[i++] = MKMapPointForCoordinate(annotation.coordinate);

MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i];

[self.mapview setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect]) animated:YES];
}

2

me2(এখন সুইফটে) দ্বারা উত্তরের উত্তরের ভিত্তিতে

func coordinateRegionForCoordinates(coords: [CLLocationCoordinate2D]) -> MKCoordinateRegion {
    var rect: MKMapRect = MKMapRectNull
    for coord in coords {
        let point: MKMapPoint = MKMapPointForCoordinate(coord)
        rect = MKMapRectUnion(rect, MKMapRectMake(point.x, point.y, 0, 0))
    }
    return MKCoordinateRegionForMapRect(rect)
}

1

মুস্তাফার কাউন্ড কোড স্নিপেট যুক্ত করতে 1 অবস্থান- হ্যান্ডেল করার জন্য ক্লজটি কিছুটা যুক্ত করা হয়েছে। এর জন্য ব্যবহৃত পিকেসিএলসফ্টের জুমটো অ্যানোটেশন ফাংশন:

if ([mapView.annotations count] == 1){
    MKCoordinateSpan span = {0.027, 0.027};
    region.span = span;
    CLLocationCoordinate2D singleCoordinate = [[mapView.annotations objectAtIndex:0] coordinate];
    region.center.latitude = singleCoordinate.latitude;
    region.center.longitude = singleCoordinate.longitude;
}
else
{
    // mustufa's code
}

1

এই কোডটি আমার পক্ষে কাজ করে, এটি বর্তমান অবস্থান সহ সমস্ত পিন দেখায়, আশা করি এটি আপনাকে সহায়তা করবে,

func setCenterForMap() {
    var mapRect: MKMapRect = MKMapRectNull
    for loc in mapView.annotations {
        let point: MKMapPoint = MKMapPointForCoordinate(loc.coordinate)
        print( "location is : \(loc.coordinate)");
        mapRect = MKMapRectUnion(mapRect, MKMapRectMake(point.x,point.y,0,0))
    }
    if (locationManager.location != nil) {
        let point: MKMapPoint = MKMapPointForCoordinate(locationManager.location!.coordinate)
        print( "Cur location is : \(locationManager.location!.coordinate)");
        mapRect = MKMapRectUnion(mapRect, MKMapRectMake(point.x,point.y,0,0))
    }

    mapView.setVisibleMapRect(mapRect, edgePadding: UIEdgeInsetsMake(40.0, 40.0, 40.0, 40.0), animated: true)

}

1

স্টাফেন ডি লুসার উত্তরে অতিরিক্ত যুক্ত করা । এখানে আমরা এমকেমেপভিউয়ের সাথে ফিট করার জন্য ব্যবহারকারীর অবস্থান প্লাস কাস্টম টীকা রাখতে পারি

 private func centerViewOnUserLocation() {
    
    if selectedLatitudeFromPreviousVC?.description != nil && selectedLongitudeFromPreviousVC?.description != nil {
        
        if let location = locationManager.location?.coordinate {
            let region = regionFor(coordinates: [
                CLLocationCoordinate2D(latitude: selectedLatitudeFromPreviousVC!, longitude: selectedLongitudeFromPreviousVC!),
                location])
            mkmapView.setRegion(region, animated: true)
        }
    } else {
        if let location = locationManager.location?.coordinate {
            let region = MKCoordinateRegion.init(center: location, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
            mkmapView.setRegion(region, animated: true)
        }
    }
}

private func regionFor(coordinates coords: [CLLocationCoordinate2D]) -> MKCoordinateRegion {
    var r = MKMapRect.null

    for i in 0 ..< coords.count {
        let p = MKMapPoint(coords[i])
        r = r.union(MKMapRect(x: p.x, y: p.y, width: 0, height: 0))
    }

    var coordinateRegion = MKCoordinateRegion(r)
    coordinateRegion.span.latitudeDelta *= 1.5
    coordinateRegion.span.longitudeDelta *= 1.5
    return coordinateRegion
}

এখানে চিত্র বর্ণনা লিখুন


0

আমি আশা করি এটি কমপক্ষে প্রাসঙ্গিক, এটি আমি মনোর (pkclSoft এর উত্তরের ভিত্তিতে) একত্রিত করেছি:

void ZoomMap (MKMapView map)
{
    var annotations = map.Annotations;

    if (annotations == null || annotations.Length == 0) 
        return;

    var points = annotations.OfType<MapAnnotation> ()
                            .Select (s => MKMapPoint.FromCoordinate (s.Coordinate))
                            .ToArray ();            

    map.SetVisibleMapRect(MKPolygon.FromPoints (points).BoundingMapRect, true); 
}

0
CLLocationCoordinate2D min = CLLocationCoordinate2DMake(99999.0, 99999.0);
CLLocationCoordinate2D max = CLLocationCoordinate2DMake(-99999.0, -99999.0);

// find max/min....

// zoom to cover area
// TODO: Maybe better using a MKPolygon which can calculate its own fitting region.
CLLocationCoordinate2D center = CLLocationCoordinate2DMake((max.latitude + min.latitude) / 2.0, (max.longitude + min.longitude) / 2.0);
MKCoordinateSpan span = MKCoordinateSpanMake(max.latitude - min.latitude, max.longitude - min.longitude);
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);

[_mapView setRegion:[_mapView regionThatFits:region] animated:YES];

0

Me2 প্রতিক্রিয়াটির উপর ভিত্তি করে আমি কিছু মার্জিন যুক্ত করতে এবং ব্যবহারকারীর অবস্থানের টীকাগুলি এড়াতে এম কে ম্যাপভিউয়ের জন্য একটি বিভাগ লিখেছিলাম:

@interface MKMapView (ZoomToFitAnnotations)
- (void)zoomToFitAnnotations:(BOOL)animated;
@end

@implementation MKMapView (ZoomToFitAnnotations)
- (void)zoomToFitAnnotations:(BOOL)animated {
    if (self.annotations.count == 0)
        return;

    MKMapRect rect = MKMapRectNull;
    for (id<MKAnnotation> annotation in self.annotations) {
        if ([annotation isKindOfClass:[MKUserLocation class]] == false) {
            MKMapPoint point = MKMapPointForCoordinate(annotation.coordinate);
            rect = MKMapRectUnion(rect, MKMapRectMake(point.x, point.y, 0, 0));
        }
    }

    MKCoordinateRegion region = MKCoordinateRegionForMapRect(rect);
    region.span.longitudeDelta *= 2; // Margin
    region.span.latitudeDelta *= 2; // Margin
    [self setRegion:region animated:animated];
}
@end

0

যেহেতু আমি কোনও উত্তরের বিষয়ে মন্তব্য করতে পারি না, তাই আমি @ বি 2 এর উত্তরে আমার বিট সুবিধাটি যুক্ত করতে চাই (যেহেতু আমি ভেবেছিলাম এটি এখানে সর্বাধিক মার্জিত পন্থা ছিল)।

আমার ব্যক্তিগত প্রকল্পের জন্য আমি কেবলমাত্র একটি সাধারণ সাধারণ ক্রিয়াকলাপের জন্য "দৃশ্যমান অঞ্চল" কার্যকারিতাটি এমপ্যাপুলেট করতে এমকেএম্যাপভিউ ক্লাসে একটি বিভাগ যুক্ত করেছি: এমকেম্যাপভিউ দৃষ্টান্তে বর্তমানে লোড হওয়া সমস্ত টীকাগুলি দেখতে সক্ষম হতে হবে সেটিংস। ফলাফল এটি ছিল:

.h ফাইল

#import <MapKit/MapKit.h>

@interface MKMapView (Extensions)

-(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated;
-(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated;


@end

.m ফাইল

#import "MKMapView+Extensions.h"

@implementation MKMapView (Extensions)

/**
 *  Changes the currently visible portion of the map to a region that best fits all the currently loadded annotations on the map, and it optionally animates the change.
 *
 *  @param animated is the change should be perfomed with an animation.
 */
-(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated
{
    MKMapView * mapView = self;

    NSArray * annotations = mapView.annotations;

    [self ij_setVisibleRectToFitAnnotations:annotations animated:animated];

}


/**
 *  Changes the currently visible portion of the map to a region that best fits the provided annotations array, and it optionally animates the change.
    All elements from the array must conform to the <MKAnnotation> protocol in order to fetch the coordinates to compute the visible region of the map.
 *
 *  @param annotations an array of elements conforming to the <MKAnnotation> protocol, holding the locations for which the visible portion of the map will be set.
 *  @param animated    wether or not the change should be perfomed with an animation.
 */
-(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated
{
    MKMapView * mapView = self;

    MKMapRect r = MKMapRectNull;
    for (id<MKAnnotation> a in annotations) {
        ZAssert([a conformsToProtocol:@protocol(MKAnnotation)], @"ERROR: All elements of the array MUST conform to the MKAnnotation protocol. Element (%@) did not fulfill this requirement", a);
        MKMapPoint p = MKMapPointForCoordinate(a.coordinate);
        //MKMapRectUnion performs the union between 2 rects, returning a bigger rect containing both (or just one if the other is null). here we do it for rects without a size (points)
        r = MKMapRectUnion(r, MKMapRectMake(p.x, p.y, 0, 0));
    }

    [mapView setVisibleMapRect:r animated:animated];

}

@end

আপনি দেখতে পাচ্ছেন, আমি এ পর্যন্ত 2 টি পদ্ধতি যুক্ত করেছি: মানচিত্রের দৃশ্যমান অঞ্চলটি সেট করার জন্য একটি যা এমকেম্যাপভিউ ইভেন্টে বর্তমানে লোড হওয়া টীকাগুলির সাথে মানিয়ে যায় এবং অন্য কোনও পদ্ধতিতে এটি কোনও বস্তুর অ্যারেতে সেট করে। সুতরাং মানচিত্রের দৃশ্যমান অঞ্চল সেট করার জন্য কোডটি তত সহজ হবে:

   //the mapView instance  
    [self.mapView ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:animated]; 

আমি আশা করি এটি সাহায্য করে =)


0

এই সম্প্রসারণ বিবেচনা করুন:

extension MKCoordinateRegion {
    init(locations: [CLLocationCoordinate2D], marginMultiplier: Double = 1.1) {
        let mapRect = locations.reduce(MKMapRect(), {
            let point = MKMapPointForCoordinate($1)
            let rect = MKMapRect(origin: point, size: MKMapSize(width: 0.0, height: 0.0))
            return MKMapRectUnion($0, rect)
        })

        var coordinateRegion = MKCoordinateRegionForMapRect(mapRect)
        coordinateRegion.span.latitudeDelta *= marginMultiplier
        coordinateRegion.span.longitudeDelta *= marginMultiplier
        self = coordinateRegion
    }
}

0

একটি সুইফ্ট 5 সংস্করণ:

   func regionFor(coordinates coords: [CLLocationCoordinate2D]) -> MKCoordinateRegion {
        var r = MKMapRect.null

        for i in 0 ..< coords.count {
            let p = MKMapPoint(coords[i])

            r = r.union(MKMapRect(x: p.x, y: p.y, width: 0, height: 0))
        }

        return MKCoordinateRegion(r)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.