MKMapView의 확대 / 축소 수준 설정
올바르게 표시되는 맵이 있는데, 이제 내가 원하는 유일한 것은로드 될 때 줌 레벨을 설정하는 것입니다. 이것을 할 수있는 방법이 있습니까?
감사
나는 매우 간단하고 트릭을 수행하는 해결책을 찾았습니다. 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 = MKCoordinateRegionMakeWithDistance(location.coordinate, CLLocationDistance(exactly: 5000)!, CLLocationDistance(exactly: 5000)!)
mapView.setRegion(mapView.regionThatFits(region), animated: true)
경도 선이지도의 어느 지점에서나 균등하게 떨어져 있다는 사실을 기반으로 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
내장되어 있지 않지만 이 코드를 보거나 사용 했습니다 . 이를 통해 다음을 사용할 수 있습니다.
[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];
신속한 구현
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)
}
}
콘센트를 사용하는 경우 간단한 Swift 구현.
@IBOutlet weak var mapView: MKMapView! {
didSet {
let noLocation = CLLocationCoordinate2D()
let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500)
self.mapView.setRegion(viewRegion, animated: false)
}
}
@Carnal의 답변을 기반으로합니다.
들어 스위프트 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>
위도 , 긴 미터를 정의하기 만하면 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];
}
You can choose any value in stead of 0.5 to reduce or increase zoom level. I have used these methods on click of two buttons.
I know this is a late reply, but I've just wanted to address the issue of setting the zoom level myself. goldmine's answer is great but I found it not working sufficiently well in my application.
On closer inspection goldmine states that "longitude lines are spaced apart equally at any point of the map". This is not true, it is in fact latitude lines that are spaced equally from -90 (south pole) to +90 (north pole). Longitude lines are spaced at their widest at the equator, converging to a point at the poles.
The implementation I have adopted is therefore to use the latitude calculation as follows:
@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
Hope it helps at this late stage.
A Swift 2.0 answer utilising NSUserDefaults to save and restore the map's zoom and position.
Function to save the map position and 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")
}
Run the function each time the map is moved:
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool)
{
saveMapRegion();
}
Function to save the map zoom and position:
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)
}
}
Add this to viewDidLoad:
restoreMapRegion()
Swift:
Map.setRegion(MKCoordinateRegion(center: locValue, latitudinalMeters: 200, longitudinalMeters: 200), animated: true)
locValue is your coordinate.
Here, I put my answer and its working for swift 4.2.
Based on quentinadam's answer
Swift 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))
참고URL : https://stackoverflow.com/questions/4189621/setting-the-zoom-level-for-a-mkmapview
'program story' 카테고리의 다른 글
java.lang.IllegalArgumentException : AppCompat가 현재 테마 기능을 지원하지 않습니다 (0) | 2020.08.06 |
---|---|
두 지리적 지점 사이의 거리를 가져옵니다 (0) | 2020.08.06 |
NA의 특정 열을 포함하는 행 생략 (0) | 2020.08.06 |
Angularjs : 오류 : [ng : areq] 인수 'HomeController'는 (는) 함수가 아니며 정의되지 않았습니다. (0) | 2020.08.06 |
pydot 및 graphviz 오류 : dot_parser를 가져올 수 없습니다. 도트 파일을로드 할 수 없습니다 (0) | 2020.08.06 |