Jawaban:
Saya menemukan solusi untuk diri saya sendiri, yang sangat sederhana dan berhasil. Gunakan MKCoordinateRegionMakeWithDistance
untuk mengatur jarak dalam meter secara vertikal dan horizontal untuk mendapatkan zoom yang diinginkan. Dan tentu saja ketika Anda memperbarui lokasi Anda, Anda akan mendapatkan koordinat yang tepat, atau Anda dapat menentukannya langsung di CLLocationCoordinate2D
saat startup, jika itu yang perlu Anda lakukan:
CLLocationCoordinate2D noLocation;
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500);
MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:viewRegion];
[self.mapView setRegion:adjustedRegion animated:YES];
self.mapView.showsUserLocation = YES;
Cepat:
let location = ...
let region = MKCoordinateRegion( center: location.coordinate, latitudinalMeters: CLLocationDistance(exactly: 5000)!, longitudinalMeters: CLLocationDistance(exactly: 5000)!)
mapView.setRegion(mapView.regionThatFits(region), animated: true)
MKCoordinateRegionMakeWithDistance
masih ada di Swift. Solusi ini berhasil!
Berdasarkan fakta bahwa garis bujur diberi jarak yang sama pada titik mana pun di peta, terdapat implementasi yang sangat sederhana untuk menyetel centerCoordinate dan zoomLevel:
@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));
Itu tidak ada di dalamnya, tetapi saya telah melihat / menggunakan kode ini . Ini memungkinkan Anda untuk menggunakan ini:
[mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES];
Catatan: Ini bukan kode saya, saya tidak menulisnya, jadi karena itu tidak dapat mengambil kredit untuk itu
Anda juga dapat memperbesar dengan menggunakan MKCoordinateRegion dan mengatur rentang lintang & bujur delta. Di bawah ini adalah referensi cepat dan di sini adalah referensi iOS. Itu tidak akan melakukan sesuatu yang mewah tetapi harus memungkinkan Anda untuk mengatur zoom saat menggambar peta.
MKCoordinateRegion region;
region.center.latitude = {desired lat};
region.center.longitude = {desired lng};
region.span.latitudeDelta = 1;
region.span.longitudeDelta = 1;
mapView.region = region;
Edit 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];
Implementasi Swift sederhana, jika Anda menggunakan outlet.
@IBOutlet weak var mapView: MKMapView! {
didSet {
let noLocation = CLLocationCoordinate2D()
let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500)
self.mapView.setRegion(viewRegion, animated: false)
}
}
Berdasarkan jawaban @ Carnal.
Implementasi yang cepat
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
Anda sendiri map
, Anda mendefinisikannya sebagai MapViewWithZoom
bukan yang sederhana MKMapView
. Kemudian, Anda dapat mengatur level zoom dengan map.zoomLevel = 1
ataumap.zoomLevel = 0.5
mapView.zoomLevel -= 2
Untuk Swift 3 ini cukup cepat:
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)
}
Cukup tentukan Lat-, long-Meter <CLLocationDistance>
dan mapView akan menyesuaikan tingkat zoom dengan nilai Anda.
Berdasarkan jawaban hebat @ AdilSoomro . Saya telah menemukan ini:
@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
Saya harap potongan kode berikut akan membantu Anda.
- (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];
}
Anda dapat memilih nilai apa pun sebagai ganti 0,5 untuk mengurangi atau meningkatkan level zoom. Saya telah menggunakan metode ini dengan mengklik dua tombol.
Jawaban Swift 2.0 yang memanfaatkan NSUserDefaults untuk menyimpan dan memulihkan zoom dan posisi peta.
Fungsi untuk menyimpan posisi peta dan zoom:
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")
}
Jalankan fungsinya setiap kali peta dipindahkan:
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool)
{
saveMapRegion();
}
Fungsi untuk menyimpan zoom dan posisi peta:
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)
}
}
Tambahkan ini ke viewDidLoad:
restoreMapRegion()
Saya tahu ini adalah jawaban yang terlambat, tetapi saya hanya ingin mengatasi masalah pengaturan tingkat zoom sendiri. Jawaban goldmine bagus tetapi saya merasa tidak berfungsi dengan baik dalam aplikasi saya.
Pada pemeriksaan lebih dekat, tambang emas menyatakan bahwa "garis bujur memiliki jarak yang sama di setiap titik peta". Ini tidak benar, sebenarnya garis lintang yang diberi jarak yang sama dari -90 (kutub selatan) hingga +90 (kutub utara). Garis bujur diberi jarak terlebar di ekuator, menyatu ke satu titik di kutub.
Oleh karena itu, implementasi yang saya adopsi adalah dengan menggunakan perhitungan garis lintang sebagai berikut:
@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
Semoga membantu pada tahap akhir ini.
Di sini, saya meletakkan jawaban saya dan bekerja untuk 4.2 cepat .
Berdasarkan jawaban quentinadam
Swift 5.1.0
// 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
ekstensi berdasarkan jawaban ini (+ akurasi tingkat zoom floating-point):
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)
}
}