Как я могу отсортировать список координат для прямоугольника против часовой стрелки?
====================================================================================

Мне нужно отсортировать список координат для прямоугольника против часовой стрелки и сделать северо-восточный угол первой координатой. Это географические координаты (то есть долгота, широта) в десятичной форме.

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

Мне нужно отсортировать их против часовой стрелки и изменитьякорь»/ отправная точка на северо-восток:

Я не знаю, в каком порядке будет список вначале (то есть по часовой стрелке или против часовой стрелки). Я не знаю, какой угол представляет первая координата в списке.

Это не настоящий прямоугольник при отображении на поверхность земли, однако, поскольку у меня есть 2 противоположных угла, я называю его прямоугольником для удобства чтения. Формы, которые обертывают + 180 / -180 долготы или + 90 / -90 широты, не являются проблемой.

Решение кажется довольно простым:

в принципе,`algo` нормализует вход в`[0, 2pi]` пространство и было бы естественно отсортированопротив часовой стрелки", Обратите внимание, что оператор% и оператор * имеют одинаковый приоритет, поэтому круглые скобки (2 * math.pi) важны для получения правильного результата.



Свяжите угол с каждой точкой (относительно внутренней точки), и тогда движение вокруг тривиально.

Чтобы рассчитать угол, найдите точку в середине фигуры, например,`(average_lat, average_lng)` будет в центре. Затем,`atan2(lng - average_lng, lat - average_lat)` будет угол этой точки.



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



Вместо сортировки можно простовосстановление» прямоугольник в любом порядке по вашему желанию.

Из исходного набора соберите минимальную и максимальную широту и минимальную и максимальную долготу. Затем создайте прямоугольник в любом порядке.

Северо-западный угол - максимальная широта и минимальная долгота. Юго-западный угол - минимальная широта и минимальная долгота. Так далее."



Итак, у вас есть 4 балла.

Вы всегда начинаете с точки NW.

Вы знаете, что точки отсортированы, но не в каком направлении.

Это's простая проверка первых двух точек, является ли список по часовой стрелке или против часовой стрелки.

если (pt1.y! = pt2.y), то направление = по часовой стрелке.

Если вы обнаружите, что точки расположены по часовой стрелке, просто поменяйте местами последние 3 точки в списке.

Так.

Против часовой стрелки: (0,1), (0,0), (1,0), (1,1)

По часовой стрелке: (0,1), (1,1), (1,0), (0,0)

Вы можете увидеть, если вы измените pts2-4, ваш список по часовой стрелке станет против часовой стрелки.

РЕДАКТИРОВАТЬ: у меня были свои точки, начиная с NE, Fixt.I



Предполагая, что ваш "прямоугольники» всегда параллельны экватору и меридианам (что 'Что означает ваш пример, но этоне указано явно), то есть у вас есть только две пары различных значений lat и lng: (lat0, lat1) и (lng0, lng1).

Вы получаете следующие 4 угла:

(это не должен быть код Python)



Это легко. Сначала мы сортируем координаты, чтобы знать, в каком порядке они у нас есть, а затем просто выбираем их:

Сортируйте их сначала по лат, затем по lng, сначала по величине. Затем мы поменяемся местами последние два:

выход

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