2013-08-20 54 views
0

我想從服務器添加管腳並顯示它一個地圖。如何在線添加多個針腳/註釋?

通常情況下,我可以顯示引腳,但我想在線添加它。我有三個解析的json數據NAME,Longitude和Latitude。我已經解析了它的數組。我不知道如何查看地圖

CLLocationCoordinate2D annotationCoord; 

annotationCoord.latitude = 40.0000; 
annotationCoord.longitude = 29.000; 

MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init]; 
annotationPoint.coordinate = annotationCoord; 
annotationPoint.title = name; 

[self.locationMap addAnnotation:annotationPoint]; 

我試圖在for循環添加annotationCoord.latitudeannotationCoord.longitude上,但我得到這個錯誤「壞接收器類型‘CLLocationDegrees’(又名double)」我想我我犯了很大的錯誤,但是我不知道。請需要幫助。

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{ 

for (int i = 0; i < jsonArray.count; i++) { 

    NSString *lat = [jsonArray objectAtIndex:i]; 

    [annotationCoord.latitude addObject:lat]; 

} 

}

我的JSON回報:

response = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://kalkatawi.com/mapLocation.php"]]; 

NSError *parseError = nil; 

    jsonArray = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingAllowFragments error:&parseError]; 

    jsonArray1 = [[NSMutableArray alloc] init]; 
    jsonArray2 = [[NSMutableArray alloc] init]; 
    jsonArray3 = [[NSMutableArray alloc] init]; 

    for(int i=0;i<[jsonArray count];i++) 
    { 
     name = [[jsonArray objectAtIndex:i] objectForKey:@"name"]; 

     [jsonArray1 addObject:name];    
    } 

    for(int i=0;i<[jsonArray count];i++) 
    { 
     longitude = [[jsonArray objectAtIndex:i] objectForKey:@"longitude"]; 

     [jsonArray2 addObject:longitude];    
    } 

    for(int i=0;i<[jsonArray count];i++) 
    { 
     latitude = [[jsonArray objectAtIndex:i] objectForKey:@"latitude"]; 

     [jsonArray3 addObject:latitude];    
    } 

    self.locationMap.delegate = self; 
+0

是否'jsonArray'只包含緯度?最好爲每個註釋返回一個帶名稱,緯度和經度的JSON數組,而不是每個屬性的單獨數組。顯示返回的JSON數據的小樣本。 – Anna

+0

@AnnaKarenina我已經添加了我的json返回數據。如果我單獨返回每個jsonArray,這有什麼關係嗎? –

回答

0

基於更新的代碼,jsonArray已經是dictiona數組每個字典都會保存每個註釋的屬性。

我不明白你爲什麼要把它分成三個單獨的數組(每個屬性一個)。

爲什麼不使用jsonArray原樣創建註釋:

jsonArray = [NSJSONSerialization JSONObjectWithData:... 

self.locationMap.delegate = self; //set delegate before adding annotations 

for (int i=0; i < [jsonArray count]; i++) 
{ 
    NSDictionary *annotationDictionary = [jsonArray objectAtIndex:i]; 

    name = [annotationDictionary objectForKey:@"name"]; 

    annotationCoord.latitude 
     = [[annotationDictionary objectForKey:@"latitude"] doubleValue]; 
    annotationCoord.longitude 
     = [[annotationDictionary objectForKey:@"longitude"] doubleValue]; 

    MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init]; 
    annotationPoint.coordinate = annotationCoord; 
    annotationPoint.title = name; 

    [self.locationMap addAnnotation:annotationPoint]; 
} 

的問題更新的代碼也顯示出它通過jsonArray循環在didUpdateUserLocation委託方法。目前尚不清楚爲什麼在該委託方法中這樣做,但如果您計劃每次用戶移動時都更新地圖上的註釋,則可能還需要在添加之前移除所有/一些現有註釋,以避免重複註釋。

+0

它現在正在工作......當我看到很多教程時,我想我應該在'didUpdateUserLocation'委託方法而不是'viewDidLoad'中運行它並且有人告訴我每次都運行'FOR'loop,因爲它會很安全。謝謝 –

+0

而不是打開新的問題我怎麼能找到最近的針對我? –

+0

如果直線距離可以接受,則可以使用CLLocation類的distanceFromLocation方法。如果需要駕駛距離,目前的iOS SDK不提供此功能(並且您需要從第三方API獲取數據)。 – Anna

0

嘗試

- (void)addAnnotations:(NSArray *)annotations; 
的MKMapView

+0

你能告訴我更多的解釋嗎? –

0

在最佳答案中給出的解釋。我只是把這段代碼轉換成斯威夫特3.

斯威夫特3

jsonArray = JSONSerialization.jsonObjectWithData() 
locationMap.delegate = self 

for i in 0..<jsonArray.count() { 
var annotationDictionary = jsonArray[i] 
name = annotationDictionary["name"] 
annotationCoord.latitude = annotationDictionary["latitude"]! 
annotationCoord.longitude = annotationDictionary["longitude"]! 
var annotationPoint = MKPointAnnotation() 
annotationPoint.coordinate = annotationCoord 
annotationPoint.title = name 
locationMap.addAnnotation(annotationPoint) 
}