(no subject)
Apr. 30th, 2010 03:49 pm![[identity profile]](https://www.dreamwidth.org/img/silk/identity/openid.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
Приветы! У меня задача по геодезии и вычислительной геометрии. В гугле искал, но все вокруг да около, ответа так и не нашел - надеюсь на вашу помощь.
На планете Земля имеется множество точек, заданных геодезическими координатам - широтой Lat и долготой Long. Требуется выбрать все точки, находящиеся в пределах круга радиуса R от наблюдателя, который задан широтой MyLat и долготой MyLong. Пример практического применения: найти все ларьки с пивом не далее 500 метров от дома.
Я пытался включать мозг и освежать знания в геометрии.
1. Первое решение - на поверхности: считать расстояния от меня до всех ларьков с пивом, выбирать те, которые ближе R=500.
Формула: S = 111.2 * arccos(sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong)))
Но ларьков с пивом по всей планете чуть более, чем дофига, и перебирать стопицот их ради поиска нескольких - нерационально. Кроме того, приведенная формула содержит сложные (для процессора) операции, и это будет жрать время, когда искателей пива в один момент станет слишком много.
2. Второе решение: угловые расстояния. Измеряются углы к окружности и к искомой точке относительно прямой, проведенной к наблюдателю:

Решениями являются все точки, для которых угол b меньше или равен углу a.
Формула угла между 2 точками, выраженных в геокоординатах:
b = arccos(sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong)))
Этот b должен быть не более a, которая является угловым расстоянием от наблюдателя к окружности:
arccos(sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong))) < a
или (берем cos() от обеих частей неравенства)
sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong)) > cos(a) (тут область определения, потом посчитаю)
Учитывая, что sin(MyLat), cos(MyLat) и cos(a) можно посчитать сразу один раз, а sin(Lat) и cos(Lat) можно посчитать и сохранить при задании координат ларька с пивом, единственным серьезным вычислением при переборе ларьков остается cos(Long-MyLong), но это уже не так страшно.
Направление выглядит заманчивым.
3. Можно еще так: разбить сферу на множество равноудаленных точек, и в будущем, при вводе координат ларьков, сразу определять и записывать принадлежность ларька к определенной базовой точке, что впредь сильно поможет при поиске. Но, кажется, для сферы существует лишь несколько вариантов размещения равноудаленных точек: вписанный икосаэдр и несколько других правильных многогранников. А в моем случае, таких точек надо не 12 и не 20, а тысячи.
4. Как-то решить задачу в полярной (сферической?) системе коориднат. Как - не представляю, но нутром чую: можно.
Короче, вот. Куда копать, не подскажете? Также интересуют мысли по оптимизации первого варианта. Например, на плоскости я бы сразу ограничил область поиска квадратом, и отсеял кучу хлама, у которых координаты Х и Y лежат за пределами квадрата. А тут... хер его знает, как %)
Спасибо!
зы: кстати, не нашел формулу окружности, проведенной на сфере ни в декартовых, ни в полярных координатах :(
На планете Земля имеется множество точек, заданных геодезическими координатам - широтой Lat и долготой Long. Требуется выбрать все точки, находящиеся в пределах круга радиуса R от наблюдателя, который задан широтой MyLat и долготой MyLong. Пример практического применения: найти все ларьки с пивом не далее 500 метров от дома.
Я пытался включать мозг и освежать знания в геометрии.
1. Первое решение - на поверхности: считать расстояния от меня до всех ларьков с пивом, выбирать те, которые ближе R=500.
Формула: S = 111.2 * arccos(sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong)))
Но ларьков с пивом по всей планете чуть более, чем дофига, и перебирать стопицот их ради поиска нескольких - нерационально. Кроме того, приведенная формула содержит сложные (для процессора) операции, и это будет жрать время, когда искателей пива в один момент станет слишком много.
2. Второе решение: угловые расстояния. Измеряются углы к окружности и к искомой точке относительно прямой, проведенной к наблюдателю:

Решениями являются все точки, для которых угол b меньше или равен углу a.
Формула угла между 2 точками, выраженных в геокоординатах:
b = arccos(sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong)))
Этот b должен быть не более a, которая является угловым расстоянием от наблюдателя к окружности:
arccos(sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong))) < a
или (берем cos() от обеих частей неравенства)
sin(MyLat)*sin(Lat) + cos(MyLat)*cos(Lat)*cos(Long-MyLong)) > cos(a) (тут область определения, потом посчитаю)
Учитывая, что sin(MyLat), cos(MyLat) и cos(a) можно посчитать сразу один раз, а sin(Lat) и cos(Lat) можно посчитать и сохранить при задании координат ларька с пивом, единственным серьезным вычислением при переборе ларьков остается cos(Long-MyLong), но это уже не так страшно.
Направление выглядит заманчивым.
3. Можно еще так: разбить сферу на множество равноудаленных точек, и в будущем, при вводе координат ларьков, сразу определять и записывать принадлежность ларька к определенной базовой точке, что впредь сильно поможет при поиске. Но, кажется, для сферы существует лишь несколько вариантов размещения равноудаленных точек: вписанный икосаэдр и несколько других правильных многогранников. А в моем случае, таких точек надо не 12 и не 20, а тысячи.
4. Как-то решить задачу в полярной (сферической?) системе коориднат. Как - не представляю, но нутром чую: можно.
Короче, вот. Куда копать, не подскажете? Также интересуют мысли по оптимизации первого варианта. Например, на плоскости я бы сразу ограничил область поиска квадратом, и отсеял кучу хлама, у которых координаты Х и Y лежат за пределами квадрата. А тут... хер его знает, как %)
Спасибо!
зы: кстати, не нашел формулу окружности, проведенной на сфере ни в декартовых, ни в полярных координатах :(
no subject
Date: 2010-04-30 12:00 pm (UTC)no subject
Date: 2010-04-30 12:05 pm (UTC)В такой системе координат обычный круг перестанет быть кругом, особенно в дальних углах. В этой системе координат задача сведется к тому, чтоб вычислить принадлежность точки X не кругу, а хитрой фигуре, похожей на эллипс, но даже им не являющейся (
no subject
Date: 2010-04-30 12:16 pm (UTC)А по поводу карт... зело интересно, стукнусь :)
no subject
Date: 2010-04-30 05:57 pm (UTC)no subject
Date: 2010-04-30 09:59 pm (UTC)no subject
Date: 2010-04-30 12:18 pm (UTC)no subject
Date: 2010-04-30 11:59 am (UTC)no subject
Date: 2010-04-30 12:04 pm (UTC)Если говорить не о равномерно, а случайно разбросаных точек, то вставет вопрос их разного относительного положения, и, как следствие, трудности в дальнейших расчетах.
Или я не так понял?
no subject
Date: 2010-04-30 12:56 pm (UTC)Как вариант расположения: первый шаг - на шар кладется 6 окружностей (как на куб). Следующие - делят эту окружность на 4 части. И так далее.
no subject
Date: 2010-04-30 12:02 pm (UTC)no subject
Date: 2010-04-30 12:11 pm (UTC)Круги одинакового радиуса, расположенные на разных широтах, будут иметь разные предельные долготы.
Оки, даже если мы их сможем посчитать. Для поиска в районе экватора все красиво: там органиченная нами зона почти квадратная, оптимальность - высокая. Если мы ищем ближе к полюсам? Область поиска, ограниченная предельными широтами и долготами, по форме близка к трапеции, и чем ближе к полюсу, тем больше отношение ее верхнего и нижнего основания (ну то есть растяяяянутая такая выходит), что перестает быть эффективным.
Если наш любимый круг захватывает и полюс, область поиска ваще хитрая получаетя.
Короче, я согласен, что этим кое-то ограничить можно. Но в разных случаях - с разной эффктивностью, которая, не уверен, что всегда оправдана.
. А если
no subject
Date: 2010-04-30 12:41 pm (UTC)no subject
Date: 2010-05-01 02:57 pm (UTC)у тебя есть координаты точки MyLon, MyLat и радиус поиска R
1. Сначала ограничить зону поиска квадратом со стороной 2z и центром в MyLon, MyLat, для этого найти два угла квадрата lon1, lat1 и lon2, lat2 и теперь рассматривать только точки внутри этого квадрата.
формулы для расчета углов квадрата найдешь здесь: http://www.movable-type.co.uk/scripts/latlong.html в разделе "Destination point given distance and bearing from start point",
lon1, lat1 - bearing 45 deg, distance R*SQRT(2)
lon2, lat2 - bearing 225 deg, distance R*SQRT(2)
надеюсь "ларьков" в заданной округе уже же не сотни, теперь можешь по своему первому варианту искать, опять же воспользуйся формулами и скриптами с того сайта :)
надеюсь помог
no subject
Date: 2010-05-01 03:04 pm (UTC)Если так сильно надо искать такие точки в районе полюсов - реально проще для полюсов отдельный алгоритм придумать, чем городить сложный, но универсальный
единственно, если тебе ларьки надо искать в радиусе то 100 м то 5000 км.. тогда всяко сложнее. но не совсем понятен смысл задачи тогда :)
no subject
Date: 2010-05-12 08:59 pm (UTC)