2010-02-02 38 views
21

sử dụng giá trị Vĩ độ và Kinh độ (Điểm A), tôi đang cố gắng tính Điểm B, X mét khác mang 0 radian từ điểm A. Sau đó, hiển thị điểm B Vĩ độ và Kinh độ giá trị.Tính điểm thứ hai biết điểm bắt đầu và khoảng cách

Ví dụ (Pseudo code):

PointA_Lat = x.xxxx; 
PointA_Lng = x.xxxx; 
Distance = 3; //Meters 
bearing = 0; //radians 

new_PointB = PointA-Distance; 

tôi đã có thể để tính toán khoảng cách giữa hai điểm nhưng những gì tôi muốn tìm là điểm thứ hai biết khoảng cách và mang.

Tốt nhất là bằng PHP hoặc Javascript.

Cảm ơn bạn

+1

Có lẽ đây là hữu ích http://www.meridianworlddata.com/Distance-Calculation.asp – stacker

Trả lời

38

Dường như bạn đang đo khoảng cách (R) tính bằng mét và vòng bi (theta) ngược chiều kim đồng hồ từ phía đông. Và cho mục đích của bạn (hundereds mét), hình học máy bay phải đủ chính xác. Trong trường hợp đó,

dx = R*cos(theta) ; theta measured counterclockwise from due east 
dy = R*sin(theta) ; dx, dy same units as R 

Nếu theta được đo chiều kim đồng hồ từ phía bắc đến hạn (ví dụ, vòng bi la bàn), tính toán cho dx và dy là hơi khác nhau:

dx = R*sin(theta) ; theta measured clockwise from due north 
dy = R*cos(theta) ; dx, dy same units as R 

Trong cả hai trường hợp, sự thay đổi trong độ kinh độ và vĩ độ là:

delta_longitude = dx/(111320*cos(latitude)) ; dx, dy in meters 
delta_latitude = dy/110540     ; result in degrees long/lat 

sự khác biệt giữa các hằng số 110.540 và 111.320 là do mặt trái đất dẹt (chu vi phân cực và xích đạo là khác nhau).

Dưới đây là một ví dụ cách, sử dụng các thông số từ một câu hỏi sau của bạn:

Với một vị trí khởi đầu tại longitude -87,62788 độ, vĩ độ 41,88592 độ, tìm tọa độ của điểm 500 mét về phía tây bắc từ khi bắt đầu vị trí.

Nếu chúng tôi đang đo góc ngược chiều kim đồng hồ từ phía đông, "tây bắc" tương ứng tới theta = 135 độ. R cách đó 500 m.

dx = R*cos(theta) 
    = 500 * cos(135 deg) 
    = -353.55 meters 

dy = R*sin(theta) 
    = 500 * sin(135 deg) 
    = +353.55 meters 

delta_longitude = dx/(111320*cos(latitude)) 
       = -353.55/(111320*cos(41.88592 deg)) 
       = -.004266 deg (approx -15.36 arcsec) 

delta_latitude = dy/110540 
       = 353.55/110540 
       = .003198 deg (approx 11.51 arcsec) 

Final longitude = start_longitude + delta_longitude 
       = -87.62788 - .004266 
       = -87.632146 

Final latitude = start_latitude + delta_latitude 
       = 41.88592 + .003198 
       = 41.889118 
+0

Cảm ơn bạn Jim về ví dụ chỉnh sửa! Tôi rất trân trọng điều này. Bây giờ tôi hoàn toàn hiểu khái niệm này. – pppglowacki

+0

Jimk Lewis: Tôi đã thử sử dụng công thức của bạn ở đây (http://stackoverflow.com/questions/8064930/google-maps-v3-circle-circle-that-i-created-do-not-match) và không nhận được vòng tròn hoàn hảo, xin vui lòng có một cái nhìn! – Nyxynyx

+0

Hmm, tính năng này có hoạt động ở mọi nơi trên thế giới không? Dường như chỉ làm việc ở một số địa điểm. Tôi đang cố gắng vẽ một điểm về phía đông nam, và đôi khi tôi kết thúc về phía tây bắc. – paulwhit

-1

dx = sin (mang)
dy = cos (mang)
x = center.x + quận dx;
y = center.y + dist
dy;

+0

Điều này sẽ hoạt động trên mặt phẳng nếu bạn hoán đổi sin() và cos() – stacker

+0

centerX = 41.88592 (Vĩ độ) và centerY = -87.62788 (Kinh độ) Khoảng cách của tôi là 500 mét. Việc tính toán trên không cho tôi tọa độ 500 mét đúng vị trí ban đầu của tôi. Khoảng cách ở định dạng sai nên tôi cố gắng tìm ra điều đó tiếp theo. – pppglowacki

+0

đúng, nó phụ thuộc vào quy ước cho ổ đỡ. nếu 0 là "ở bên phải" và x + là "ở bên phải" rồi hoán đổi sin và cos ... thì quy ước không được đưa ra trong câu hỏi vì vậy tôi đã tạo ra một thứ ngẫu nhiên. –

3

Nó có thể giúp nếu bạn biết rằng 3600 giây của vòng cung là 1 độ (lat hoặc dài.), Rằng có 1852 mét trong một hải lý, và một hải lý là 1 giây của vòng cung. Tất nhiên bạn đang phụ thuộc vào khoảng cách tương đối ngắn, nếu không bạn sẽ phải sử dụng lượng giác cầu.

+1

Hình cầu trig là một điểm tốt để nâng cao. Nếu khoảng cách là bất cứ điều gì lớn hơn một vài dặm họ sẽ phân ra từ toàn cầu và thể lên trong không khí. Nếu điều này quan trọng hay không phụ thuộc vào trường hợp sử dụng, độ chính xác và mục tiêu của bạn. Có lẽ anh ấy không làm việc trên một quả địa cầu nhưng một số không gian bằng phẳng. – Karl

+0

Karl và akallio, cảm ơn cho đầu vào. Im thực sự làm việc trên một bề mặt phẳng và khoảng cách sẽ là khoảng 500 mét. – pppglowacki

+0

để chỉ xác nhận bằng cách sử dụng chuyển đổi ở trên: 500 mét = 0,2699784 giây của vòng cung? – pppglowacki

2

Dưới đây là một phiên bản cập nhật sử dụng Swift:

let location = CLLocation(latitude: 41.88592 as CLLocationDegrees, longitude: -87.62788 as CLLocationDegrees) 

let distanceInMeter : Int = 500 
let directionInDegrees : Int = 135 

let lat = location.coordinate.latitude 
let long = location.coordinate.longitude 

let radDirection : CGFloat = Double(directionInDegrees).degreesToRadians 

let dx = Double(distanceInMeter) * cos(Double(radDirection)) 
let dy = Double(distanceInMeter) * sin(Double(radDirection)) 

let radLat : CGFloat = Double(lat).degreesToRadians 

let deltaLongitude = dx/(111320 * Double(cos(radLat))) 
let deltaLatitude = dy/110540     

let endLat = lat + deltaLatitude 
let endLong = long + deltaLongitude 

Sử dụng phần mở rộng này:

extension Double { 
    var degreesToRadians : CGFloat { 
     return CGFloat(self) * CGFloat(M_PI)/180.0 
    } 
} 
Các vấn đề liên quan