Клуб API Карт

Как рассчитать координаты "сектора" и радиус круга?

Пост в архиве.

Здравствуйте.

Объект - линия - polyline

Посетитель тянет один конец линии и бросает. Имеем кординаты начала линии (центр условного круга) и конец линии (координата, что тянул посетитель).


а) Задача: нужно нарисовать круг в 360 градусов. Но объект circle имеет радиус в метрах - как получить метры из длины координатной линии посетителя?

б) Задача: нужно нарисовать "сектор" (я прочитал, что сектора рисовать не умеем - значит рисуем треугольник - но все равно нужно получить координаты 2 вершин).

Так вот - нужно нарисовать "сектор" например в 45 градусов. Т.е. в одну сторону от конца линии на 22 градуса и в другую на 22 градуса. 

Первая координата треугольника - есть (центр условного круга). 

Как расчитать - координаты остальных двух вершин? (может ответ на первый вопрос поможет в расчетах....)

 

Спасибо

14 комментариев

 По поводу первой задачи:

    function calculateDistance(latA, longA, latB, longB){
        var EARTH_RADIUS = 6372795;

        var lat1 = latA * Math.PI / 180;
        var lat2 = latB * Math.PI / 180;
        var long1 = longA * Math.PI / 180;
        var long2 = longB * Math.PI / 180;

        var cl1 = Math.cos(lat1);
        var cl2 = Math.cos(lat2);
        var sl1 = Math.sin(lat1);
        var sl2 = Math.sin(lat2);
        var delta = long2 - long1;
        var cdelta = Math.cos(delta);
        var sdelta = Math.sin(delta);

        var y = Math.sqrt(Math.pow(cl2 * sdelta, 2) + Math.pow(cl1 * sl2 - sl1 * cl2 * cdelta, 2));
        var x = sl1 * sl2 + cl1 * cl2 * cdelta;

        var ad = Math.atan2(y, x);
        var dist = Math.ceil(ad * EARTH_RADIUS);

        return dist;
    }

Но есть какая-то встроенная в апи функция, поищите, если хотите.

 

По поводу второй задачи:

1. расчитываете азимут между двумя точками линии(Обратная геодезическая задача)

2. далее отталкивайтесь от этого азимута и стройте две линии плюс минус 22.5 градуса заданной длинны. (Прямая геодезическая задача).

 

Получите эти две линии - объеденяйте в полигон и в принципе готово. Если вам не срочно нужно выполнить это, то я бы на выходных помог - люблю решать интересные задачи)

 

Спасибо - насчет круга - отлично.

А вот с "сектором" не очень. Второй день голову ломаю. Видимо геометрия от геодезии слишком далеко и система координат в другую сторону развернута - вообще получается всё совсем не то.....

Был бы благодарен за помощь.

vadim.zhiltsov@mail.ru Давайте к вечеру пятницы спишемся.

Договорились

Чтобы расчитать расстояние между двумя геокоординатами вообще есть метод

ymaps.coordSystem.geo.getDistance(a, b)

 

Что касается вопроса номер два. Нужен ли вам именно геодезический сектор? Может быть можно будет обойтись простым равносторонним треугольником, тогда все просто, можно обойтись глобальными пикселями и школьной геометрией.

 

Тем не менее, я приведу пример геодезического треугольника:

 

var point1 = [37.62, 55.75],
    middlePoint = [30, 60],
    sectorAngle = Math.PI / 4,
    // Решаем обратную задачу мужду двумя точками.   
    geodesic = ymaps.coordSystem.geo.solveInverseProblem(point1, middlePoint),
    // Находим угол в радианах.
    azimuth = Math.atan2.apply(null, geodesic.startDirection),
    // Находим азимуты сторон треугольника.
    azimuth2 = azimuth - sectorAngle / 2,
    azimuth3 = azimuth + sectorAngle / 2,
    // Находим направления для сторон треугольника.
    dir2 = [Math.sin(azimuth2), Math.cos(azimuth2)],
    dir3 = [Math.sin(azimuth3), Math.cos(azimuth3)],
    // Находим длину гипотенузы в метрах.
    hypotenuseLength = geodesic.distance / Math.cos(sectorAngle / 2),
    // Находим координаты точек треугольника.
    point2 = ymaps.coordSystem.geo.solveDirectProblem(point1, dir2, hypotenuseLength).endPoint,
    point3 = ymaps.coordSystem.geo.solveDirectProblem(point1, dir3, hypotenuseLength).endPoint,
    // Создаем объект, не забываем указать ему опцию geodesic: true.
    triangle = new ymaps.Polygon([[point1, point2, point3]], {}, { geodesic: true });
   
myMap.geoObjects.add(triangle);

Кстати, можно не считать длину гипотенузы, а использовать такое же расстояние как и до middlePoint: geodesic.distance, тогда четырёхугольник

[point1, point2, middlePoint, point3]

будет больше похож по геометрии на сектор, чем треугольник из предыдущего примера.

Спасибо, не знал про ymaps.coordSystem.geo. Всегда глупо и наивно вставлял свою реализацию задач геодезии. Сейчас аж расстоился из велосепедизма( Встречный вопрос, реализация апи учитывает погрешность работы js с float при этих расчётах?

Думаю стоит сделать хоть один пример с этим.

Нет. 16 знаков мантиссы для таких вычислений хватает.

Пример сделаем! :)

Спасибо. Это крайне интересно.

Однако вопрос в том, что я делаю предварительные расчеты в РНР. Т.е. ДО момента вывода карты и следовательно не могу ни глобальные пиксели считать, ни решать геодез.задачи средствами Яндекс.АПИ.

Следовательно - меня интересуют формулы. Пусть даже это будет обычный равнобедренный треугольник, но опять же - я не могу предварительно расчитать вершину и подозреваю что действительно из-за "координатыпиксели".

могу посоветовать очень полезный ресурс с формулами. Когда будете переписывать под php, не забудьте использовать bcmath

 

И на том спасибо. Сложновато выглядит на первый взгляд после геометрических формул. Но буду пытаться....

Только учитывайте, что там все на сфере рассчитывается. У нас в эллипсоиде используется формулы Винсенти, можете посмотреть исходный код в debug-режиме.

 

Вообще, мне не очень понятно, зачем делать предварительные расчеты на PHP, если в API Карт спецально встроен этот мат. аппарат для решения подобных задач в контексте географии и геодезии.

Все сделал.

Отлично подошел пример на сайте

http://www.movable-type.co.uk/scripts/latlong.html

"Destination point given distance and bearing from start point"

Формулы в 2 строки.

 

не знаю можете ли мне помочь..все такие продвинутые..формулки какие-то пишут???..лохом себя ощущаю))

мне нужно в моем городе посчитать потенциал...нашла карту..не могу нарисовать радиус..может не там рисую??