【问题标题】:Get coordinates by giving name of place in iphone通过在 iphone 中给出地名来获取坐标
【发布时间】:2011-08-06 04:57:48
【问题描述】:

是否可以通过在 iPhone 中给出一个地点的名称来获取坐标?我不想使用任何 Web 服务,因为它们几乎没有限制。我可以使用 iPhone SDK 吗?

提前致谢。

【问题讨论】:

  • @NewTolphone:我认为我们不能......
  • 是的,你可以得到坐标,如果你的地名(基本地址)

标签: iphone cocoa-touch coordinates cllocationmanager


【解决方案1】:

正如@raj2raaz所说,我们不能仅通过指定地点的名称来获取坐标,您必须使用iPhone中的网络服务来获取坐标。

http://iphonesdksnippets.com/post/2010/02/15/Get-Coordinates-from-Address.aspx

【讨论】:

    【解决方案2】:

    简短的回答是否定的,您不能给出地址并获得经度/纬度位置。有几个人编写了使用不同 Web 服务的库,有关详细信息,请参阅此答案:Forward geocoding from the iPhone

    我知道你说过你不想使用各种网络服务,但是,你不能免费获得所有东西。某人的 CPU 周期将不得不进行搜索。在我看来,它们中的大多数都具有大多数应用程序都可以接受的术语。

    【讨论】:

    • 如果您在应用程序中包含地点数据库,则可以。 GeoNames 提供该数据。
    • 在某种程度上你是对的。我仍然认为答案是否定的,因为这个问题似乎是在要求 iPhone SDK 中的 API。不存在这样的 API。您的解决方案不是 SDK 中的 API,而是用于在本地存储该数据的大型项目。但是,有一些限制。例如,您只能搜索 Geonames 数据库实际提供的内容。例如,没有街道名称。它还可能使应用程序下载大小变大,除非应用程序具有目标区域。在许多情况下,网络解决方案会更好。
    • 因为问题说的是名字,所以我假设城市的名字。人口超过 15,000 人的城市的 Geonames 文件略多于 22,000 个城市。这对于 Core Data 来说非常小。如果他在将不想要的县添加到项目之前过滤掉它们,则它可能会更小。正如您所说,获取特定地址的纬度/经度要复杂得多。
    【解决方案3】:

    是的,这是可能的,但你必须做一些工作。我目前正在将这项工作投入到我的一个项目中。 GeoNames 地理数据库涵盖所有国家,包含超过 800 万个可免费下载的地名。我正在将他们的cites with population over 1,000 3.9M zip 文件 添加到我的项目中。它包含每个城市的经度/纬度。我将把每个城市解析成一个自定义的 NSObject 并将它们加载到Core Data

    在我的项目中,我不是搜索城市名称,而是查找特定纬度/经度坐标的壁橱城市。 Haversine formula 用于计算球体上两点之间的距离。这是用Objective-CPerl 编写的公式。 我目前解析该数据的进度可以在here 找到。我还有工作要完成。

    【讨论】:

    • 我想这在技术上是“使用 iPhone SDK”,但我将此问题解释为要求 SDK 中的 API 进行地理编码。这似乎有点不同。但它可能会解决问题,并且如果“地名”是一个相当小的可能性列表,它会很好地工作。
    【解决方案4】:

    你可以通过调用这个方法得到坐标。这个方法需要地址(地名)。

    -(CLLocationCoordinate2D) addressLocation:(NSString *)addrss {
        NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", 
                               [addrss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]];
        NSArray *listItems = [locationString componentsSeparatedByString:@","];
    
    double latitude = 0.0;
    double longitude = 0.0;
    
    if([listItems count] >= 4 && [[listItems objectAtIndex:0] isEqualToString:@"200"]) {
        latitude = [[listItems objectAtIndex:2] doubleValue];
        longitude = [[listItems objectAtIndex:3] doubleValue];
    }
    else {
        //Show error
    }
    CLLocationCoordinate2D location;
    location.latitude = latitude;
    location.longitude = longitude;
    
    return location;
    

    }

    【讨论】:

    • 他确实想使用任何互联网来获得答案。
    【解决方案5】:
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:YOUR_LOCATION completionHandler:^(NSArray* placemarks, NSError* error)     
    {
        NSLog(@"completed");
        if ( error )
        {
            NSLog(@"error = %@", error );
        }
        else
        {
            //Here you get information about the place in placemarks array
        }
    }];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2021-08-26
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多