如何在苹果地图上加载JSON数据以放置标记IOS

Posted

技术标签:

【中文标题】如何在苹果地图上加载JSON数据以放置标记IOS【英文标题】:How to load JSON data on a apple map to put a marker IOS 【发布时间】:2014-01-04 16:53:03 【问题描述】:

您好,我有一个服务器 json 格式的文件,其中包含多个地图点:

["VALUE","proyect",["id":"1","name":"Frankie Johnnie & Luigo Too","address":"939 W El Camino Real, Mountain View, CA","lat":"37.386337","lng":"-122.085823",morepoints..]]

我想在我的 ios 应用程序中将这些点作为标记放在我的地图上。 我已经查看了几页和这里,但我没有找到任何东西,而且我尝试过的方法不起作用。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

首先,您首先解析您的 JSON:

NSError *error;
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSAssert(array, @"%s: JSONObjectWithData error: %@", __FUNCTION__, error);

其次,您可以从该***数组中获取位置数组,为该数组中的每个位置字典创建注释,并将其添加到您的地图中:

// the array of locations is the third object in the top-level array

NSArray *locations = array[2];

// now iterate through this array of locations

for (NSDictionary *location in locations)

    // grab the latitude and longitude strings

    NSString *latitudeString = location[@"lat"];
    NSAssert(latitudeString, @"No latitude");
    NSString *longitudeString = location[@"lng"];
    NSAssert(longitudeString, @"No longitude");

    // create the annotation and add it to the map

    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    annotation.coordinate = CLLocationCoordinate2DMake([latitudeString doubleValue], [longitudeString doubleValue]);
    annotation.title = location[@"name"];
    annotation.subtitle = location[@"address"];
    [self.mapView addAnnotation:annotation];


话虽如此,我必须说我不关心 JSON 格式:

["VALUE","proyect",["id":"1","name":"Frankie Johnnie & Luigo Too","address":"939 W El Camino Real, Mountain View, CA","lat":"37.386337","lng":"-122.085823",morepoints..]]

我们不得不猜测这个数组中的第一个、第二个和第三个对象是什么,这是一个值得怀疑的设计。我们不必神秘地抓住array[2] 来获取位置数组。

数组应该用于等价项目的列表(例如,位置数组非常有意义)。但是这个***数组有点可疑,包含三种语义不同类型的值,在 JSON 中没有任何内容可以指示这三个项是什么。

如果您不喜欢这种 JSON 格式,那么,上面的代码应该可以胜任。但是希望您可以将此处的***结构更改为字典,而不是数组,您可以在其中使用键名来标识此***字典中的各种项目,例如:

"id" : "VALUE", "project" : "proyect", "locations" : ["id":"1","name":"Frankie Johnnie & Luigo Too","address":"939 W El Camino Real, Mountain View, CA","lat":"37.386337","lng":"-122.085823",morepoints..]

我不知道前两个值应该是什么,所以我只称它们为idproject,但您显然应该使用真正反映前两个值的名称。但关键概念是使用字典,您可以在其中按名称引用位置数组。例如,如果 JSON 像我在这里建议的那样更改,则解析它的代码将变为:

NSError *error;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSAssert(dictionary, @"%s: JSONObjectWithData error: %@", __FUNCTION__, error);

NSArray *locations = dictionary[@"locations"];

此外,作为一种风格观察,许多人通常会将纬度和经度值表示为数字(不带引号),NSJSONSerialization 会将它们解析为NSNumber 对象而不是NSString 对象。但这取决于你。

【讨论】:

Rob,我正在尝试使用您的解决方案在我的地图中放置一个更好的标记,但我做不到。我怎样才能放 MapAnotations?谢谢 :)! @natijauskas 我不确定您所说的“更好的标记”是什么意思,但我建议您 (a) 查看 Location and Maps Programming Guide 的 Annotating Maps 部分; (b) 搜索 S.O. (或谷歌)关于自定义注释的文章,因为这已在其他地方详尽地介绍过; (c) 如果您仍然不清楚,请发布一个新问题,我相信有人可以为您指明正确的方向。【参考方案2】:

您需要解析 JSON 以检索每个点的数据,然后为每个点创建一个您自己的 MKMapViewAnnotation 实例并将它们添加到地图中。

更多信息在这里:http://maybelost.com/2011/01/a-basic-mapview-and-annotation-tutorial/

这里:How to add a Map annotation on MKMapView?

这里解析 JSON 的信息:http://www.appcoda.com/fetch-parse-json-ios-programming-tutorial/

【讨论】:

以上是关于如何在苹果地图上加载JSON数据以放置标记IOS的主要内容,如果未能解决你的问题,请参考以下文章

在 Firebase 数据库中的 MKMapView 上放置多个标记

如何在 Mapbox iOS 中的特定坐标上放置自定义注释的底部

如何在谷歌地图上一一加载标记动画[重复]

我想使用带有谷歌地图 SDK 的 JSON 放置多个标记

移动地图时,在谷歌地图中更新Ajax Json数组中的标记

如何在谷歌地图上放置标记