2013-03-12 82 views
7

tôi có các thiết lập sau đây của các mục trong thực tế đời sống:Tính tọa độ mới từ tọa độ cũ và x và y

My setup

Radar là tĩnh, có nghĩa là nó luôn luôn có vị trí tương đương. A -item có thể di chuyển và vị trí của nó có thể là bất cứ điều gì. Từ radar tôi có thể đọc các tọa độ xy của A liên quan đến radar. Tôi đã viết các lớp sau đây để mô tả vị trí của từng hạng mục:

public class Position { 
    public enum Direction { 
     EAST, WEST, NORTH, SOUTH 
    }; 

    public final Direction latitudeDirection, longitudeDirection; 
    public final float latitude, longitude, altitude; 

    public Position(Direction latitudeDirection, Direction longitudeDirection, 
      float latitude, float longitude, float altitude) { 
     this.latitudeDirection = latitudeDirection; 
     this.longitudeDirection = longitudeDirection; 
     this.latitude = latitude; 
     this.longitude = longitude; 
     this.altitude = altitude; 
    } 

    public Position(float radarX, float radarY) { 
     // TODO: Implement the question here 
     this.altitude = Config.RADAR_POSITION.altitude; 
    } 

} 

class Config { 
    // Position of the radar 
    public static final Position RADAR_POSITION = new Position(
      Position.Direction.NORTH, // Latitude direction 
      Position.Direction.EAST, // Longitude direction 
      55.0f, // Latitude 
      13.0f, // Longitude 
      60.0f); // Altitude 

    // Facing direction of the radar in degrees. 0° is north, advancing 
    // clockwise. 
    public static final float RADAR_FACING_DIRECTION = 10.0f; 
} 

Ngay bây giờ cho các tọa độ địa lý của radar, các xy tọa độ của A tương đối so với radar và sự chỉ đạo phải đối mặt với các radar so với miền Bắc, làm thế nào tôi có thể tính tọa độ địa lý tuyệt đối của A?

Độ cong của trái đất không phải là vấn đề do giá trị tối đa là x và/hoặc y không thể dài hơn vài trăm mét.

+0

Vấn đề của bạn cần phải xoay hình ảnh 10 độ. Có rất nhiều tài liệu về vấn đề này. Sau khi xoay bạn thêm các tọa độ của nguồn gốc của bạn (radar). – SJuan76

+0

Nhưng điều đó sẽ sai. Tọa độ địa lý là độ từ lõi của trái đất. Các tọa độ của tôi liên quan đến radar chỉ là mét. Tôi không thể thêm hai cái đó lại với nhau. – Dimme

+1

Cho rằng (x, y) là tọa độ hiện tại 'A'. Và nếu bạn biết thiên thần (theta) mà radar được quay đối với trái đất, sau đó bạn có thể dễ dàng tìm thấy các cordinates mới (xnew, ynew) là: 'xnew = x * cos (theta) - y * sin (theta); ynew = x * sin (theta) + y * cos (theta); ' –

Trả lời

1

Tôi nghĩ có thể thực hiện theo cách này: Chuyển đổi các tọa độ xy sang tọa độ cực rtheta, (với radar là nguồn gốc). Trừ phép quay của radar, và chuyển trở lại tọa độ Descartes. Sau đó, bạn chỉ cần chuyển đổi sang vĩ độ và kinh độ và thêm tọa độ của radar.

double r = Math.hypot(radarX, radarY); 
double theta = Math.atan2(radarY, radarX); 
theta -= Math.toRadians(Config.RADAR_FACING_DIRECTION); 
float x = (float) r * Math.cos(theta); 
float y = (float) r * Math.sin(theta); 
longitude = metersToLongitude(Config.RADAR_POSITION, y) + Config.RADAR_POSITION.longitude; 
latitude = metersToLatitude(Config.RADAR_POSITION, x) + Config.RADAR_POSITION.latitude; 

Tôi đã tìm thấy công thức cho độ dài vĩ độ và kinh độ trên Wikipedia. Một mức độ vĩ độ là như nhau ở khắp mọi nơi nhưng kinh độ được nhỏ hơn gần các cực.

static float metersToLatitude(Position near, float meters) { 
    return meters/110.6*1000; 
} 

static float metersToLongitude(Position near, float meters) { 
    float lat = Math.toRadians(near.latitude); 
    return meters/
     (111132.954 - 559.822 * Math.cos(2*lat) + 1.175 * Math.cos(4*lat)); 
} 

Thật không may điều này dường như không hoạt động và tôi không thể hiểu tại sao.

Nếu bạn muốn thể hiện tọa độ của mình ở độ dương/đông/bắc/nam, bạn cũng sẽ phải kiểm tra xem chúng có âm và đảo ngược chúng và hướng trong trường hợp đó không.

+0

Cảm ơn. Câu trả lời của bạn đã truyền cảm hứng cho tôi. Bạn có thể tìm mã tôi đã sử dụng trong câu trả lời dưới đây. – Dimme

0

Bạn xoay tất cả tọa độ trong hệ thống cục bộ của radar -10 ° và sau đó có thể thêm tọa độ x/y của radar vào tọa độ đối tượng A.

+0

Như tôi đã nói ở trên, điều đó sẽ sai. Tọa độ địa lý là độ từ lõi của trái đất. Các tọa độ của tôi liên quan đến radar là tính bằng mét. Tôi không thể thêm hai cái đó lại với nhau. – Dimme

+0

Xin lỗi, tôi hiểu lầm văn bản, hãy để tôi suy nghĩ lại * g * –

3

Ví dụ, bạn có thể sử dụng hàm lượng giác để tạo ra hình tam giác để tìm tọa độ của A:

Example of using trigonometric functions

Trong trường hợp này, Axe = (y) (cos 10) - (x) (cos 80), và bạn có thể làm việc ra Ay tương tự.

Bằng cách này, bạn không bao giờ bị mắc kẹt theo độ, bạn chỉ đơn giản là làm việc theo mét.

Các giải pháp mạnh mẽ là bình luận Vishal trong OP, mà đã được đăng trong khi tôi đang vẽ và quét:

xnew = x * cos(theta) - y * sin(theta); 
ynew = x * sin(theta) + y * cos(theta); 
2

Nói chung, bạn có thể sử dụng các bước sau:

  1. biến radar của bạn Vị trí (vĩ độ, vĩ độ, chiều cao) thành hệ mét xyz cố định của đất đất (ECEF)
  2. Sau đó, bạn có thể sử dụng/kết hợp bất kỳ đối số và ma trận xoay vòng và dịch nào. ystem
  3. xzy lại biến đổi mới có được tọa độ để lat/lon/h

Có rất nhiều nguồn tài cho biến đổi như vậy, kiểm tra điều này, ví dụ: http://www.gmat.unsw.edu.au/snap/gps/clynch_pdfs/coordcvt.pdf

Bạn cũng có thể giới thiệu một cảnh hệ tọa độ, nếu cần (ENU). Đây là một cái nhìn tổng quan khá tốt mô tả mối quan hệ của UTM, ECEF, ENU và tọa độ geodotic (Lat/lon/h): http://www.dirsig.org/docs/new/coordinates.html

Nếu bạn cần mẫu mã cho ECEF đến/từ chuyển đổi trắc địa, có một cái nhìn tại các mã MATLAB, http://www.mathworks.de/de/help/map/ref/ecef2geodetic.html, hoặc sử dụng thư viện như GDAL (http://www.gdal.org/)

1

Cuối cùng tôi đã giải quyết được. Mã được đính kèm bên dưới. Vì câu trả lời của Samuel Edwin Ward là câu trả lời cho tôi, tôi sẽ chấp nhận câu trả lời của anh ấy.

public Position(float radarX, float radarY) { 

    // Convert A's position to distance and bearing in relation to the North 
    double objDistance = (Math.hypot(radarX, radarY)/6367500 /* Mean earth radius */); 
    double objBearing = (Math.atan2(radarY, radarX) + Math.toRadians(Config.RADAR_BEARING)); 

    // Convert the Radar's geographic coordinates to radians 
    double latitudeRadar = Math.toRadians(Config.RADAR_POSITION.latitude); 
    double longitudeRadar = Math.toRadians(Config.RADAR_POSITION.longitude); 

    // Calculate A's geographic coordinates in radians 
    double latitudeObject = Math.asin(Math.sin(latitudeRadar)*Math.cos(objDistance) + 
      Math.cos(latitudeRadar)*Math.sin(objDistance)*Math.cos(objBearing)); 
    double longitudeObject = longitudeRadar + Math.atan2(Math.sin(objBearing)*Math.sin(objDistance)*Math.cos(latitudeRadar), 
      Math.cos(objDistance)-Math.sin(latitudeRadar)*Math.sin(latitudeObject)); 

    // Normalize to -180 ... +180 degrees 
    longitudeObject = (longitudeObject+3*Math.PI) % (2*Math.PI) - Math.PI; 

    // Set the A's coordinates in degrees 
    this.latitude = (float) Math.toDegrees(latitudeObject); 
    this.longitude = (float) Math.toDegrees(longitudeObject); 

    // Set the rest of the arguments 
    this.latitudeDirection = Config.RADAR_POSITION.latitudeDirection; 
    this.longitudeDirection = Config.RADAR_POSITION.longitudeDirection; 
    this.altitude = Config.RADAR_POSITION.altitude; 
} 
+0

Loại bỏ các mét càng sớm càng tốt là thực sự tươi sáng. Tại sao tôi không nghĩ về điều đó? –

+0

Điều này có vẻ là chính xác, mặc dù, với Trái đất không phải là một quả cầu? –

+0

Nếu bạn thấy tính toán kinh độ tính đến vĩ độ. Do đó nó hoạt động cho một ellipsoid. – Dimme

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