ฉันมีแผนที่ที่แสดงอย่างถูกต้องสิ่งเดียวที่ฉันต้องการทำตอนนี้คือตั้งระดับการซูมเมื่อโหลด มีวิธีทำไหม?
ขอบคุณ
ฉันมีแผนที่ที่แสดงอย่างถูกต้องสิ่งเดียวที่ฉันต้องการทำตอนนี้คือตั้งระดับการซูมเมื่อโหลด มีวิธีทำไหม?
ขอบคุณ
คำตอบ:
ฉันพบวิธีแก้ปัญหาด้วยตัวเองซึ่งทำได้ง่ายมาก ใช้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
ยังคงอยู่ใน Swift วิธีนี้ใช้ได้ผล!
จากข้อเท็จจริงที่ว่าเส้นลองจิจูดมีระยะห่างเท่า ๆ กันที่จุดใด ๆ ของแผนที่มีการใช้งานที่ง่ายมากในการตั้งค่า centerCoordinate และ 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));
มันไม่ได้ในตัว แต่ผมเคยเห็น / ใช้นี้รหัส สิ่งนี้ช่วยให้คุณใช้สิ่งนี้:
[mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES];
หมายเหตุ: นี่ไม่ใช่รหัสของฉันฉันไม่ได้เขียนไว้ดังนั้นจึงไม่สามารถรับเครดิตได้
คุณยังสามารถซูมได้โดยใช้ MKCoordinateRegion และตั้งค่าสแปนละติจูดและลองจิจูด ด้านล่างนี้เป็นข้อมูลอ้างอิงโดยย่อและนี่คือข้อมูลอ้างอิงของ iOS จะไม่ทำอะไรแฟนซี แต่ควรให้คุณตั้งค่าการซูมเมื่อวาดแผนที่
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];
การใช้งาน Swift อย่างง่ายหากคุณใช้ร้านค้า
@IBOutlet weak var mapView: MKMapView! {
didSet {
let noLocation = CLLocationCoordinate2D()
let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500)
self.mapView.setRegion(viewRegion, animated: false)
}
}
จากคำตอบของ @ Carnal
การใช้งานอย่างรวดเร็ว
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
สำหรับSwift 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)
}
เพียงกำหนด lat-, long-Meters <CLLocationDistance>
แล้ว mapView ก็จะปรับระดับการซูมให้พอดีกับค่าของคุณ
บนพื้นฐานที่ดี @ AdilSoomro ของคำตอบ ฉันได้คิดสิ่งนี้:
@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 เพื่อลดหรือเพิ่มระดับการซูม ฉันใช้วิธีการเหล่านี้เมื่อคลิกปุ่มสองปุ่ม
คำตอบ Swift 2.0 ที่ใช้ NSUserDefaults เพื่อบันทึกและเรียกคืนการซูมและตำแหน่งของแผนที่
ฟังก์ชั่นบันทึกตำแหน่งแผนที่และซูม:
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)
}
}
เพิ่มสิ่งนี้ใน viewDidLoad:
restoreMapRegion()
ฉันรู้ว่านี่เป็นการตอบกลับช้า แต่ฉันแค่อยากจะแก้ปัญหาเรื่องการตั้งค่าระดับการซูมด้วยตัวเอง คำตอบของ goldmine ดีมาก แต่ฉันพบว่ามันทำงานได้ไม่ดีพอในแอปพลิเคชันของฉัน
จากการตรวจสอบอย่างใกล้ชิด goldmine ระบุว่า "เส้นลองจิจูดมีระยะห่างเท่า ๆ กันที่จุดใด ๆ ของแผนที่" นี่ไม่เป็นความจริง แต่เป็นเส้นละติจูดที่มีระยะห่างเท่ากันตั้งแต่ -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
หวังว่ามันจะช่วยในช่วงปลายนี้
สวิฟท์:
Map.setRegion(MKCoordinateRegion(center: locValue, latitudinalMeters: 200, longitudinalMeters: 200), animated: true)
locValue คือพิกัดของคุณ
ขึ้นอยู่กับคำตอบของ quentinadam
สวิฟต์ 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)
}
}