জুমিং এমকেম্যাপভিউতে টীকাগুলি পিনের সাথে মানানসই?


193

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

সম্পাদনা: আমার প্রাথমিক ভাবনাটি হ'ল এমকেকর্ডিনেটেজিগানমেক ব্যবহার করুন এবং আমার টীকাগুলি থেকে স্থানাঙ্ক কেন্দ্র, দ্রাঘিমাংশ এবং অক্ষাংশগ্রন্থ গণনা করুন। আমি নিশ্চিত যে এটি কার্যকর হবে, তবে আমি কেবল এটি পরীক্ষা করতে চেয়েছিলাম যে আমি স্পষ্ট কিছু মিস করছি না।

কোড যুক্ত হয়েছে, বিটিডাব্লু: এফজিএলোকেশন এমন একটি বর্গ যা মেনে চলে MKAnnotation, লোকেশনফেক NSMutableArrayএই বিষয়গুলির মধ্যে একটি । মন্তব্য সর্বদা স্বাগত ....

- (MKCoordinateRegion)regionFromLocations {
    CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate];
    CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate];

    // FIND LIMITS
    for(FGLocation *eachLocation in locationFake) {
        if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude;
        if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude;
        if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude;
        if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude;
    }

    // FIND REGION
    MKCoordinateSpan locationSpan;
    locationSpan.latitudeDelta = upper.latitude - lower.latitude;
    locationSpan.longitudeDelta = upper.longitude - lower.longitude;
    CLLocationCoordinate2D locationCenter;
    locationCenter.latitude = (upper.latitude + lower.latitude) / 2;
    locationCenter.longitude = (upper.longitude + lower.longitude) / 2;

    MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan);
    return region;
}

10
আইওএস 7 নোট: নতুন শোঅ্যানোটেশন: অ্যানিমেটেড: পদ্ধতি আপনাকে এই ম্যানুয়াল অঞ্চলের গণনা এড়াতে সহায়তা করতে পারে।

উত্তর:


123

আপনি এটি ঠিক আছে।

আপনার সর্বাধিক এবং ন্যূনতম অক্ষাংশ এবং দ্রাঘিমাংশ সন্ধান করুন, কিছু সাধারণ গাণিতিক প্রয়োগ করুন এবং ব্যবহার করুন MKCoordinateRegionMake

আইওএস and এবং ততোধিকের জন্য showAnnotations:animated:, থেকে MKMapView.h:

// Position the map such that the provided array of annotations are all visible to the fullest extent possible. 
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);

158
আইওএস 7 এবং ততোধিকের জন্য (এমকেম্যাপভিউ.h উল্লেখ করে): // Position the map such that the provided array of annotations are all visible to the fullest extent possible. - (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
অভিষেক বেদি

1
এটি ভালভাবে কাজ করে তবে মাঝে মাঝে যখন আমি জুম (মানচিত্রে) করি তারপরে এটি কেন্দ্রীভূত করার চেষ্টা করুন (একটি বোতাম যা এই পদ্ধতিটিকে অনুরোধ করে) এটি কাজ করে না বলে মনে হয়।
আরপিএম

5
এটি লক্ষ করা গুরুত্বপূর্ণ যে showAnnotationsমানচিত্রে টীকাগুলিও যুক্ত করে, এমনকি যদি সেই জায়গার জন্য কোনও টিকাটি ইতিমধ্যে বিদ্যমান থাকে।
এনেকো অ্যালোনসো

@ এনেকো অ্যালোনসো আপনি removeAnnotations(_ annotations:)সঙ্গে সঙ্গে কল করে এটিকে ঘিরে কাজ করতে পারেনshowAnnotations(_ annotations:animated)
আলেন স্টুল্জ

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

335

এটিই এখানে আমি খুঁজে পেয়েছি যা আমার পক্ষে কাজ করেছে:

(সম্পাদনা: রেটটি অনির্দিষ্ট আকারে ছোট না হওয়ার বিষয়টি নিশ্চিত করতে আমি পয়েন্ট রেক্টকে ০.০ দ্বারা বাড়ানোর জন্য @ মিকাহার পরামর্শটি ব্যবহার করে সমাধানটি আপডেট করেছি!)

MKMapRect zoomRect = MKMapRectNull;
for (id <MKAnnotation> annotation in mapView.annotations)
{
    MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
    MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
    zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
[mapView setVisibleMapRect:zoomRect animated:YES];

 

আপনি এটির সাথে প্রথম লাইনটি প্রতিস্থাপন করে ব্যবহারকারীর অবস্থান পিন অন্তর্ভুক্ত করতে আপডেট করতে পারেন:

MKMapPoint annotationPoint = MKMapPointForCoordinate(mapView.userLocation.coordinate);
MKMapRect zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);

4
সত্যিই দুর্দান্ত। যদিও আপনাকে এখনই চেক করার দরকার নেই। MKMapRectUnion এটি আপনার জন্য করে। দস্তাবেজগুলি থেকে: "যদি দুটি আয়তক্ষেত্রটি নাল হয় তবে এই পদ্ধতিটি অন্য আয়তক্ষেত্রটি প্রদান করে।"
ফেলিক্স ল্যামোরাক্স

37
খুব সুন্দর সমাধান !!! কিছু প্যাডিং যুক্ত করতে এখানে একটি অতিরিক্ত সামান্য স্পর্শ: ডাবল ইনসেট = -জুমআরেক্ট.সাইজ.উইথ * 0.1; [স্ব.ম্যাপভিউ সেটভিজিবল্যাপ্যাপেক্ট: এমকেম্যাপআরেক্টইনসেট (জুমআরেক্ট, ইনসেট, ইনসেট) অ্যানিমেটেড: হ্যাঁ];
ক্রেগ বি

1
অসাধারণ! সম্ভাব্য সংযোজন: আপনি যদি 'বর্তমান অবস্থানের টীকা' বাদ দিতে চান তবে লুপের জন্য একটি বিবৃতি যুক্ত করুন: যদি (! [এনটোটেশন isKindOfClass: [MKUserLocation শ্রেণি]]) {// এখানে স্টাফ করুন}
kgaidis

2
প্যাডিংয়ের জন্য @ ক্রেইগবি সমাধানটি দুর্দান্ত, তবে পথটি উল্লম্ব হলে এটি কার্যকরভাবে কাজ করে না, উদাহরণস্বরূপ দক্ষিণ থেকে উত্তর দিকে চলাচল, ডাবল ইনসেট = এমআইএন (-জুমারেক্ট.সাইজ.উইথথ * 0.1, -জুমআরেক্ট.সাইজ) ঠিক করতে। উচ্চতা * 0.1);
ফরহাদ মালেকপুর ২

1
প্যাডিং সহ বর্ধন: ডাবল ইনসেটউইথ = -জুমআরেক্ট.সাইজ.উইথ * 0.2; ডাবল ইনসেটহাইট = -জুমআরেক্ট.সাইজ.হাইট * 0.2; এমকেম্যাপ্রেক্ট ইনসেটরেট = এমকেম্যাপ্রেক্টইনসেট (জুমআরেক্ট, ইনসেটউইথ, ইনসেটহাইট); তারপরে এই নতুন insertRect ব্যবহার করুন
dulgan

121

জীবনকে কিছুটা সহজ করার জন্য অ্যাপল আইওএস 7 এর জন্য একটি নতুন পদ্ধতি যুক্ত করেছে।

[mapView showAnnotations:yourAnnotationArray animated:YES];

আপনি মানচিত্রের ভিউতে সঞ্চিত অ্যারে থেকে সহজেই টানতে পারেন:

yourAnnotationArray = mapView.annotations;

এবং দ্রুত ক্যামেরাও সামঞ্জস্য করুন!

mapView.camera.altitude *= 1.4;

যদি ব্যবহারকারী আইওএস 7+ বা ওএস এক্স 10.9+ ইনস্টল না করে তবে এটি কাজ করবে না। কাস্টম অ্যানিমেশন এখানে দেখুন


আমি নিশ্চিত না যে এটি আমার বাস্তবায়নের অন্যান্য কারণগুলির কারণে হয় কিনা তবে আমি showAnnotationsদেখতে পেয়েছি যে ম্যানুয়াল বাস্তবায়ন যেমন টীকাগুলির একটি জুম / ফিট হিসাবে খুব বেশি ঘনিষ্ঠভাবে ঘটে না তাই আমি ম্যানুয়ালটি আটকে রেখেছি।
টেড অ্যাভেরি

1
মানচিত্রের ভিউ.কমের.াল্টিটিউড * = .85 এর মতো একের একটি ভগ্নাংশের সাহায্যে ক্যামেরার উচ্চতাকে গুণিত করার চেষ্টা করুন; কাছাকাছি ভিউপোর্টের জন্য
রায়ান বার্গ

আমি বর্তমানের দৃশ্যমান মানচিত্রের বাইরে টীকাগুলি বাছাই করার জন্যও এই দরকারীটি পেয়েছি। ডিফল্টরূপে, ম্যাপভিউ অ-দৃশ্যমান টীকা নির্বাচন করে না। নির্বাচন অ্যানোটেশন কল করার আগে আপনার অ-দৃশ্যমান টীকা (গুলি) এর একটি অ্যারে দিয়ে কল শো অ্যানোটেশনগুলি and
মান্ডিসাব্লু

42

আমি এই কোডটি ব্যবহার করি এবং আমার পক্ষে ভাল কাজ করে:

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

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

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

    for(MapViewAnnotation *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;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides

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

174,13666611126533: 46,969995730376894 - দ্রাঘিমাংশ: -109,2494943434474 ▿ 1: CLLocationCoordinate2D -: - অক্ষাংশ 63,23212154333072 দ্রাঘিমাংশ: - ▿ 2 উপাদান ▿ 0: অক্ষাংশ CLLocationCoordinate2D কাজ করে না
Olexiy Pyvovarov

23

দ্রুত ব্যবহারে

mapView.showAnnotations(annotationArray, animated: true)

উদ্দেশ্য গ

[mapView showAnnotations:annotationArray animated:YES];

2
যদি টীকাগুলি ইতিমধ্যে মানচিত্রের ভিউতে সেট করা থাকে, আপনি তাদের সাথে সরাসরি উল্লেখ করতে পারেন:mapView.showAnnotations(mapView.annotations, animated: true)
জাস্টিন ভ্যালি

14

আমি উত্তরটি রাফায়েল মোড়ির রূপান্তর করেছি। কৃতিত্ব তার কাছে যায়। আপনারা যারা সুইফ্ট সংস্করণটি সন্ধান করছেন তাদের জন্য এখানে কোডটি দেওয়া হয়েছে:

 func zoomToFitMapAnnotations(aMapView: MKMapView) {
    guard aMapView.annotations.count > 0 else {
        return
    }
    var topLeftCoord: CLLocationCoordinate2D = CLLocationCoordinate2D()
    topLeftCoord.latitude = -90
    topLeftCoord.longitude = 180
    var bottomRightCoord: CLLocationCoordinate2D = CLLocationCoordinate2D()
    bottomRightCoord.latitude = 90
    bottomRightCoord.longitude = -180
    for annotation: MKAnnotation in myMap.annotations as! [MKAnnotation]{
        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)
    }

    var region: MKCoordinateRegion = MKCoordinateRegion()
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.4
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.4
    region = aMapView.regionThatFits(region)
    myMap.setRegion(region, animated: true)
}

14

সুইফট 3 মানচিত্রে সমস্ত টীকাগুলির ফিট করার জন্য এটি সঠিক উপায়।

func zoomMapaFitAnnotations() {

        var zoomRect = MKMapRectNull
        for annotation in mapview.annotations {

            let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)

            let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0)

            if (MKMapRectIsNull(zoomRect)) {
                zoomRect = pointRect
            } else {
                zoomRect = MKMapRectUnion(zoomRect, pointRect)
            }
        }
        self.mapview.setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(50, 50, 50, 50), animated: true)

    }

@ আরশাদশাইক আপনার প্রস্তাবিত সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, আপনি যদি সুইফট ৪.২-এর জন্য একটি নতুন উত্তর সরবরাহ করতে চান তবে নির্দ্বিধায় এটিকে উত্তর হিসাবে যুক্ত করুন, এটি অন্য কোনও ব্যবহারকারী পোস্টে সম্পাদনা করে নয়।
নিক

13

@ জুইয়ের সমাধানটি দুর্দান্ত কাজ করে। একটি ক্যাচ, যদি কোনও মানচিত্রে একটি মাত্র টীকা থাকে তবে আপনি সম্পূর্ণ জুমযুক্ত মানচিত্রটি শেষ করবেন। আমি সেটটি ভিজিবল্যাপ্যাপ্রেটে জুম করার মতো কিছু আছে তা নিশ্চিত করতে রেকট মেক আকারে 0.1 যোগ করেছি।

MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);

12

আপনি যদি আইওএস 8 এবং তার থেকেও উপরে খুঁজছেন তবে এটি করার সহজ উপায় হ'ল var layoutMargins: UIEdgeInsets { get set }কল করার আগে আপনার মানচিত্রের ভিউ সেট করাfunc showAnnotations(annotations: [MKAnnotation], animated: Bool)

উদাহরণস্বরূপ (সুইফট ২.১):

@IBOutlet weak var map: MKMapView! {
    didSet {
        map.delegate = self
        map.mapType = .Standard
        map.pitchEnabled = false
        map.rotateEnabled = false
        map.scrollEnabled = true
        map.zoomEnabled = true
    }
}

// call 'updateView()' when viewWillAppear or whenever you set the map annotations
func updateView() {
    map.layoutMargins = UIEdgeInsets(top: 25, left: 25, bottom: 25, right: 25)
    map.showAnnotations(map.annotations, animated: true)
}

12

আমি এখান থেকে এবং এখান থেকে কিছু কোড ব্যবহার করে সমস্ত টীকাগুলি দেখানোর জন্য একটি এক্সটেনশন তৈরি করেছি। এটি সর্বাধিক জুম স্তরে এমনকি প্রদর্শিত না হতে পারলে সমস্ত টীকাটি প্রদর্শন করবে না।

import MapKit

extension MKMapView {
    func fitAllAnnotations() {
        var zoomRect = MKMapRectNull;
        for annotation in annotations {
            let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)
            let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
            zoomRect = MKMapRectUnion(zoomRect, pointRect);
        }
        setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsets(top: 50, left: 50, bottom: 50, right: 50), animated: true)
    }
}

আমি UIEdgeInsetsMakeপরামিতিগুলি পরিবর্তন করে আরও ভাল ফলাফল পেতে পরিচালিত করেছি , 30 থেকে 100 এর মধ্যে মানগুলি আমার পক্ষে ভাল ছিল। আমি আইফোন এসই i) এস 10.2 সিমুলেটর ব্যবহার করে পরীক্ষা করছিলাম। উদাহরণ কোড: setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)। একটি নোট হিসাবে, এই কোডটি সুইফ্ট 3 এবং এক্সকোড 8.2.1 এ কাজ করে।
nyxee

8

এই পদ্ধতি থেকে ব্যবহারকারীদের অবস্থানের পিনটি বাদ দেওয়ার জন্য লুপের মধ্যে লুপটি যুক্ত করা হয়েছে (আমার ক্ষেত্রে প্রয়োজনীয়, এবং সম্ভবত অন্যরাও)

if (![annotation isKindOfClass:[MKUserLocation class]] ) {

//Code Here...

}

8

আইওএস 7 এবং ততোধিকের জন্য (এমকেম্যাপভিউ.h উল্লেখ করে):

// Position the map such that the provided array of annotations are all visible to the fullest extent possible.          

- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);

মন্তব্য থেকে - অভিষেক বেদী

আপনি কেবল কল:

 [yourMapView showAnnotations:@[yourAnnotation] animated:YES];

কেবলমাত্র রেফারেন্সের জন্য, এনএস_আভিএআইএলআইএল পাঠ্যটি সেখানে ছিল কারণ জানুয়ারী ২০১১-এ, ডিভাইসে আইওএস having থাকা খুব বেশি সম্ভাবনাজনক ছিল না এবং এনএস_এভিএইএইਬਲএইচ অ্যাপ্লিকেশনটি বিল্ড ব্যর্থতা বা ক্রাশ থেকে রক্ষা করেছিল।
ম্যাথু ফ্রেডরিক

5

সুইফটে

    var zoomRect = MKMapRectNull;

    for i in 0..<self.map.annotations.count {

        let annotation: MKAnnotation = self.map.annotations[i]

        let annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        zoomRect = MKMapRectUnion(zoomRect, pointRect);
    }

    self.map.setVisibleMapRect(zoomRect, animated: true)

5
    var zoomRect: MKMapRect = MKMapRect.null
    for annotation in mapView.annotations {
        let annotationPoint = MKMapPoint(annotation.coordinate)
        let pointRect = MKMapRect(x: annotationPoint.x, y: annotationPoint.y, width: 0.1, height: 0.1)
        zoomRect = zoomRect.union(pointRect)
    }
    mapView.setVisibleMapRect(zoomRect, animated: true)

// দ্রুত 5 এর জন্য সম্পাদিত


4

জুইকে ধন্যবাদ আমি আমার পুরাতন বিভাগটি আরও মার্জিত সমাধানে আপডেট করেছি। ভাগ করা সম্পূর্ণ, প্রায় অনুলিপি এবং প্রস্তুত সমাধান আটকান

MKMapView + + AnnotationsRegion.h

#import <MapKit/MapKit.h>

@interface MKMapView (AnnotationsRegion)

-(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated;
-(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding;

-(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated;
-(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding;

@end

MKMapView + + AnnotationsRegion.m

#import "MKMapView+AnnotationsRegion.h"

@implementation MKMapView (AnnotationsRegion)

-(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated{
    [self updateRegionForCurrentAnnotationsAnimated:animated edgePadding:UIEdgeInsetsZero];
}
-(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding{
    [self updateRegionForAnnotations:self.annotations animated:animated edgePadding:edgePadding];
}

-(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated{
    [self updateRegionForAnnotations:annotations animated:animated edgePadding:UIEdgeInsetsZero];
}
-(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding{
    MKMapRect zoomRect = MKMapRectNull;
    for(id<MKAnnotation> annotation in annotations){
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        zoomRect = MKMapRectUnion(zoomRect, pointRect);
    }
    [self setVisibleMapRect:zoomRect edgePadding:edgePadding animated:animated];
}

@end

আশা করি এটি কাউকে সহায়তা করে এবং আবার জুইকে ধন্যবাদ!


4
 - (void)zoomMapViewToFitAnnotationsWithExtraZoomToAdjust:(double)extraZoom
{

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

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

   for (id<MKAnnotation> annotation in [self annotations])
  {
      points[i++] = MKMapPointForCoordinate(annotation.coordinate);
   }

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

MKCoordinateRegion r = MKCoordinateRegionForMapRect([poly boundingMapRect]);
r.span.latitudeDelta += extraZoom;
r.span.longitudeDelta += extraZoom;

[self setRegion: r animated:YES];

}

4

অভিষেক বেদী যেমন একটি মন্তব্যে উল্লেখ করেছেন, iOS7 এর জন্য এটি করার সর্বোত্তম উপায় হ'ল:

//from API docs: 
//- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
[self.mapView showAnnotations:self.mapView.annotations animated:YES];

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

.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]; 

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


3

এই পৃষ্ঠার সমস্ত উত্তর ধরে নেওয়া যায় যে মানচিত্রটি পুরো স্ক্রিনে রয়েছে । আমার আসলে একটি এইচডি ডিসপ্লে রয়েছে (অর্থাত্ উপরে এবং নীচে বিস্তৃত বোতামগুলি) যা মানচিত্রের শীর্ষে তথ্য দেয় .. এবং তাই পৃষ্ঠায় থাকা অ্যালগোরিদমগুলি পিনগুলি ঠিকঠাক প্রদর্শন করবে, তবে এর মধ্যে কিছু নীচে প্রদর্শিত হবে এইচডিডি প্রদর্শন বোতামের ।

আমার সমাধানটি স্ক্রিনের একটি উপসেটে টীকাগুলি প্রদর্শন করতে মানচিত্রটিকে জুম করে এবং বিভিন্ন স্ক্রিন আকারের জন্য কাজ করে (উদাহরণস্বরূপ 3.5 "বনাম 4.0" ইত্যাদি):

// create a UIView placeholder and throw it on top of the original mapview
// position the UIView to fit the maximum area not hidden by the HUD display buttons
// add an *other* mapview in that uiview, 
// get the MKCoordinateRegion that fits the pins from that fake mapview
// kill the fake mapview and set the region of the original map 
// to that MKCoordinateRegion.

আমি কোডটিতে যা করেছি তা এখানে রয়েছে (দ্রষ্টব্য: আমি NSConstraintsআমার কোডটি বিভিন্ন পর্দার আকারে কাজ করতে কিছু সহায়ক সহায়তার সাথে ব্যবহার করি .. কোডটি বেশ পঠনযোগ্য হলেও আমার উত্তর এখানে আরও ভাল ব্যাখ্যা করে .. এটি মূলত একই কর্মপ্রবাহ) :)

// position smallerMap to fit available space
// don't store this map, it will slow down things if we keep it hidden or even in memory
[@[_smallerMapPlaceholder] mapObjectsApplyingBlock:^(UIView *view) {
    [view removeFromSuperview];
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
    [view setHidden:NO];
    [self.view addSubview:view];
}];

NSDictionary *buttonBindingDict = @{ @"mapPlaceholder": _smallerMapPlaceholder};

NSArray *constraints = [@[@"V:|-225-[mapPlaceholder(>=50)]-176-|",
                          @"|-40-[mapPlaceholder(<=240)]-40-|"
                          ] mapObjectsUsingBlock:^id(NSString *formatString, NSUInteger idx){
                              return [NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:buttonBindingDict];
                          }];

[self.view addConstraints:[constraints flattenArray]];
[self.view layoutIfNeeded];

MKMapView *smallerMap = [[MKMapView alloc] initWithFrame:self.smallerMapPlaceholder.frame];
[_smallerMapPlaceholder addSubview:smallerMap];

MKCoordinateRegion regionThatFits = [smallerMap getRegionThatFits:self.mapView.annotations];
[smallerMap removeFromSuperview];
smallerMap = nil;
[_smallerMapPlaceholder setHidden:YES];

[self.mapView setRegion:regionThatFits animated:YES];

এখানে কোডটি পাওয়া যায় যা অঞ্চলটি ফিট করে:

- (MKCoordinateRegion)getRegionThatFits:(NSArray *)routes {
    MKCoordinateRegion region;
    CLLocationDegrees maxLat = -90.0;
    CLLocationDegrees maxLon = -180.0;
    CLLocationDegrees minLat = 90.0;
    CLLocationDegrees minLon = 180.0;
    for(int idx = 0; idx < routes.count; idx++)
    {
        CLLocation* currentLocation = [routes objectAtIndex:idx];
        if(currentLocation.coordinate.latitude > maxLat)
            maxLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.latitude < minLat)
            minLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.longitude > maxLon)
            maxLon = currentLocation.coordinate.longitude;
        if(currentLocation.coordinate.longitude < minLon)
            minLon = currentLocation.coordinate.longitude;
    }
    region.center.latitude     = (maxLat + minLat) / 2.0;
    region.center.longitude    = (maxLon + minLon) / 2.0;
    region.span.latitudeDelta = 0.01;
    region.span.longitudeDelta = 0.01;

    region.span.latitudeDelta  = ((maxLat - minLat)<0.0)?100.0:(maxLat - minLat);
    region.span.longitudeDelta = ((maxLon - minLon)<0.0)?100.0:(maxLon - minLon);

    MKCoordinateRegion regionThatFits = [self regionThatFits:region];
    return regionThatFits;
}

2

আমি একটি সামান্য পরিমার্জন করেছি রাফায়েল এর জন্য MKMapView শ্রেণী কোড।

- (void)zoomToFitMapAnnotations {
    if ([self.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 self.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;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides

    [self setRegion:[self regionThatFits:region] animated:YES];
}

2

উপরের উত্তরের ভিত্তিতে আপনি একই সাথে সমস্ত টিকা এবং ওভারলেগুলিতে ফিট করতে মানচিত্র জুম করতে সর্বজনীন পদ্ধতি ব্যবহার করতে পারেন।

-(MKMapRect)getZoomingRectOnMap:(MKMapView*)map toFitAllOverlays:(BOOL)overlays andAnnotations:(BOOL)annotations includeUserLocation:(BOOL)userLocation {
    if (!map) {
        return MKMapRectNull;
    }

    NSMutableArray* overlaysAndAnnotationsCoordinateArray = [[NSMutableArray alloc]init];        
    if (overlays) {
        for (id <MKOverlay> overlay in map.overlays) {
            MKMapPoint overlayPoint = MKMapPointForCoordinate(overlay.coordinate);
            NSArray* coordinate = @[[NSNumber numberWithDouble:overlayPoint.x], [NSNumber numberWithDouble:overlayPoint.y]];
            [overlaysAndAnnotationsCoordinateArray addObject:coordinate];
        }
    }

    if (annotations) {
        for (id <MKAnnotation> annotation in map.annotations) {
            MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
            NSArray* coordinate = @[[NSNumber numberWithDouble:annotationPoint.x], [NSNumber numberWithDouble:annotationPoint.y]];
            [overlaysAndAnnotationsCoordinateArray addObject:coordinate];
        }
    }

    MKMapRect zoomRect = MKMapRectNull;
    if (userLocation) {
        MKMapPoint annotationPoint = MKMapPointForCoordinate(map.userLocation.coordinate);
        zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
    }

    for (NSArray* coordinate in overlaysAndAnnotationsCoordinateArray) {
        MKMapRect pointRect = MKMapRectMake([coordinate[0] doubleValue], [coordinate[1] doubleValue], 0.1, 0.1);
        zoomRect = MKMapRectUnion(zoomRect, pointRect);
    }

    return zoomRect;
}

এবং তারপর:

MKMapRect mapRect = [self getZoomingRectOnMap:mapView toFitAllOverlays:YES andAnnotations:YES includeUserLocation:NO];
[mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0) animated:YES];

1

এটিতে আমার পর্যবেক্ষণগুলি ভাগ করে নেওয়া:

আপনি যদি স্টোরিবোর্ডে পর্দার জন্য "ইনফার্ডেড" আকারের সাথে xCode> 6 ব্যবহার করছেন (ফাইল ইন্সপেক্টরটিতে "সিমুলেটেড মেট্রিকস" দেখুন), কল করছেন

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

মধ্যে viewDidLoad4 ইঞ্চি সঙ্গে আইফোন উপর একটি খুব বড় জুম স্তরের পরিণাম ডেকে আনবে কারণ মানচিত্রের জন্য বিন্যাস স্টোরিবোর্ড থেকে ব্যাপকতর পর্দা আকারের উপর এখনও।

আপনি আপনার কলটিতে স্থানান্তর করতে showAnnotations...পারেন viewDidAppear। তারপরে মানচিত্রের আকারটি ইতিমধ্যে একটি আইফোন 4 এর ছোট পর্দার সাথে সামঞ্জস্য করা হয়েছে।

অথবা বিকল্পভাবে "সিমুলেটেড মেট্রিক্স" এর অধীনে ফাইল ইন্সপেক্টরের আইফোন 4-ইঞ্চিতে মান "অনুমানকৃত" পরিবর্তন করুন।


1

টীকাগুলির পাশাপাশি আপনি কোন আকারগুলি প্রদর্শন করতে চান তা নির্বাচন করতে পারেন।

extension MKMapView {
  func setVisibleMapRectToFitAllAnnotations(animated: Bool = true,
                                            shouldIncludeUserAccuracyRange: Bool = true,
                                            shouldIncludeOverlays: Bool = true,
                                            edgePadding: UIEdgeInsets = UIEdgeInsets(top: 35, left: 35, bottom: 35, right: 35)) {
    var mapOverlays = overlays

    if shouldIncludeUserAccuracyRange, let userLocation = userLocation.location {
      let userAccuracyRangeCircle = MKCircle(center: userLocation.coordinate, radius: userLocation.horizontalAccuracy)
      mapOverlays.append(MKOverlayRenderer(overlay: userAccuracyRangeCircle).overlay)
    }

    if shouldIncludeOverlays {
      let annotations = self.annotations.filter { !($0 is MKUserLocation) }
      annotations.forEach { annotation in
        let cirlce = MKCircle(center: annotation.coordinate, radius: 1)
        mapOverlays.append(cirlce)
      }
    }

    let zoomRect = MKMapRect(bounding: mapOverlays)
    setVisibleMapRect(zoomRect, edgePadding: edgePadding, animated: animated)
  }
}

extension MKMapRect {
  init(bounding overlays: [MKOverlay]) {
    self = .null
    overlays.forEach { overlay in
      let rect: MKMapRect = overlay.boundingMapRect
      self = self.union(rect)
    }
  }
}

0

@ "আমি নিশ্চিত নই যে এটি আমার বাস্তবায়নের অন্যান্য কারণগুলির কারণে হয়েছে কিনা তবে আমি দেখতে পেয়েছি যে শিরোনামগুলি ম্যানুয়াল বাস্তবায়নের মতো টীকাগুলির একটি জুম / ফিটের মতো ঘনিষ্ঠভাবে কাজ করে না, তাই আমি আটকেছি ম্যানুয়াল এক। - টেড অ্যাভেরি 17 এপ্রিল 0:35 "

আমারও একই সমস্যা ছিল, তবে তারপরে আমি দু'বার শো নীচে (নীচের মত) চেষ্টা করার চেষ্টা করেছি এবং কোনও কারণে এটি কার্যকর হয়েছিল।

[মানচিত্র দেখুন শো অ্যানোটেশনস: আপনার অ্যানোটেশনআরাই অ্যানিমেটেড: হ্যাঁ]; [মানচিত্র দেখুন শো অ্যানোটেশনস: আপনার অ্যানোটেশনআরাই অ্যানিমেটেড: হ্যাঁ];


0

একটি iOS 7 সামঞ্জস্যপূর্ণ উপায় নিম্নলিখিত ব্যবহার করা হয়। showAnnotationসমস্ত টিকা সহ একটি আয়তক্ষেত্র পেতে প্রথমে কল করুন । এরপরে UIEdgeInsetপিনের উচ্চতার শীর্ষতম ইনসেটটি তৈরি এবং তৈরি করুন । সুতরাং আপনি মানচিত্রে পুরো পিনটি দেখানোর বিষয়টি নিশ্চিত করেছেন।

[self.mapView showAnnotations:self.mapView.annotations animated:YES];
MKMapRect rect = [self.mapView visibleMapRect];
UIEdgeInsets insets = UIEdgeInsetsMake(pinHeight, 0, 0, 0);
[self.mapView setVisibleMapRect:rect edgePadding:insets animated:YES];

0

এটি আপনার কোড অনুসারে রাখুন:

  - (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views
    {
    id<MKAnnotation> mp = [annotationView annotation];
        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate] ,250,250);

       [mv setRegion:region animated:YES];

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