এমকেম্যাপভিউয়ের জন্য জুম স্তর নির্ধারণ করা


118

আমার কাছে একটি মানচিত্র রয়েছে যা সঠিকভাবে দেখায়, আমি এখনই করতে চাই এটি যখন লোড হয় তখন জুম স্তরটি সেট করা হয়। এই কাজ করতে একটি উপায় আছে কি?

ধন্যবাদ

উত্তর:


198

আমি নিজেকে একটি সমাধান পেয়েছি, যা খুব সহজ এবং কৌশলটি করে। MKCoordinateRegionMakeWithDistanceকাঙ্ক্ষিত জুমটি পেতে অনুভূমিক এবং অনুভূমিকভাবে মিটারে দূরত্ব নির্ধারণ করতে ব্যবহার করুন । এবং তারপরে অবশ্যই আপনি যখন নিজের অবস্থান আপডেট করবেন আপনি সঠিক স্থানাঙ্ক পাবেন, বা আপনি সরাসরি এটি সূচনাতে নির্দিষ্ট করতে পারেন CLLocationCoordinate2D, যদি আপনার এটি করা দরকার হয় তবে:

CLLocationCoordinate2D noLocation;
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500);
MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:viewRegion];          
[self.mapView setRegion:adjustedRegion animated:YES];
self.mapView.showsUserLocation = YES;

সুইফট:

let location = ...
let region = MKCoordinateRegion( center: location.coordinate, latitudinalMeters: CLLocationDistance(exactly: 5000)!, longitudinalMeters: CLLocationDistance(exactly: 5000)!)
mapView.setRegion(mapView.regionThatFits(region), animated: true)

3
এটি নির্বাচিত উত্তর হওয়া উচিত। আমি অন্যান্য প্রস্তাবিত সমাধানগুলির অনেক চেষ্টা করেছিলাম কিন্তু সেগুলির কোনওটিই সঠিকভাবে কাজ করে না। এই কোডটি সহজ এবং কার্যকর।
লেভি রবার্টস

1
চমৎকার উত্তর. তবে স্ক্রিনের আকারের উপর নির্ভর করে জুম আলাদা হবে, না?
ভিনজিয়াস

1
মজার বিষয় MKCoordinateRegionMakeWithDistanceহচ্ছে সুইফটে এখনও রয়েছে। এই সমাধান কাজ করে!
লিনাসেফার্থ

47

মানচিত্রের যে কোনও বিন্দুতে দ্রাঘিমাংশ রেখাগুলি সমানভাবে পৃথক করা হয়েছে তার উপর ভিত্তি করে, কেন্দ্রটি সমন্বিত এবং জুমলেভেল সেট করার জন্য খুব সাধারণ বাস্তবায়ন রয়েছে:

@interface MKMapView (ZoomLevel)

@property (assign, nonatomic) NSUInteger zoomLevel;

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                  zoomLevel:(NSUInteger)zoomLevel
                   animated:(BOOL)animated;

@end


@implementation MKMapView (ZoomLevel)

- (void)setZoomLevel:(NSUInteger)zoomLevel {
    [self setCenterCoordinate:self.centerCoordinate zoomLevel:zoomLevel animated:NO];
}

- (NSUInteger)zoomLevel {
    return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1;
}

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated {
    MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256);
    [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated];
}

@end

গৌণ সংশোধন:- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256); [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated]; }
মনোবোনো

ধন্যবাদ! হ্যাঁ আপনি ঠিক বলেছেন, আমি আমার প্রকল্পটি থেকে কোডটি বের করেছিলাম যেখানে এটি এমকেম্যাপভিউয়ের পরিবর্তে একটি ফাংশন ছিল। আমি আপনার সংশোধন প্রতিবিম্বিত করার জন্য কোডটিতে সম্পাদনা করেছি।
কোয়ান্টিনাদাম

1
বর্তমান জুম স্তরটি কার্যকর করতে সেই সূত্রের বিপরীতটি কী?
নিক

1
আমি মনে করি এটি এটি:double z = log2(360 * ((self.mapView.frame.size.width/256) / self.mapView.region.span.longitudeDelta));
নিক

1
@ ডিভিওস, জুম স্তর 1 এ, পুরো বিশ্ব (360 °) 256px প্রশস্ত 1 টাইলের সাথে খাপ খায়। জুম স্তর 2 এ, পুরো বিশ্বটি (360 °) 256px (512px) এর 2 টাইলগুলিতে ফিট করে। জুম স্তর 3 এ, পুরো বিশ্ব (360 °) 256px (1024px) ইত্যাদির 4 টাইলগুলিতে ফিট করে
কোয়ান্টিনডাম

31

এটি অন্তর্নির্মিত নয়, তবে আমি এই কোডটি দেখেছি / ব্যবহার করেছি । এটি আপনাকে এটি ব্যবহার করতে দেয়:

[mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES];

দ্রষ্টব্য: এটি আমার কোড নয়, আমি এটি লিখিনি, সুতরাং এটির জন্য ক্রেডিট নিতে পারি না


1
বাহ, এর প্রচুর কোড, আপনি মনে করেন এটি তৈরি করা উচিত thanks ধন্যবাদ। এটি কীভাবে করা হয়েছে তার একটি চেহারা হবে।
সিস্টেম

1
আপনি মি।
পোস্টম্যান

2
আমার জন্য কাজ করেনি, এটি আগের মতো একই জুম স্তরটি প্রদর্শন করে। আমি অবশ্যই কিছু ভুল করছি।
সিস্টেম

17

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


MKCoordinateRegion region;
region.center.latitude = {desired lat};
region.center.longitude = {desired lng};
region.span.latitudeDelta = 1;
region.span.longitudeDelta = 1;
mapView.region = region;

সম্পাদনা 1:

MKCoordinateRegion region;
region.center.latitude = {desired lat};
region.center.longitude = {desired lng};
region.span.latitudeDelta = 1;
region.span.longitudeDelta = 1;
region = [mapView regionThatFits:region];
[mapView setRegion:region animated:TRUE];

1
এটি আমার পক্ষে কোনও তাত্পর্যপূর্ণ হয়নি, যখন আমি কিছু মান পরিবর্তন করি, এটি কেবল মানচিত্রটি লোড করে না।
সিস্টেম

মানচিত্রটি লোড হয়ে যাওয়ার পরে আপনি কি এটি সেট করছেন বা লোড হওয়ার পরে আপনি কীভাবে কারচুপি করার চেষ্টা করছেন? আপনি কি 1 বা তার চেয়ে ছোট সংখ্যাকে আপনার ডেল্টা হিসাবে ব্যবহার করছেন? কেবল প্রয়োজনীয়তাগুলি বোঝার চেষ্টা করছি।
ডেরেকএইচ

আমি রানটাইম আগে সেট। আমি উপরে 1 এবং নীচের মানগুলি পরীক্ষা করেছি
সিস্টেম

1
উত্তরের উত্তর কিন্তু অক্ষাংশ, দ্রাঘিমাংশ ব-দ্বীপটি 0.1 এ পরিবর্তন করার চেষ্টা করুন - এটি আরও জুম করা।
ড্যানিয়েল ক্রিজিস্কোস্কি

12

আপনি যদি আউটলেট ব্যবহার করেন তবে একটি সাধারণ সুইফ্ট বাস্তবায়ন।

@IBOutlet weak var mapView: MKMapView! {
    didSet {
        let noLocation = CLLocationCoordinate2D()
        let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500)
        self.mapView.setRegion(viewRegion, animated: false)
    }
}

@ কার্নালের উত্তরের ভিত্তিতে।


12

দ্রুত বাস্তবায়ন

import Foundation
import MapKit

class MapViewWithZoom: MKMapView {

    var zoomLevel: Int {
        get {
            return Int(log2(360 * (Double(self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1);
        }

        set (newZoomLevel){
            setCenterCoordinate(coordinate:self.centerCoordinate, zoomLevel: newZoomLevel, animated: false)
        }
    }

    private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Int, animated: Bool) {
        let span = MKCoordinateSpan(latitudeDelta: 0, longitudeDelta: 360 / pow(2, Double(zoomLevel)) * Double(self.frame.size.width) / 256)
        setRegion(MKCoordinateRegion(center: coordinate, span: span), animated: animated)
    }
}

1
আমি% না 100 নিশ্চিত, কিন্তু আমি অনুমান আপনি আপনার তৈরি IBOutletআপনার টু map, আপনি এটি হিসেবে সংজ্ঞায়িত MapViewWithZoomএকটি সহজ পরিবর্তে MKMapView। তারপরে, আপনি কেবল map.zoomLevel = 1বাmap.zoomLevel = 0.5
Zonker.in এর

1
এ সম্পর্কে কিছু মন্তব্য আরও সহায়ক হবে এটি সুইফট 3 এ কাজ করছে
নেক্সি

দুর্দান্ত সমাধান! তবে আমি এটি এক্সটেনশন হিসাবে বেশি পছন্দ করি এবং একটি অদ্ভুত জিনিস আছে: আসলে জুম বাড়ানোর জন্য 2 টির মতো হ্রাস করতে হবেmapView.zoomLevel -= 2
আলেকজান্ডার

7

জন্য সুইফট 3 এটা প্রশংসনীয় দ্রুত অগ্রসর আছে:

private func setMapRegion(for location: CLLocationCoordinate2D, animated: Bool)
{
    let viewRegion = MKCoordinateRegionMakeWithDistance(location, <#T##latitudinalMeters: CLLocationDistance##CLLocationDistance#>, <#T##longitudinalMeters: CLLocationDistance##CLLocationDistance#>)
    MapView.setRegion(viewRegion, animated: animated)
}

কেবলমাত্র <CLLocationDistance>ল্যাটার -লম্বা- মিটারগুলি সংজ্ঞায়িত করুন এবং মানচিত্রভিউ আপনার মানগুলির সাথে জুম স্তরকে ফিট করবে।


"মানচিত্রটি আপনার মানগুলির সাথে জুম স্তরটি ফিট করবে" এর অর্থ কী? আমি ধরে নিলাম যে ওপি নিজে জুম লেভেল সেট করতে চায় বা আপনি যে ইনপুটটির পরামর্শ দিয়েছিলেন তা কীভাবে করবেন?
রিপার

6

@ আদিলসুমরোর দুর্দান্ত উত্তরের ভিত্তিতে । আমি এটি নিয়ে এসেছি:

@interface MKMapView (ZoomLevel)
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                  zoomLevel:(NSUInteger)zoomLevel
                   animated:(BOOL)animated;

-(double) getZoomLevel;
@end



@implementation MKMapView (ZoomLevel)

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                  zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated {
    MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256);
    [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated];
}


-(double) getZoomLevel {
    return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta));
}

@end

3

আমি আশা করি নিম্নলিখিত কোড খণ্ডগুলি আপনাকে সহায়তা করবে।

- (void)handleZoomOutAction:(id)sender {
    MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.s       pan.latitudeDelta/0.5, mapView.region.span.longitudeDelta/0.5));
    [mapView setRegion:newRegion];
}


- (void)handleZoomInAction:(id)sender {
    MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.span.latitudeDelta*0.5, mapView.region.span.longitudeDelta*0.5));
    [mapView setRegion:newRegion];
}

জুম স্তর হ্রাস বা বৃদ্ধি করতে আপনি 0.5 এর স্থানে যে কোনও মান বেছে নিতে পারেন। আমি দুটি বোতামের ক্লিকে এই পদ্ধতিগুলি ব্যবহার করেছি।


2

মানচিত্রের জুম এবং অবস্থানটি সংরক্ষণ এবং পুনরুদ্ধার করতে NSUserDephaults ব্যবহার করে একটি সুইফট ২.০ উত্তর।

মানচিত্রের অবস্থান এবং জুম সংরক্ষণের কাজ:

func saveMapRegion() {
    let mapRegion = [
        "latitude" : mapView.region.center.latitude,
        "longitude" : mapView.region.center.longitude,
        "latitudeDelta" : mapView.region.span.latitudeDelta,
        "longitudeDelta" : mapView.region.span.longitudeDelta
    ]
    NSUserDefaults.standardUserDefaults().setObject(mapRegion, forKey: "mapRegion")
}

প্রতিবার মানচিত্র সরানো হলে ফাংশনটি চালান:

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) 
{
        saveMapRegion();
}

মানচিত্রের জুম এবং অবস্থান সংরক্ষণের কাজ:

func restoreMapRegion() 
{
    if let mapRegion = NSUserDefaults.standardUserDefaults().objectForKey("mapRegion") 
    {

        let longitude = mapRegion["longitude"] as! CLLocationDegrees
        let latitude = mapRegion["latitude"] as! CLLocationDegrees
        let center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)

        let longitudeDelta = mapRegion["latitudeDelta"] as! CLLocationDegrees
        let latitudeDelta = mapRegion["longitudeDelta"] as! CLLocationDegrees
        let span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta)

        let savedRegion = MKCoordinateRegion(center: center, span: span)

        self.mapView.setRegion(savedRegion, animated: false)
    }
}

এটি ডিডলয়েডে যুক্ত করুন:

restoreMapRegion()

1

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

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

বাস্তবায়ন আমি গ্রহণ করেছি সুতরাং অক্ষাংশ গণনা নিম্নলিখিত হিসাবে ব্যবহার করা হয়:

@implementation MKMapView (ZoomLevel)

- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate
    zoomLevel:(NSUInteger)zoom animated:(BOOL)animated
{
    MKCoordinateSpan span = MKCoordinateSpanMake(180 / pow(2, zoom) * 
        self.frame.size.height / 256, 0);
    [self setRegion:MKCoordinateRegionMake(coordinate, span) animated:animated];
}

@end

আশা করি এটি দেরী পর্যায়ে সহায়তা করবে।


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

আপনি আপনার মন্তব্যে অন্তর্ভুক্ত তথ্য প্রতিফলিত করতে আপনার পোস্ট আপডেট করার বিষয়ে বিবেচনা করতে পারেন।
ডেরেক লি

1

সুইফট:

Map.setRegion(MKCoordinateRegion(center: locValue, latitudinalMeters: 200, longitudinalMeters: 200), animated: true)

লোকভ্যালু হ'ল আপনার স্থানাঙ্ক।


1

এখানে, আমি আমার উত্তর এবং এটি দ্রুত 4.2 এর জন্য কাজ করে রেখেছি ।

এমকেম্যাপভিউ কেন্দ্র এবং জুম ইন


আমি যদি এখানে ক্লিক করে নীচে স্ক্রোল করি এবং সেখানে আপনার লিঙ্কটিতে ক্লিক করি তবে আমি নিজেকে এখানে আবার খুঁজে পাব এবং তারপরে আমি এখানে ক্লিক করব এবং এখন আমি একটি অসীম লুপে আটকে রয়েছি 😏
ম্যাথিজ

@ ম্যাথিজগুলি আমি লিঙ্কটি সংশোধন করেছি। দয়া করে উত্তরটি পরীক্ষা করুন এবং ভোট দিন।
আশু

0

কোয়ান্টিনাদমের উত্তরের ভিত্তিতে

সুইফট 5.1

// size refers to the width/height of your tile images, by default is 256.0
// Seems to get better results using round()
// frame.width is the width of the MKMapView

let zoom = round(log2(360 * Double(frame.width) / size / region.span.longitudeDelta))

আপনাকে ধন্যবাদ, যখন মানচিত্রটি উত্তরের মুখোমুখি হচ্ছে তখন দুর্দান্ত দেখাচ্ছে। তবে আপনি যদি মানচিত্রটি ঘুরছেন? যদি পিঞ্চ কোণ 0 এর চেয়ে আলাদা হয় তবে কী হবে?
পিয়ের 23

0

MKMapViewএই উত্তরের উপর ভিত্তি করে সম্প্রসারণ (+ ভাসমান-পয়েন্ট জুম স্তরের যথার্থতা):

import Foundation
import MapKit

extension MKMapView {
    var zoomLevel: Double {
        get {
            return log2(360 * (Double(self.frame.size.width / 256) / self.region.span.longitudeDelta)) + 1
        }

        set (newZoomLevel){
            setCenterCoordinate(coordinate:self.centerCoordinate, zoomLevel: newZoomLevel, animated: false)
        }
    }

    private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Double, animated: Bool) {
        let span = MKCoordinateSpan(latitudeDelta: 0, longitudeDelta: 360 / pow(2, zoomLevel) * Double(self.frame.size.width) / 256)
        setRegion(MKCoordinateRegion(center: coordinate, span: span), animated: animated)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.