Tính toán kinh độ mới, vĩ độ từ + n mét cũ


84

Tôi muốn tạo 2 kinh độ mới và 2 vĩ độ mới dựa trên tọa độ và khoảng cách tính bằng mét, tôi muốn tạo một hộp giới hạn đẹp xung quanh một điểm nhất định. Nó dành cho một phần của thành phố và tối đa là ± 1500 mét. Do đó, tôi không nghĩ rằng phải tính đến độ cong của trái đất.

Vì vậy, tôi có 50.0452345(x) và 4.3242234(y) và tôi muốn biết x + 500 mét, x - 500 mét, y - 500 mét, y + 500 mét

Tôi đã tìm thấy nhiều thuật toán nhưng hầu như tất cả đều giải quyết được khoảng cách giữa các điểm.


Câu trả lời:


122

Số km trên mỗi độ kinh là khoảng

(2*pi/360) * r_earth * cos(theta)

nơi thetalà vĩ độ và r_earthkhoảng 6378 km.

Số km trên mỗi độ vĩ độ là gần như nhau ở tất cả các vị trí, khoảng

(2*pi/360) * r_earth = 111 km / degree 

Vì vậy, bạn có thể làm:

new_latitude  = latitude  + (dy / r_earth) * (180 / pi);
new_longitude = longitude + (dx / r_earth) * (180 / pi) / cos(latitude * pi/180);

Miễn là dxdynhỏ so với bán kính của trái đất và bạn không đến quá gần các cực.


2
để chuyển đổi từ độ sang radian bạn nhân với py và chia cho 180. Nhưng bạn viếtcos(latitude*180/pi)
josch

9
@josch: Bắt tốt. Cố gắng sửa câu trả lời câu trả lời vào lần sau thay vì chỉ đơn giản là đề xuất sửa. Nhiều người chỉ cần sao chép và dán mã từ StackOverflow vì nghĩ rằng nó đúng và sẵn sàng để sử dụng.
Alex Essilfie,

4
ok, hướng sẽ là gì? Ý tôi là nếu tôi muốn thêm 50 mét, nó sẽ được thêm vào đâu? Phải, trái, lên hay xuống?
Tushar Monirul

3
Trái đất không phải là hình cầu hoàn hảo, vì vậy sử dụng một giá trị duy nhất cho "bán kính" là một giá trị gần đúng. Wikipedia cho biết "khoảng cách từ các điểm trên bề mặt đến trung tâm nằm trong khoảng từ 6.353 km đến 6.384 km". Nó cũng cho biết "Một số cách khác nhau để mô hình Trái đất như một hình cầu, mỗi cách mang lại bán kính trung bình là 6.371 km" cho biết giá trị của bạn. Thực sự, nếu sự điều chỉnh này là quan trọng trong ứng dụng của bạn, thì dù sao thì bạn cũng nên sử dụng một thuật toán tốt hơn.
nibot

4
Đối với bất cứ ai không phải là chắc chắn biến r_earth nên theo mét và nên bằng khoảng 6.371.000,0
Amit Assaraf

26

Câu trả lời được chấp nhận là hoàn toàn đúng và hoạt động. Tôi đã thực hiện một số chỉnh sửa và biến thành điều này:

double meters = 50;

// number of km per degree = ~111km (111.32 in google maps, but range varies
   between 110.567km at the equator and 111.699km at the poles)
// 1km in degree = 1 / 111.32km = 0.0089
// 1m in degree = 0.0089 / 1000 = 0.0000089
double coef = meters * 0.0000089;

double new_lat = my_lat + coef;

// pi / 180 = 0.018
double new_long = my_long + coef / Math.cos(my_lat * 0.018);

Hy vọng điều này cũng sẽ giúp.


27
0.0000089? Cố gắng tránh những con số ma thuật, sẽ không ai hiểu được điều này.
scai

2
Nó là một phiên bản ngắn của đường kính trái đất và số pi trong mã. không phải ma thuật.
Numan Karaaslan

16
Nó vẫn là ma thuật nếu không ai biết cách tái tạo con số này. Tại sao bạn không đặt tính toán đầy đủ vào mã của bạn?
scai

13
1 độ trong bản đồ google tương đương với 111,32 km. 1Degree = 111,32KM. 1KM ở Độ = 1 / 111,32 = 0,008983. 1M tính bằng Độ = 0,000008983.
Muhammad Azeem

7
Bạn nên đưa ra bình luận trong câu trả lời của mình, việc đưa nó vào bình luận là không hữu ích.
chutsu

18

Đối với vĩ độ làm:

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_latitude = latitude + (your_meters * m);

Đối với kinh độ làm:

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    cos = Math.cos,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_longitude = longitude + (your_meters * m) / cos(latitude * (pi / 180));

Biến your_meterscó thể chứa một giá trị dương hoặc một giá trị âm.


8

Bạn đã kiểm tra chưa: Làm cách nào để tìm vĩ độ / kinh độ là x km về phía bắc của một vĩ độ / kinh độ nhất định ?

Những tính toán này rất khó chịu, tôi đã thực hiện rất nhiều. Công thức hasrsine sẽ là người bạn của bạn.

Một số tài liệu tham khảo: http://www.movable-type.co.uk/scripts/latlong.html


Nếu bạn làm việc cho một khu vực khá nhỏ, có thực sự tệ khi chỉ thực hiện theo vĩ độ-0,09 và độ cao-0,0148 để có được diện tích xấp xỉ km vuông?
Benjamin Udink ten Cate, 19/09

Tôi muốn nói rằng nó không thực sự tệ. Km vuông ở mức đó sẽ không bị biến dạng bởi độ cong của Trái đất - miễn là Vĩ độ / Lng mà bạn đang xử lý là số thập phân.
Ryan Ternier

1
@BenjaminUdinktenCate Điều đó sẽ hoạt động ở Amsterdam, nhưng sẽ không chính xác ở những nơi khác trên thế giới. Thực hiện "kinh độ-0,0148" bạn sẽ chỉ đi được khoảng 0,16 km tại đường xích đạo.
nibot

3

Tôi đã phải dành khoảng hai giờ để tìm ra giải pháp bằng @nibot, tôi chỉ cần một phương pháp để tạo một hộp ranh giới với điểm trung tâm và chiều rộng / chiều cao (hoặc bán kính) tính bằng km:

Tôi không hiểu giải pháp về mặt toán học / địa lý. Tôi đã điều chỉnh giải pháp (bằng cách thử và sai) để có được bốn tọa độ:

Bắc:

private static Position FromKmToNPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = p.Lat + (km / r_earth) * (180 / pi);
    return new Position(new_latitude, p.Long);
}

Phía đông:

private static Position FromKmToEPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = p.Long + (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
    return new Position(p.Lat, new_longitude);
}

Miền Nam:

private static Position FromKmToSPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = p.Lat - (km / r_earth) * (180 / pi);
    return new Position(new_latitude, p.Long);
}

Hướng Tây:

private static Position FromKmToWPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = p.Long - (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
    return new Position(p.Lat, new_longitude);
}

1

nếu bạn không cần phải chính xác lắm thì: mỗi 10000 mét là khoảng 0,1 cho vĩ độ và kinh độ. ví dụ: tôi muốn tải các vị trí 3000 mét xung quanh point_A từ cơ sở dữ liệu của mình:

double newMeter =  3000 * 0.1 / 10000;
double lat1 = point_A.latitude - newMeter;
double lat2 = point_A.latitude + newMeter;
double lon1 = point_A.longitude - newMeter;
double lon1 = point_A.longitude + newMeter;
Cursor c = mDb.rawQuery("select * from TABLE1  where lat >= " + lat1 + " and lat <= " + lat2 + " and lon >= " + lon1 + " and lon <= " + lon2 + " order by id", null);

0
public double MeterToDegree(double meters, double latitude)
{
    return meters / (111.32 * 1000 * Math.Cos(latitude * (Math.PI / 180)));
}

-1
var meters = 50;
var coef = meters * 0.0000089;
var new_lat = map.getCenter().lat.apply() + coef;
var new_long = map.getCenter().lng.apply() + coef / Math.cos(new_lat * 0.018);
map.setCenter({lat:new_lat, lng:new_long});

2
Vui lòng thêm một số giải thích cho câu trả lời của bạn.
Anna

nếu bạn muốn đối tượng bản đồ di chuyển khoảng 50 mét gần trung tâm của bản đồ hiện tại, sau đó bạn có thể sử dụng mã này với +, - số để thay thế cho 50
Eyni Kave
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.