Размещать аннотации на карте на основе расстояния (в метрах) и азимута от текущего местоположения - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над приложением для разметки гоночного курса на основе количества лодок, целевого времени, направления ветра и силы ветра.

В настоящее время я сохраняю все переменные на устройстве и закрепляюгоночный комитет стартует с лодки на карте.Я нашел много информации о том, как рассчитать расстояние между двумя точками, но не могу найти никакой информации о том, как разместить аннотацию xx метров / подшипник xx градусов от исходного судна.

Исходное суднона карте (расположение: широта / долгота).Как я могу разместить аннотацию на расстоянии 500 метров от стартового судна с углом поворота 90 градусов?

1 Ответ

0 голосов
/ 16 октября 2018

Я полагаю, что есть много примеров того, как размещать аннотации в лат / долгое место.Поэтому я немного помогу узнать, как получить целевое местоположение

Сначала вы можете увидеть формулу Хаверсайна, чтобы получить позицию широты / долготы. Есть хороший пример для Python на Получить широту / долготу с учетом текущегоТочка, расстояние и направление

для быстрой работы вы можете использовать эту функцию, предполагая, что цель находится на расстоянии 500 метров и 90 градусов от текущего курса пользователя

   func getNewTargetCoordinate(position: CLLocationCoordinate2D, userBearing: Float, distance: Float)-> CLLocationCoordinate2D{

    let r = 6378140.0
    let latitude1 = position.latitude * (Double.pi/180) // change to radiant
    let longitude1 = position.longitude * (Double.pi/180)
    let brng = Double(userBearing+90) * (Double.pi/180)

    var latitude2 = asin(sin(latitude1)*cos(Double(distance)/r) + cos(latitude1)*sin(Double(distance)/r)*cos(brng));
    var longitude2 = longitude1 + atan2(sin(brng)*sin(Double(distance)/r)*cos(latitude1),cos(Double(distance)/r)-sin(latitude1)*sin(latitude2));

    latitude2 = latitude2 * (180/Double.pi)// change back to degree
    longitude2 = longitude2 * (180/Double.pi)

    // return target location
    return CLLocationCoordinate2DMake(latitude2, longitude2)
}
...