【问题标题】:Calculate the distance between two points in iphone计算iphone中两点之间的距离
【发布时间】:2011-04-23 03:34:33
【问题描述】:

我正在创建一个要求用户输入两个地方(邮政编码)的应用程序。我的应用程序将计算这两点之间的行驶距离并输出结果。用户可以选择添加航点。 我想我必须使用谷歌地图 API 并获取一个带有结果的 xml 文件,然后解析 xml 文件。谁能帮助我,因为我不知道该怎么做。 感谢所有帮助。

示例... 开始:BR1 1LR

航路点:BR2 0LH

航点:BR3 4AY

目的地:BR1 1LR

【问题讨论】:

  • 您需要什么类型的输入?
  • 邮政编码将通过文本字段输入并计算它们之间的距离

标签: iphone xcode google-maps distance


【解决方案1】:

是的,你可以计算距离,因为你需要有纬度和经度才能得到距离。Objective C提供了计算点之间距离的方法 这是一个例子......

float distance =[mUserCurrentLocation distanceFromLocation:location1]/1000;

这将为您提供以公里为单位的距离。

【讨论】:

    【解决方案2】:

    我知道这已经很晚了,但我会发布我的解决方案,以防有人需要。

    首先,我声明了 URL(调用 google maps api 的那个)

    #define DST_API @"http://maps.googleapis.com/maps/api/distancematrix/xml?origins=%@&destinations=%@&units=%@&sensor=false"
    

    接下来我创建了一个包含此 URL 的字符串:

    NSString *URL = [NSString stringWithFormat:DST_API, source, destination, units];
    

    source、destination 是包含起点和终点的字符串。单位可以是@"imperial" 或@"metric"。 现在我有了 URL,我会得到一个 xml 字符串。为了解析这个,我使用了 TBXML。关于使用哪个 XML Parser 总是存在很大的争论。我使用了TBXML,因为它很简单,而且是fastest

    TBXML *directionsParser = [[TBXML alloc] initWithURL:[NSURL URLWithString:URL]];
    
    // Check if the Overall status is OK
    TBXMLElement *root = directionsParser.rootXMLElement;
    TBXMLElement *element = [TBXML childElementNamed:@"status" parentElement:root]; 
    NSString *value = [TBXML textForElement:element];
    if ([value caseInsensitiveCompare:@"OK"] != NSOrderedSame) {
        [directionsParser release];
        return result;
    }
    

    检查根状态OK后,获取XPath表达式的结果://row/element/distance/value

    element = [TBXML childElementNamed:@"row" parentElement:root];
    element = [TBXML childElementNamed:@"element" parentElement:element];
    element = [TBXML childElementNamed:@"status" parentElement:element];
    value = [TBXML textForElement:element];
    
    // Check if the Element status is OK
    if ([value caseInsensitiveCompare:@"OK"] != NSOrderedSame) {
            [directionsParser release];
        return result;
    }
    
    element = element->parentElement;
    
    element = [TBXML childElementNamed:@"distance" parentElement:element];
    
    //Note if you want the result as text, replace 'value' with 'text'
    element = [TBXML childElementNamed:@"value" parentElement:element];
    
    NSString *result = [TBXML textForElement:element];
    
    [directionsParser release];
    //Do what ever you want with result
    

    如果有人想要一个包含路径点的 URL,那么这里就是

    #define DIR_API @"http://maps.googleapis.com/maps/api/directions/xml?origin=%@&destination=%@&waypoints=%@&units=%@&sensor=false"
    

    但要使用航路点,正如 Jano 指出的那样,事情的运作方式会有所不同。

    【讨论】:

    【解决方案3】:

    如果您想要道路距离,您需要询问 Google,然后使用 XML 解析器和 XPath 表达式 //leg/step/distance/value 解析 resulting XML,这将为您提供所有距离,您必须求和。有关解析 xml 和使用 XPath 表达式的信息,请参阅 this

    【讨论】:

    • 如果我从这个 URL 获取 xml 文件,我认为它应该可以工作。只有我不确定哪个是行驶距离。是//腿/步数/距离/值吗?单位是公里还是英里? maps.googleapis.com/maps/api/directions/… 我应该使用哪种类型的 xml 解析?例如:NSXMLParser、libxml2 等
    • 我会将 libxml2 与此一起用于 XPath:cocoawithlove.com/2008/10/…,因为它比 NSXMLParser 更快且内存使用量更少。测量单位在 //leg/step/distance/value 元素中指示,即行驶距离。
    【解决方案4】:

    distanceFromLocation: 方法将为您提供任意两个 CLLocation 点之间的绝对距离,而不是行驶距离。为此,您必须使用您所怀疑的 Google Maps API。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2011-04-23
      • 2014-11-14
      • 1970-01-01
      • 2017-08-27
      • 2015-08-16
      相关资源
      最近更新 更多