2012-04-12 37 views
16

Tôi đang gặp khó khăn khi quấn đầu quanh một số lượng giác. Tôi đang cố gắng để suy ra một vĩ độ đích và kinh độ từ một lat bắt đầu và đăng nhập và khoảng cách và mang.tính toán Độ dài và Độ dài từ Vòng bi và Khoảng cách

May mắn thay, tôi tìm thấy một trang web tuyệt vời trong đó mô tả chính xác các chức năng tôi cần: http://www.movable-type.co.uk/scripts/latlong.html "điểm Destination khoảng cách nhất định và mang từ điểm bắt đầu" Tôi đã thử nó trong chương trình java của tôi, nhưng nó không phải đang làm việc cho tôi. Tôi đã triển khai nó như trang web đã nói. Đây là mã của tôi:

double dist = 150/6371; 
double brng = Math.toRadians(90); 
double lat1 = Math.toRadians(26.88288045572338); 
double lon1 = Math.toRadians(75.78369140625); 

double lat2 = Math.asin(Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng)); 
double a = Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1), Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2)); 
System.out.println("a = " + a); 
double lon2 = lon1 + a; 

lon2 = (lon2+ 3*Math.PI) % (2*Math.PI) - Math.PI; 

System.out.println("Latitude = "+Math.toDegrees(lat2)+"\nLongitude = "+Math.toDegrees(lon2)); 

Nhưng nó cho thấy đầu ra là:

a = 0.0 
Latitude = 26.882880455723377 
Longitude = 75.78369140625 

tôi không nhận được nơi tôi đang làm sai lầm. Xin vui lòng bất cứ ai có thể giúp tôi để tìm ra vấn đề.

Thanx trước. :-)

+4

Thre là một số thư viện nhỏ tuyệt vời để trợ giúp việc này, ví dụ: http://code.google.com/p/simplelatlng/wiki/GettingStarted –

+0

Đánh dấu - cảm ơn rất nhiều về sự kết nối nhỏ này. – Vaiden

Trả lời

13

Sự cố của bạn nằm trên hàng đầu tiên.

Hãy thử

double dist = 150.0/6371.0; 

Lý do là 150/6371 được tính như 0, bởi vì nó thực hiện phép chia số nguyên (chứ không phải là bộ phận dấu chấm động). Điều này đúng ngay cả khi kết quả được lưu trữ trong một double. Bạn có thể buộc phân chia dấu phẩy động bằng cách làm cho một trong hai số đó là một dấu chấm động.

+1

Ai đó có thể cho tôi biết 150 đó là bao nhiêu không? Tôi đang xem xét việc triển khai cùng một kịch bản này – devdar

+2

Tôi nghĩ rằng đó là cây số, được bán kính trái đất. – lcguida

+0

Tôi đã sử dụng điều này để chuyển đổi vĩ độ và kinh độ: 22.369131978392012,114.11357168108225 thành vĩ độ điểm khởi đầu, kinh độ: 0.39041812966877465,1.991668182365113 với khoảng cách di chuyển (bằng KM) là 0.06574748992919921 Bạn có thể cho tôi biết cách tính khoảng cách giữa? –

5

nếu ai đó cần một hàm tính toán tọa độ điểm từ điểm khác được di chuyển bằng khoảng cách nào đó, bên dưới là mã hoạt động. Đối với tôi, nó chỉ di chuyển một điểm bằng một khoảng cách nào đó.

import static java.lang.Math.*; 

void movePoint(double latitude, double longitude, double distanceInMetres, double bearing) { 
    double brngRad = toRadians(bearing); 
    double latRad = toRadians(latitude); 
    double lonRad = toRadians(longitude); 
    int earthRadiusInMetres = 6371000; 
    double distFrac = distanceInMetres/earthRadiusInMetres; 

    double latitudeResult = asin(sin(latRad) * cos(distFrac) + cos(latRad) * sin(distFrac) * cos(brngRad)); 
    double a = atan2(sin(brngRad) * sin(distFrac) * cos(latRad), cos(distFrac) - sin(latRad) * sin(latitudeResult)); 
    double longitudeResult = (lonRad + a + 3 * PI) % (2 * PI) - PI; 

    System.out.println("latitude: " + toDegrees(latitudeResult) + ", longitude: " + toDegrees(longitudeResult)); 
} 
  • , longitude - điểm vào phối
  • distanceInMetres - khoảng cách mà bạn muốn di chuyển điểm bởi
  • mang - một góc, hướng về phía mà bạn muốn di chuyển điểm. 0 hướng về phía Bắc, 90 - Đông, 180 - Nam, 270 - Tây. Và tất cả giữa, tức là 45 là Đông Bắc.
  • earthRadiusInMetres - Bán kính trái đất tính bằng mét.

Bạn có thể thay đổi bán kính để 6371 nếu bạn muốn có đầu vào bằng km hoặc dặm nếu bạn muốn có đầu vào trong dặm.

Các vấn đề liên quan