Страница 1 из 2

OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 13:54
arttry
Добрый день!

Собственно задача:
Есть небольшой сервис на OSM + leaflet.
На карте рисую сегмент круга, знаю координаты центра (т.А), координаты т.В - точка лежащая на окружности, является центром сегмента, расстояние АВ и азимут. Круг небольшой 500м < R < 700м.

необходимо найти координаты точек начала и конца сегмента.

По сути задача сводится к повороту т.В относительно т.А на нужный угол.
Подставляю:

Код: Выделить всё

rx = Bx - Ax;
ry = By - Ay;
c = Math.cos(alpha);
s = Math.sin(alpha);
x = x + rx * c - ry * s;
y = y + rx * s + ry * c;
Получаются большие неточности...
Как решить задачу?

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 14:09
freeExec
А alpha то у вас в радианах?

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 14:25
arttry
Перевожу :

Код: Выделить всё

 Math.sin(90*Math.PI/180)

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 14:32
trir
А в каких координатах считаем?

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 14:59
arttry
Округляю до 5-го знака
Координаты LatLng(56.63392, 47.8757)

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 15:04
freeExec
Хех, считаете в градусах, а применяете формулы в метрах. Нужно сначало перейти в какую нибудь плоскую проекцию, посчитать, и обратно.

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 15:06
trir
На карте рисую сегмент круга, знаю координаты центра (т.А), координаты т.В - точка лежащая на окружности, является центром сегмента, расстояние АВ и азимут. Круг небольшой 500м < R < 700м.
Координаты LatLng(56.63392, 47.8757)
А кто сказал, что это круг?

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 15:11
arttry
Считаю, что круг, потому что размеры небольшие. Когда рассчитывал азимут, нормально прошло, построив прямоугольный треугольник.
Нужно сначало перейти в какую нибудь плоскую проекцию, посчитать, и обратно.
Как это осуществить? :)
Новичок в этом деле...

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 15:16
trir
Когда рассчитывал азимут, нормально прошло
Потому что Меркатор
Как это осуществить?
http://proj4js.org/

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 15:27
arttry
Спасибо! Буду разбираться. Теорию надо подтянуть)

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 20:14
arttry
Похоже я что-то не понимаю.. :(
Перевел в EPSG:3857 посчитал и вернул обратно.
Получились неверные координаты

Код: Выделить всё

var projection = '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs';

    var A = proj4(projection).forward([55.86350, 48.524084]);
    var Ax = A[1];
    var Ay = A[0];

    var B = proj4(projection).forward([55.86671, 48.52957]);
    var Bx = B[1];
    var By = B[0];

    var dX = Bx - Ax;
    var dY = By - Ay;

    var Dx = Ax + dX * Math.cos(45*Math.PI/180) - dY * Math.sin(45*Math.PI/180);
    var Dy = Ay + dX * Math.sin(45*Math.PI/180) + dY * Math.cos(45*Math.PI/180);
    
    var D = proj4(projection).inverse([Dy, Dx]);
    console.log(D);
    L.marker(D).addTo(map);

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 25 янв 2016, 20:21
trir
И зачем? Переведи в UTM

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 26 янв 2016, 10:00
arttry
Перевел. Координаты неверны

Код: Выделить всё

var projection = '+proj=utm +zone=39';
    
    var A = proj4(projection).forward([55.86350, 48.524084]);
    var Ax = A[1];
    var Ay = A[0];

    var B = proj4(projection).forward([55.86671, 48.52957]);
    var Bx = B[1];
    var By = B[0];

    var dX = Bx - Ax;
    var dY = By - Ay;

    var Dx = Ax + dX * Math.cos(45*Math.PI/180) - dY * Math.sin(45*Math.PI/180);
    var Dy = Ay + dX * Math.sin(45*Math.PI/180) + dY * Math.cos(45*Math.PI/180);
    
    var D = proj4(projection).inverse([Dy, Dx]);
    console.log(D);
    L.marker(D).addTo(map);
Что я делаю не так?

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 26 янв 2016, 11:53
Ariki
Поменяйте порядок следования параметров в вызове forward(): сначала должна идти долгота, потом широта.
Ну и поделитесь, наконец, какие координаты вы ожидаете получить, чтобы народ не гадал.

Re: OSM + leaflet поворот точки на заданный угол

Добавлено: 26 янв 2016, 12:34
arttry
Должен получить примерно: LatLng(55.86353, 48.53208)