Я раньше делал чистый CSS, но я отказался от того преследования в пользу гибридного подхода таблицы/CSS как самый прагматический подход. Как ни странно, это также из-за доступности. Когда-нибудь пытайтесь делать CSS на Кореше? Какой кошмар! Когда-нибудь замеченный, как основанные на CSS веб-сайты представляются на новых браузерах? Элементы наложились бы или просто не отображаются правильно, что я должен был выключить CSS. Когда-нибудь пытайтесь изменить размер основанных на CSS веб-сайтов? Они выглядят ужасными и часто вредными для слепых, если они используют функции изменения масштаба в браузере! Если Вы делаете это с таблицами, они масштабируются намного лучше. Когда люди говорят о доступности, я нахожу, что у многих нет подсказки, и она раздражает меня, потому что я отключен, и они не. Они действительно работали со слепыми? Глухие? Если доступность является основным беспокойством, какого черта 99% видео не закрываются озаглавленные? Многие пуристы CSS используют Ajax, но не удаются понять, что Ajax часто делает содержание недоступным.
Практично, нормально использовать единственную таблицу в качестве основного расположения, пока Вы предоставляете информацию в логическом потоке, если бы ячейки сложены (что-то, что Вы видели бы по мобильным телефонам). Теория CSS звучит великолепно, но частично осуществимый в реальной жизни со слишком многими взломами, что-то, что является против идеалов "чистоты".
Начиная с использования CSS с подходом таблиц, я сэкономил так много времени, разрабатывая веб-сайт, и обслуживание намного легче. Меньше взломов, более интуитивных. Я получаю меньше вызовов от людей, говорящих, что "Я вставил DIV, и теперь это смотрит все завинченные!" И что еще более важно, абсолютно никакие проблемы доступности.
решение кажется довольно простым:
>>> import math
>>> mlat = sum(x['lat'] for x in l) / len(l)
>>> mlng = sum(x['lng'] for x in l) / len(l)
>>> def algo(x):
return (math.atan2(x['lat'] - mlat, x['lng'] - mlng) + 2 * math.pi) % (2*math.pi)
>>> l.sort(key=algo)
в основном, алгоритм
нормализует ввод в пространство [0, 2pi]
, и это будет естественно отсортировывать «против часовой стрелки». Обратите внимание, что оператор% и оператор * имеют одинаковый приоритет, поэтому скобки вокруг (2 * math.pi) важны для получения правильного результата.
Предполагая, что ваши «прямоугольники» всегда параллельны экватору и меридианам (это подразумевает ваш пример, но это не указано явно), т.е. у вас есть только две пары разных значений широты и долготы : (lat0, lat1) и (lng0, lng1).
Вы получите следующие 4 угла:
NE: (lat = max(lat0, lat1), lng = max(lng0, lng1))
NW: (lat = max(lat0, lat1), lng = min(lng0, lng1))
SW: (lat = min(lat0, lat1), lng = min(lng0, lng1))
SE: (lat = min(lat0, lat1), lng = max(lng0, lng1))
(это не должно быть кодом Python)
Вместо сортировки вы можете просто «перестроить» прямоугольник в любом порядке.
Из исходного набора возьмите минимальную и максимальную широту, а также минимальную и максимальную долготу. Затем постройте прямоугольник в любом порядке.
Северо-западный угол - это максимальная широта и минимальная долгота. Юго-западный угол - это минимальная широта и минимальная долгота. И т.д.
Свяжите угол с каждой точкой (относительно внутренней точки), и тогда перемещение будет тривиальным.
Чтобы вычислить угол, найдите точку в середине формы, для Например, (average_lat, average_lng)
будет в центре. Тогда atan2 (lng - average_lng, lat - average_lat)
будет углом этой точки.
Итак, у вас 4 точки.
Вы всегда начинаете с точки NW.
Вы знаете, что точки сортируются, но не в каком направлении.
Это простой тест первых двух точек, по часовой стрелке или против часовой стрелки в списке.
if (pt1.y! = pt2.y) then direction = clockwise.
Если вы обнаружите, что точки расположены по часовой стрелке, просто переверните последние 3 точки в списке.
Итак.
Точки против часовой стрелки: (0,1), (0,0), (1,0), (1,1)
Точки по часовой стрелке: (0 , 1), (1,1), (1,0), (0,0)
Вы можете увидеть, если вы перевернете pts2-4, ваш список по часовой стрелке станет против часовой стрелки.
РЕДАКТИРОВАТЬ: Мои точки начинались с NE, фикс.
Это просто. Сначала мы сортируем координаты, чтобы знать, в каком порядке они находятся, а затем просто выбираем их:
Сортируем их сначала по широте, затем по долготе, сначала самые большие. Затем мы меняем местами последние два:
L = [
{ "lat": 34.495239, "lng": -118.127747 }, # north-west
{ "lat": 34.495239, "lng": -117.147217 }, # north-east
{ "lat": 34.095174, "lng": -117.147217 }, # south-east
{ "lat": 34.095174, "lng": -118.127747 } # south-west
]
L = sorted(L, key=lambda k: (-k["lat"], -k["lng"]))
L[-2], L[-1] = L[-1], L[-2]
import pprint
pprint.pprint(L)
output
[{'lat': 34.495238999999998, 'lng': -117.147217},
{'lat': 34.495238999999998, 'lng': -118.127747},
{'lat': 34.095174, 'lng': -118.127747},
{'lat': 34.095174, 'lng': -117.147217}]
(Минусы в ключевой функции таковы, что большие значения сортируются перед меньшими значениями. При сортировке мы помещаем север перед югом, затем восток перед западом; чтобы получить желаемый порядок мы просто меняем местами два последних (южных) значения.)
Если вы возьмете произведение двух векторов из угла, то знак результата скажет вам, по часовой стрелке или против часовой стрелки.