5

Tôi có một đối tượng LatLng và tôi muốn thay đổi tọa độ của nó 500 mét về phía đông. Tôi không thể tìm thấy một phương pháp tích hợp cho điều đó. Tôi đã nhìn thấy https://gis.stackexchange.com/a/2964 nhưng kết quả của tôi chỉ là quá không chính xác (khoảng 15%) để sử dụng thực tế. Làm thế nào tôi có thể thực hiện một sự thay đổi chính xác trong mét?Bù đắp LatLng bởi một số lượng mét trong Android

Lưu ý: Tôi là KHÔNG tìm cách chuyển máy ảnh Google Maps, tôi biết cách thực hiện điều đó.

Tôi đã thử:

static final double KILOMETERS_PER_DEGREE = 111.111; 

static LatLng offsetLongitude(LatLng initialCoords, float horizontalOffsetInMeters){ 
    double degreeOffset = 1.0/KILOMETERS_PER_DEGREE * horizontalOffsetInMeters/1000.0; 
    double longitudeOffset = Math.cos(initialCoords.latitude * Math.PI/180.0) * degreeOffset; 
    return new LatLng(initialCoords.latitude, initialCoords.longitude + longitudeOffset); 
} 

public static LatLngBounds boundsForSpanWidth(LatLng midpoint, float targetSpanWidth){ 
    LatLng east = offsetLongitude(midpoint, -targetSpanWidth); 
    LatLng west = offsetLongitude(midpoint, targetSpanWidth); 
    LatLngBounds newBounds = new LatLngBounds(west, east); 
    return newBounds; 
} 

Tuy nhiên, khi tôi gọi nó với một điểm (không gần cực hoặc bất cứ điều gì) với một nhịp mục tiêu 5000 mét, tôi nhận được hai điểm mà khoảng 6170 mét cách nhau. Tại sao?

Trả lời

9

Bạn có thể sử dụng phương pháp computeOffset từ Google Maps dành cho Android Thư viện tiện ích API (https://developers.google.com/maps/documentation/android-api/utility/):

public static LatLng computeOffset (LatLng từ, khoảng cách đôi, tiêu đề kép)

Trả về LatLng phát sinh từ việc di chuyển một khoảng cách từ một nguồn gốc trong tiêu đề được chỉ định (được biểu diễn bằng độ theo chiều kim đồng hồ từ phía bắc).

Tham số:

  • từ - Các LatLng từ đó để bắt đầu.
  • khoảng cách - Khoảng cách để đi du lịch.
  • tiêu đề - Tiêu đề theo độ theo chiều kim đồng hồ từ hướng bắc.

Trong trường hợp của bạn (tham số khoảng cách được đo bằng mét):

LatLng east = SphericalUtil.computeOffset(midpoint, 500, 90); // Shift 500 meters to the east 
LatLng west = SphericalUtil.computeOffset(midpoint, 500, 270); // Shift 500 meters to the west 
+0

Thư viện làm việc. Tôi tự hỏi tại sao mã của tôi không hoạt động nhưng dù sao, vấn đề đã được giải quyết. –

2

Không thể có được độ lệch chính xác theo mét từ vĩ độ và kinh độ. Điều này sẽ giả định rằng trái đất là một quả cầu hoàn hảo và trơn tru không đúng.

Nếu bạn muốn giảm lỗi của bạn, bạn nên điều chỉnh số kilômét trên mỗi độ theo vĩ độ của bạn. Câu trả lời bạn liên kết có ước tính là 111km cho mỗi độ nhưng điều này thay đổi theo vĩ độ của bạn (đặc biệt theo hướng kinh độ). Xem bảng:

Lat 1°Lat≃  1°Lon≃ 
0° 110.574 km 111.320 km 
15° 110.649 km 107.550 km 
30° 110.852 km 96.486 km 
45° 111.132 km 78.847 km 
60° 111.412 km 55.800 km 
75° 111.618 km 28.902 km 
90° 111.694 km 0.000 km 

Ref: wikipedia :P

Tôi hy vọng điều này sẽ giúp!

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