2013-01-16 9 views
8

Tôi đang phát triển ứng dụng iOS bao gồm GoogleMaps. Và quá trình triển khai GoogleMaps SDK for iOS đã được hoàn tất.Cách tính toán GMSCamera zoom

Nhưng tôi muốn biết cách tính toán GMSCamera zoom để hiển thị toàn bộ tuyến đường trên Bản đồ.

Trong Apple Map, chúng tôi sử dụng span, có thể. Nhưng GoogleMaps SDK không có span.

Vui lòng cho tôi lời khuyên.

Trả lời

3

Đây là một chức năng có thể giúp như thế này tính toán zoomLevel từ một MKMapView đó là "Google tương thích"

- (NSInteger)getZoomLevel 
{ 
     MKMapView *map = (MKMapView *)self.mapView; 
     CLLocationDegrees longitudeDelta = map.region.span.longitudeDelta; 
     CGFloat mapWidthInPixels = map.bounds.size.width; 
     double zoomScale = longitudeDelta * 85445659.44705395 * M_PI/(180.0 * mapWidthInPixels); 
     double zoomer = 20 - log2(zoomScale); 
     if (zoomer < 0) zoomer = 0; 

     return (NSInteger)zoomer; 
} 

Nếu bạn có thể lấy tọa độ và vượt qua những người trong thay vào đó bạn nên ok.

+0

Cảm ơn bạn rất nhiều! Tôi sẽ thử vào ngày mai! – AlfaromeoCorse

+0

Trợ giúp này có hoàn toàn không? –

+0

Toán học có tính toán quyền thu phóng không? Tại sao tôi có thu phóng nhỏ hơn trên bản đồ google so với bản đồ MapKit có cùng kinh độDelta ... – Jing

1

tôi đăng một câu trả lời cho một câu hỏi tương tự ở đây:

How to setRegion with google maps sdk for iOS?

Nó sử dụng một cách tiếp cận tương tự như câu trả lời của Lee: Chuyển đổi lat/lon để pixel, tính toán một tỷ lệ, sau đó một mức độ phóng.

3

phương pháp Lee là chính xác, nhưng toán học là không đúng, dựa trên google maps tài liệu sdk ios trên zoom

Tăng mức độ phóng bởi 1 đôi chiều rộng của thế giới trên màn hình . Do đó ở mức thu phóng N, chiều rộng của thế giới là khoảng 256 * 2^N, tức là ở mức thu phóng 2, toàn thế giới có diện tích khoảng 1024 điểm. Lưu ý rằng mức thu phóng không cần phải là số nguyên. Các mức độ thu phóng của được bản đồ cho phép phụ thuộc vào một số yếu tố bao gồm vị trí, loại bản đồ và kích thước màn hình.

Các toán học để tính toán zoom nên

zoom = log2(360 * mapView.bounds.size.width/ longitudeDelta) - 8; 
+1

Giải pháp vấn đề ngược lại ở đây: 'longitudeDelta = 360 * mapView.bounds.size.width/(1 << (zoom + 8)) ' – k06a

0

Jing, toán học của bạn là chính xác cho kinh độ, vĩ độ nhưng đối với nó phải được khôn lanh hơn một chút. Phép chiếu Mercator xử lý các vĩ độ và kinh độ khác nhau. Tôi đã đăng tải mã đúng ở đây: https://stackoverflow.com/a/16217785/2291425

18

Trên thực tế trong phiên bản hiện tại của SDK bạn có thể sử dụng fitBounds:

GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithPath:yourPath]; 
//There are several useful init methods for the GMSCoordinateBounds! 
GMSCameraUpdate *update = [GMSCameraUpdate fitBounds:bounds]; 
[mapView_ moveCamera:update]; 

Bằng cách này bạn hãy toán cho Google, và tôi khá chắc chắn họ thực sự tốt ở đó.

0

Swift:

//Create a path 
let path = GMSMutablePath() 

//for each point you need, add it to your path 
let position = CLLocationCoordinate2DMake(latitude, longitude) 
path.add(position) 

//Update your mapView with path 
let mapBounds = GMSCoordinateBounds(path: path) 
let cameraUpdate = GMSCameraUpdate.fit(mapBounds) 
mapView.moveCamera(cameraUpdate)