উত্তর:
আমি নিজেকে একটি সমাধান পেয়েছি, যা খুব সহজ এবং কৌশলটি করে। 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)
MKCoordinateRegionMakeWithDistance
হচ্ছে সুইফটে এখনও রয়েছে। এই সমাধান কাজ করে!
মানচিত্রের যে কোনও বিন্দুতে দ্রাঘিমাংশ রেখাগুলি সমানভাবে পৃথক করা হয়েছে তার উপর ভিত্তি করে, কেন্দ্রটি সমন্বিত এবং জুমলেভেল সেট করার জন্য খুব সাধারণ বাস্তবায়ন রয়েছে:
@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]; }
double z = log2(360 * ((self.mapView.frame.size.width/256) / self.mapView.region.span.longitudeDelta));
এটি অন্তর্নির্মিত নয়, তবে আমি এই কোডটি দেখেছি / ব্যবহার করেছি । এটি আপনাকে এটি ব্যবহার করতে দেয়:
[mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES];
দ্রষ্টব্য: এটি আমার কোড নয়, আমি এটি লিখিনি, সুতরাং এটির জন্য ক্রেডিট নিতে পারি না
আপনি এমকেসির্ডিনেটেজিগন ব্যবহার করে এবং এর স্প্যান অক্ষাংশ এবং দ্রাঘিমাংশ ব-দ্বীপ সেট করেও জুম করতে পারেন। নীচে একটি দ্রুত রেফারেন্স এবং এখানে আইওএস রেফারেন্স দেওয়া আছে। এটি অভিনব কিছু করবে না তবে মানচিত্রটি আঁকলে আপনাকে জুম সেট করার অনুমতি দেওয়া উচিত।
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];
আপনি যদি আউটলেট ব্যবহার করেন তবে একটি সাধারণ সুইফ্ট বাস্তবায়ন।
@IBOutlet weak var mapView: MKMapView! {
didSet {
let noLocation = CLLocationCoordinate2D()
let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500)
self.mapView.setRegion(viewRegion, animated: false)
}
}
@ কার্নালের উত্তরের ভিত্তিতে।
দ্রুত বাস্তবায়ন
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)
}
}
IBOutlet
আপনার টু map
, আপনি এটি হিসেবে সংজ্ঞায়িত MapViewWithZoom
একটি সহজ পরিবর্তে MKMapView
। তারপরে, আপনি কেবল map.zoomLevel = 1
বাmap.zoomLevel = 0.5
mapView.zoomLevel -= 2
জন্য সুইফট 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>
ল্যাটার -লম্বা- মিটারগুলি সংজ্ঞায়িত করুন এবং মানচিত্রভিউ আপনার মানগুলির সাথে জুম স্তরকে ফিট করবে।
@ আদিলসুমরোর দুর্দান্ত উত্তরের ভিত্তিতে । আমি এটি নিয়ে এসেছি:
@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
আমি আশা করি নিম্নলিখিত কোড খণ্ডগুলি আপনাকে সহায়তা করবে।
- (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 এর স্থানে যে কোনও মান বেছে নিতে পারেন। আমি দুটি বোতামের ক্লিকে এই পদ্ধতিগুলি ব্যবহার করেছি।
মানচিত্রের জুম এবং অবস্থানটি সংরক্ষণ এবং পুনরুদ্ধার করতে 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()
আমি জানি এটি দেরি করে দেওয়া জবাব, তবে আমি নিজেই জুম স্তরটি নির্ধারণের বিষয়টি সমাধান করতে চেয়েছিলাম। স্বর্ণমাইনের উত্তর দুর্দান্ত তবে আমি দেখতে পেলাম যে এটি আমার অ্যাপ্লিকেশনটিতে যথেষ্টভাবে কাজ করছে না।
কাছাকাছি পরিদর্শন করার সময় স্বর্ণমাইনে বলা হয়েছে যে "দ্রাঘিমাংশের রেখাগুলি মানচিত্রের যে কোনও স্থানে সমানভাবে পৃথক করা হয়েছে"। এটি সত্য নয়, এটি আসলে অক্ষাংশ রেখাগুলি যা -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
আশা করি এটি দেরী পর্যায়ে সহায়তা করবে।
এখানে, আমি আমার উত্তর এবং এটি দ্রুত 4.2 এর জন্য কাজ করে রেখেছি ।
কোয়ান্টিনাদমের উত্তরের ভিত্তিতে
সুইফট 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))
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)
}
}