MKMapView Zoom và khu vực


85

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 khung MapKit cho một dự án iPhone, nhưng tôi gặp khó khăn trong việc tìm cách thu phóng và thiết lập một khu vực trên bản đồ.

Trong API Google Maps, tôi đã từng sử dụng các mức thu phóng số 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 mà tôi có thể thấy trong khung công tác MapKit là setRegion: animation. Theo tôi hiểu, tôi cần đặt các giá trị "đồng bằng" vĩ độ và kinh độ của một vùng để chỉ định mức thu phóng. Nhưng tôi thực sự không biết những giá trị này đại diện cho điều gì (tôi đã đọc tài liệu).

Khi tôi sử dụng đại biểu MKMapView và theo dõi các giá trị span trong phương thức đại biểu regionDidChange, kết quả dường như không tương quan với nhau. Sẽ ổn khi tôi thu nhỏ và thấy các giá trị nhịp delta đang tăng lên như được chỉ định trong tài liệu. Nhưng đột nhiên tôi kéo bản đồ mà không thu phóng và các giá trị delta trở thành 0,0.

Ai đó có thể vui lòng giải thích điểm tham chiếu đến những khoảng và đồng bằng này là gì không? Hoặc có thuật toán nào để chuyển đổi mức thu phóng số nguyên (như 9) thành các giá trị delta này không?

Như một câu hỏi bổ sung là có cách nào để chỉ định mức thu phóng tối thiểu-tối đa trên MKMapView :)

Cảm ơn

Câu trả lời:


134

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

Thay vào đó, vùng hiển thị của MKMapView được mô tả bằng cách sử dụng MKCoosystemRegion , bao gồm hai giá trị:

  1. trung tâm (điểm trung tâm của khu vực) và
  2. span (kích thước của vùng hiển thị xung quanh tâm).

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

Tuy nhiên, span (là một MKCoosystemSpan ) bao gồm:

  1. vĩ độDelta (khoảng cách thẳng đứng được đại diện bởi khu vực) và
  2. longitudeDelta (khoảng cách nằm ngang được đại diện bởi vùng).

Một ví dụ ngắn gọn. Đây là một món đồ chơi MKCoo'sRegion:

  1. trung tâm:
    • vĩ độ: 0
    • kinh độ: 0
  2. nhịp:
    • vĩ độ Đồng bằng: 8
    • kinh độDelta: 6

Khu vực có thể được mô tả bằng cách sử dụng tọa độ tối thiểu và tối đa của nó như sau:

  1. tọa độ tối thiểu (điểm dưới bên trái):
    • vĩ độ: -4
    • kinh độ: -3
  2. tọa độ tối đa (điểm trên bên phải):
    • vĩ độ: 4
    • kinh độ: 3

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

Đối với việc hạn chế khu vực, bạn có thể chơi với phương thức ủy quyền này:

mapView:regionWillChangeAnimated

ví dụ: bằng cách thay đổi kích thước khu vực trở lại mức thu phóng được phép của bạn. (Giống như cách các chế độ xem bảng sẽ cho phép bạn cuộn qua mép, nhưng sau đó dây cao su sẽ trở lại đúng vị trí.) Tuy nhiên, số dặm của bạn có thể thay đổi, vì tôi không sử dụng nó cho mục đích này.

btw, có những bản sửa lỗi / cải tiến nhất định trong OS 3.1 đối với các khía cạnh của MapKit đã gây ra cho tôi sự cố trong phiên bản 3.0.


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

118

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


4
Các bài đăng trên blog của Troy đã cho tôi sự hiểu biết sâu sắc về cách hoạt động của mapkit và google maps. Tôi rất khuyên bạn nên đọc nó.
Aaron

5
git: //github.com/jdp-global/MKMapViewZoom.git
johndpope

@JohnMerlino có nó
Zoltán Matók

5

Khoảng theo độ vĩ độ và kinh độ. Thay vào đó, có một phương pháp để xây dựng cấu trúc MKCoosystemRegion cần khoảng cách. Có thể bạn đang sử dụng MKCoosystemRegionMakeWithDistance để chỉ định khoảng thời gian và sau đó khi bạn kiểm tra nó trong regionDidChange, bạn sẽ thấy ở khoảng thời gian vĩ độ / dài, đó là cách nó được lưu trữ trong cấu trúc MKCoosystemRegion.

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

Bạn không thể chỉ định zoom 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 chuỗi truy vấn liên kết cho thấy rằng các giá trị dx và dy span tăng theo 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
  ...

2

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

Nó có thể được sửa chữa 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.