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

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

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

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

scale = scale_at_equator * cos(lat)

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

Для того чтобы рисовать картинки на предельных широтах этого мало, надо

  1. нарисовать отдельные точки окружности в географических координатах
  2. перевести каждую точку в проекцию Меркатора

chnav, спасибо!

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

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

Вот здесь в примере http://obeattie.github.io/gmaps-radius/?radiusInput=100&unitSelector=km&lat=46.45507&lng=-269.388049&z=2&u=km&r=1000

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

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

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

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

chnav, спасибо!

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

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

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

        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);

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

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

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