OpenStreetMap Forum

The Free Wiki World Map

You are not logged in.

Announcement

A fix has been applied to the login system for the forums - if you have trouble logging in please contact support@openstreetmap.org with both your forum username and your OpenStreetMap username so we can make sure your accounts are properly linked.

#1 2017-08-01 10:00:27

NovaEiz
Member
Registered: 2016-10-22
Posts: 87

Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

Приветствую.

Подскажите, как высчитать длину и высоту эллипса в точке (lat, lon) для отображения радиуса.
Как в этом видео https://www.youtube.com/watch?v=9ciN9I6IdqY

Offline

#2 2017-08-01 10:16:48

chnav
Member
From: Moscow, Russia
Registered: 2010-03-18
Posts: 2,681

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

NovaEiz wrote:

Приветствую.

Подскажите, как высчитать длину и высоту эллипса в точке (lat, lon) для отображения радиуса.
Как в этом видео https://www.youtube.com/watch?v=9ciN9I6IdqY

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

scale = scale_at_equator * cos(lat)

Например если на экваторе окружность имеет диаметр 10 пикселов, на широте Москвы уже 18.3 пикселов.

Для того чтобы рисовать картинки на предельных широтах этого мало, надо
1) нарисовать отдельные точки окружности в географических координатах
2) перевести каждую точку в проекцию Меркатора

Last edited by chnav (2017-08-01 10:24:05)

Offline

#3 2017-08-01 11:34:29

NovaEiz
Member
Registered: 2016-10-22
Posts: 87

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

chnav, спасибо!

Второй вариант тоже хорош.

Но пока интересует упрощенный вариант.

Вот здесь в примере http://obeattie.github.io/gmaps-radius/ … =km&r=1000

От широты зависит и ширина и высота, но в большей степени высота эллипса. Как такого достигнуть?
Т.е. чем дальше широта от полюса, тем радиус больше, но и еще и тем больше высота, чем широта.
Без просмотра по ссылке возможно сложно понять)

Кликаешь по карте - ставится радиус 1000км

Last edited by NovaEiz (2017-08-01 11:41:06)

Offline

#4 2017-08-01 15:37:28

chnav
Member
From: Moscow, Russia
Registered: 2010-03-18
Posts: 2,681

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

NovaEiz wrote:

Вот здесь в примере http://obeattie.github.io/gmaps-radius/ … =km&r=1000

Это только на глазок эллипс, на самом деле сложная фигура в форме "яйца" (эллипс с острым концом в сторону экватора и тупым концом в сторону полюса), а при постановке точки ближе к полюсу вырождается в волнистую линию с одной стороны и бесконечность с другой.
Это можно нарисовать только пересчетом отдельных точек.

1. Поставить точку центра окружности lat0,lon0
2. Решить прямую геодезическую задачу _на эллипсоиде_ WGS-84, т.е. отложить от точки lat0,lon0 вектор длиной 1000км по азимуту 0°, затем вторую точку по азимуту 1° и т.д. от 0 до 360 с заданной дискретностью, на выходе список точек в географических координатах;
3. Пересчитать географические координаты в прямоугольную проекцию Меркатора на гугловской _сфере_;
4. Пересчитать прямоугольные координаты в экранные пикселы

Last edited by chnav (2017-08-01 15:38:49)

Offline

#5 2017-08-01 17:18:25

NovaEiz
Member
Registered: 2016-10-22
Posts: 87

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

chnav, спасибо!

Offline

#6 2017-08-01 17:24:59

NovaEiz
Member
Registered: 2016-10-22
Posts: 87

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

А как отложить вектор длиной 1000 км?
Если переводить точку EPSG:4326 в EPSG:3857, и потом откладывать вектор, то длина 1000 будет не равна 1000км.

Как отложить вектор в километрах в координатах системы EPSG:4326?

Offline

#7 2017-08-05 12:58:30

NovaEiz
Member
Registered: 2016-10-22
Posts: 87

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

Вот так получаю точки отложенные по углу на длину

        double dx = distance*Math.Cos(Math.PI/180.0*angle);
        double dy = distance*Math.Sin(Math.PI/180.0*angle);

        double radiusWorld = 6378137;

        double new_lat = lat + (180/Math.PI)*(dy/radiusWorld);
        double new_lon = lon + (180/Math.PI)*(dx/radiusWorld)/Math.Cos(Math.PI/180.0*lat);

Но в итоге почему-то в любом месте круг получается как круг.

Last edited by NovaEiz (2017-08-05 12:59:06)

Offline

#8 2017-08-05 13:46:51

NovaEiz
Member
Registered: 2016-10-22
Posts: 87

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

А нет, всё четко. Надо было увеличить радиус, чтоб увидеть эффект

Offline

#9 2017-08-06 22:53:22

chnav
Member
From: Moscow, Russia
Registered: 2010-03-18
Posts: 2,681

Re: Высчитать длину и высоту эллипса в точке GPS для отображения радиуса.

NovaEiz
Гуглите фразу "ПГЗ (Прямая Геодезическая Задача) на эллипсоиде", иначе у полюсов вы получите значения широты >90°

Last edited by chnav (2017-08-06 22:53:47)

Offline

Board footer

Powered by FluxBB