2012-03-20 45 views
6

Tôi hiện đang làm việc với MKMapView và tôi đang cố gắng để dữ liệu xuất hiện trên màn hình. Để thực hiện điều này, tôi đã quyết định tạo một MapDataProvider nhỏ để tạo ra một mảng các đối tượng MKAnnotation - mỗi đối tượng chứa một tọa độ với các giá trị vĩ độ và kinh độ ngẫu nhiên.MKMapView Vĩ độ và Kinh độ Tọa độ

Tôi đã đảm bảo rằng MKMapView của tôi được nối với bộ điều khiển và mảng đối tượng MKAnnotation đến từ MapDataProvider của tôi một cách chính xác ... nhưng vì lý do nào đó .. khi tôi thử và xác định tọa độ ở Bắc Mỹ (ví dụ 48, -84) .. không có gì xuất hiện trên MKMapView.

Sau khi chơi xung quanh tôi phát hiện ra rằng bất kỳ giá trị kinh độ nhỏ hơn 0 mang lại cho tôi vấn đề này.

Tôi đã thử xác minh giá trị tọa độ cho từng đối tượng MKAnnotation trong bộ sưu tập của tôi, nhưng CLLocation2DIsValue() tiếp tục trả về false.

Câu hỏi:

gì loạt các giá trị tôi có thể nhập cho vĩ độ và kinh độ cho một CLLocationCoordinate2D để chân của tôi xuất hiện ở Bắc Mỹ?

Để cung cấp cho bối cảnh nhiều hơn một chút, đây là phương pháp được áp dụng trong các MapDataProvider:

+ (NSArray *) getMockMapData {

NSMutableArray *tempMapData = [[NSMutableArray alloc] initWithCapacity:15]; 

for (int i=0; i< 15; i++) { 

    double latitude = rand()%20 +50; 
    double longitude = -107 + rand()%10; 

    CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(latitude, longitude); 

    if(CLLocationCoordinate2DIsValid(coord) == NO) 
     continue; 

    [tempMapData addObject:[MockMapData 
          dataForValues:[@"Item " stringByAppendingString:[[NSNumber numberWithInt:i] description]] 
           subTitle:[@"Item " stringByAppendingString:[[NSNumber numberWithInt:i]description]] 
           coordinate:coord]]; 
    } 
    return tempMapData; 
} 
+1

Vĩ độ có thể từ -90 đến 90 và kinh độ có thể từ -180 đến 180 vì vậy 48, -84 là hợp lệ. Bạn có thể đăng mã để thêm chú thích không? – Anna

+0

Cảm ơn bạn đã trả lời. Sau khi chơi xung quanh với nó một số chi tiết, tôi chuyển ra arcrandom cho rand và thay đổi đó chính xác vấn đề của tôi. – dpalmajr

+0

Cập nhật nguồn với bản sửa lỗi mới nhất. – dpalmajr

Trả lời

3

mã ban đầu của bạn là thế này:

double latitude = arcrandom()%20 +50; 
double longitude = -107 + arcrandom()%10; 

(Thực ra, bạn có thể có arc4random, không phải arcrandom.)


Hàm arc4random trả về giá trị nguyên không dấu.

Trừ một số nguyên (-107) khỏi giá trị đó dẫn đến tràn mà cung cấp các giá trị như 4294967189. Đó chắc chắn sẽ là kinh độ không hợp lệ.

Thay vì chuyển sang rand (mà tài liệu nói là "xấu bộ tạo số ngẫu nhiên"), sử dụng arc4random (mà tôi tin là ưu tiên) và buộc một tính toán dấu chấm động bằng cách viết -107.0 thay vì -107:

double latitude = arc4random()%20 +50; 
double longitude = -107.0 + arc4random()%10; 


Điểm không liên quan là nếu CLLocationCoordinate2DIsValid nói NO, bạn chỉ đang thực hiện return mà không gửi lại bất kỳ giá trị nào (bạn cần theo khai báo phương pháp). Hoặc là return tempMapData; hoặc continue;.

+0

Câu trả lời kỹ lưỡng. Cảm ơn bạn đã giải thích sự khác biệt giữa các trình tạo số ngẫu nhiên mà tôi gặp phải. Về tuyên bố 'trả lại' ngẫu nhiên, bạn hoàn toàn đúng. Tôi thường không làm điều đó, nhưng với mục đích mang lại cho mọi người một chút ngữ cảnh hơn (và đơn giản là nhận được một cái gì đó và chạy) Tôi nghĩ tôi sẽ làm cho ngoại lệ. – dpalmajr

0

Canappi dựa trên ngôn ngữ lập trình đơn giản, mdsl, được sử dụng để tạo mã Objective-C cho iOS. Họ có một điều khiển bản đồ cho phép bạn đạt được những gì bạn cần từ một bộ mô tả đơn giản. Như ví dụ này cho thấy, bạn có thể sử dụng các vị trí chốt đẩy tĩnh hoặc các vị trí động:

map venuMap (32,610,708,360) { 
    Standard ; 
    show user ; 
    area .1,.1; 
    //location 30.275806,-97.740128 ('TX Capital' , '1200 N Congress'); 
    locationReference lat, long (sDetTitle, address); 
} 

Mã được tạo sẽ mở ra, vì vậy bạn có thể sao chép và dán lại vào ứng dụng của mình.

Các vấn đề liên quan