2009-07-22 50 views
83

Tôi quen với việc sử dụng API Javascript của Google Maps. Gần đây tôi bắt đầu sử dụng MapKit framework cho một dự án iphone, nhưng tôi đang gặp khó khăn trong việc tìm ra zoom và thiết lập một vùng trên bản đồ.Phóng to MKMapView và Vùng

Trong API Google Maps, tôi đã sử dụng các mức thu phóng nguyên như 8, 9, 10 cùng với hàm setZoom() đơn giản. Phương pháp tương đương duy nhất tôi có thể thấy trong khung công tác MapKit là setRegion: hoạt hình. Theo tôi hiểu, tôi cần đặt giá trị vĩ độ và kinh độ của vùng trong phạm vi khu vực để chỉ định mức thu phóng. Nhưng tôi thực sự không có ý tưởng về những giá trị này đại diện cho những gì (tôi đọc tài liệu).

Khi tôi sử dụng một đại biểu MKMapView và theo dõi các giá trị span trong regionDidChange kết quả phương pháp đại biểu dường như không tương quan lẫn nhau. It's ok khi tôi thu nhỏ và xem các giá trị delta span đang tăng lên như quy định trong tài liệu. Nhưng đột nhiên tôi kéo bản đồ mà không phóng to và giá trị delta trở thành 0.0.

Có thể ai đó vui lòng giải thích điểm tham chiếu đến khoảng cách và delta này là gì? Hoặc là có bất kỳ thuật toán để chuyển đổi một mức độ zoom số nguyên (như 9) để các giá trị delta?

Như một câu hỏi tiền thưởng là có cách nào để xác định một mức zoom tối thiểu-tối đa trên một MKMapView :)

Cảm ơn

Trả lời

133

Trước hết, MKMapView không sử dụng/có các mức thu phóng được xác định trước như Google Maps.

Thay vào đó, vùng hiển thị của một MKMapView được mô tả bằng MKCoordinateRegion, trong đó bao gồm hai giá trị:

  1. trung tâm (điểm trung tâm của khu vực), và
  2. khoảng (kích thước của khu vực nhìn thấy xung quanh trung tâm).

Điểm trung tâm nên rõ ràng (đó là điểm trung tâm của khu vực.)

Tuy nhiên, khoảng thời gian (mà là một MKCoordinateSpan) bao gồm:

  1. latitudeDelta (khoảng cách thẳng đứng biểu diễn bởi khu vực này), và
  2. longitudeDelta (khoảng cách ngang đại diện theo vùng).

Ví dụ ngắn gọn. Dưới đây là một MKCoordinateRegion đồ chơi:

  1. trung tâm:
    • vĩ độ: 0
    • kinh độ: 0
  2. gian tồn tại:
    • latitudeDelta: 8
    • longitudeDelta: 6

Khu vực này có thể được mô tả bằng phút và tối đa phối như sau:

  1. phút tọa độ (thấp hơn điểm bên trái):
    • vĩ độ: -4
    • longitude : -3
  2. tọa độ tối đa (phía trên bên phải):
    • vĩ độ: 4
    • kinh độ: 3

Vì vậy, bạn có thể xác định mức thu phóng xung quanh một điểm trung tâm bằng cách sử dụng một cách thích hợp kích thước MKCoordinateSpan. Là mức xấp xỉ của các mức thu phóng số của Google, bạn có thể đảo ngược kỹ thuật các kích thước khoảng thời gian mà Google sử dụng cho một mức thu phóng nhất định và tạo một khoảng thời gian cho phù hợp. (Google mô tả các vùng xem của họ theo cùng cách mà MKMapView làm, như là một trung tâm + span, vì vậy bạn có thể kéo các giá trị này ra khỏi Google Maps.)

Vì hạn chế khu vực, bạn có thể chơi với phương thức ủy nhiệm này :

mapView:regionWillChangeAnimated 

ví dụ: bằng cách thay đổi kích thước khu vực trở lại các mức thu phóng được phép của bạn. (Loại giống như cách xem bảng sẽ cho phép bạn di chuyển qua các cạnh, nhưng sau đó sẽ ban nhạc cao su trở lại vào vị trí.) Tuy nhiên, mileage của bạn có thể khác nhau, vì tôi đã không sử dụng nó cho mục đích này.

btw, có các bản sửa lỗi/cải tiến rõ ràng trong OS 3.1 đối với các khía cạnh của MapKit khiến tôi gặp rắc rối trong 3.0.

+0

đẹp mô tả mà cho tôi biết điều cơ bản. Upvoted !!! – NSPratik

+0

@Kelvin, bạn có thể mô tả chi tiết hơn cách "đảo ngược kỹ sư các kích thước khoảng thời gian mà Google sử dụng cho một mức thu phóng nhất định và tạo một khoảng không". Tôi thực sự cần nó –

4

Tuổi là ở mức độ vĩ độ và kinh độ. Có một phương pháp để xây dựng các cấu trúc MKCoordinateRegion có khoảng cách thay thế. Nó có thể là bạn đang sử dụng MKCoordinateRegionMakeWithDistance để xác định khoảng, và sau đó khi bạn kiểm tra nó trong regionDidChange, bạn đang nhìn thấy tại lat/long span, đó là cách nó được lưu trữ trong một cấu trúc MKCoordinateRegion.

Theo như tôi biết, các mức thu phóng nguyên không có sẵn hoặc hữu ích chút nào khi làm việc với MKMapKit. Cá nhân tôi thích sử dụng các số liệu khoảng, linh hoạt hơn.

Bạn không thể chỉ định thu phóng tối đa và tối thiểu và tôi không biết cách nào để hack nó. MKMapKit thực sự khá yếu ngay bây giờ, tôi khá thất vọng vì thiếu tính năng.

3

So sánh nhanh các mức thu phóng cho một vị trí bằng maps.google.com bằng cách kiểm tra các chuỗi truy vấn liên kết cho thấy dx và dy giá trị khoảng tăng hệ số 2:

(0.005334, 0.011834) starting span 
(0.010668, 0.023668) dx: x2, dy: x2 
(0.021335, 0.047337) dx: x2, dy: x2 
(0.042671, 0.094671) dx: x2, dy: x2 
    ... 
117

Nếu bạn thích sử dụng mức zoom rõ ràng thay vì xác định một MKCoordinateSpan, tôi đã viết một loại bổ sung hỗ trợ cho việc xác định mức thu phóng của MKMapView. Mã này có thể được tìm thấy here.

+0

Bài đăng thực sự thú vị, cảm ơn liên kết. –

+4

Bài đăng trên blog của Troy đã giúp tôi hiểu rõ về cách mapkit và bản đồ google hoạt động. Tôi rất khuyên bạn nên đọc nó. – afarnham

+1

người đàn ông làm việc tuyệt vời .. trong phân tích chuyên sâu .. – harshalb

2

Danh mục của Brant trên MKMapView hoạt động tốt. Tuy nhiên, có vẻ như nó chưa được cập nhật để hỗ trợ các thiết bị mới hơn với màn hình võng mạc khi tính toán mapSizeInPixels.

Nó có thể được cố định bằng cách thay thế dòng này:

CGSize mapSizeInPixels = mapView.bounds.size; 

Với dòng này:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale); 
Các vấn đề liên quan