2009-10-29 83 views
6

Tôi muốn đặt cơ sở để hiển thị khoảng cách giữa hai địa điểm được người dùng chọn.Cách tính khoảng cách giữa hai địa điểm? Có dịch vụ nào của Google Map dành cho iphone không?

Có sẵn mã nguồn/dịch vụ mẫu nào để làm như vậy không?

Xin cảm ơn trước.

+1

Đó có phải là khoảng cách ngắn nhất giữa hai nơi, hoặc sau một con đường đặc biệt (đường bộ, đường sắt, sông, ...) –

Trả lời

12

Các CoreLocation Framework cung cấp khả năng để làm việc ra các khoảng cách, tính bằng mét, giữa hai điểm:

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location 

Bạn có thể khởi tạo một đối tượng CLLocation với vĩ độ và kinh độ:

- (id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude 
+0

Cảm ơn ... của nó? – Rambo

2

Đây là nhiệm vụ cho khung CLLocation. Với các tọa độ đã biết của 2 điểm bạn có thể tạo (nếu bạn chưa có chúng) 2 đối tượng CLLocation và tìm khoảng cách giữa chúng bằng cách sử dụng

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location 

.

3

Nếu bạn có hai đối tượng CLLocation, bạn chỉ có thể làm:

[location1 getDistanceFrom:location2]; 

Tuy nhiên, đó chỉ là point-to-point. Nếu bạn muốn khoảng cách trên một con đường cụ thể, tốt, đó là một ấm đun nước khác của cá.

2

Tôi không quen thuộc với việc phát triển iPhone, nhưng đây là mã C# để tính toán khoảng cách giữa hai điểm bằng cách sử dụng công thức Haversine:

/// <summary> 
/// Computes the distance beween two points 
/// </summary> 
/// <param name="P1_Latitude">Latitude of first point (in radians).</param> 
/// <param name="P1_Longitude">Longitude of first point(in radians).</param> 
/// <param name="P2_Latitude">Latitude of second point (in radians).</param> 
/// <param name="P2_Longitude">Longitude of second point (in radians).</param> 
protected double ComputeDistance(double P1_Longitude, double P1_Latitude, double P2_Longitude, double P2_Latitude, MeasurementUnit unit) 
{    
    double dLon = P1_Longitude - P2_Longitude; 
    double dLat = P1_Latitude - P2_Latitude; 

    double a = Math.Pow(Math.Sin(dLat/2.0), 2) + 
      Math.Cos(P1_Latitude) * 
      Math.Cos(P2_Latitude) * 
      Math.Pow(Math.Sin(dLon/2.0), 2.0); 

    double c = 2 * Math.Asin(Math.Min(1.0, Math.Sqrt(a))); 
    double d = (unit == MeasurementUnit.Miles ? 3956 : 6367) * c; 
    return d; 

} 

Các MeasurementUnit được định nghĩa là:

/// <summary> 
/// Measurement units 
/// </summary> 
public enum MeasurementUnit 
{ 
    Miles, 
    Kilometers 
} 
+0

Cảm ơn vbocan vì phản hồi của bạn – Rambo

0

Nó phụ thuộc vào loại chênh lệch bạn muốn có giữa hai điểm. Trên bản đồ tôi nghĩ rằng bạn không muốn khoảng cách không khí. Sau đó, bạn nên kiểm tra http://iosboilerplate.com/

Nếu bạn vẫn muốn sử dụng khoảng cách không khí, hãy sử dụng Vị trí chính.

0
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location 

Trả về khoảng cách (tính bằng mét) từ vị trí của người nhận đến vị trí đã chỉ định. (Không dùng nữa trong iOS 3.2 Sử dụng các distanceFromLocation:.

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location 
Các vấn đề liên quan