Расстояние между точками на поверхности Земли

Тема в разделе "WASM.HEAP", создана пользователем _DEN_, 10 апр 2011.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Привет.

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

    Вот здесь я нашел формулу: http://mk.semico.ru/dr_info19.htm

    Но синусы, косинусы и арккосинусы - это слишком долго. Дело в том, что мне нужно делать вычисление расстояния в SQL-запросе в условии WHERE - выбрать точки, удаленные от данной не дальше чем N. Дело спасает то условие, что мне не нужна большая точность - ошибка до 50% меня устраивает. Например, вместо теоремы пифагора sqrt((x2 - x1)^2 + (y2 - y1)^2) можно использовать сумму модулей разности коорднат: abs(x2 - x1) + abs(y2 - y1) - ошибка в данном случае не превышает ~41% (sqrt(2) - 1).

    Как можно было бы упростить формулу по ссылке, если можно допускать ошибку до 50% ?
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    пусть центральная точка имеет координаты (а,b)
    Если я правильно понял, то нужно определить точки, которые попадают а круг
    [​IMG]
    Точки которые попадают в вписанный квадрат - попадают в круг. Площадь квадрата = 2*R^2 площадь круга - 2*Pi*R^2. Т.е. примерно 64 процента точек можно определить условием where (a< a+x) and (a> a-x) and (b < b+x) and (b > b-x) где х - угол между центром и точкой в центре любой из сторон вписанного квадрата. Этот угол можно вычислить до Sql запроса 1 раз.
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Хотя я сильно гоню. Площади для выпуклых поверхностей будут не такие. Но, думаю, надо их расчитать. Если удасться доказать, что отношение площади описываемой кругом и вписанным в неё квадратом устроят вас, то способ рабочий
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    asd
    точно
     
  5. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Точно что?:)

    _DEN_
    А какое расстояние будет использоваться? А то если нужно определить объекты в радиусе 300 км то, думается, кривизной можно пренебречь, а вот если > 1000, то, наверное, уже нет.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    asd

    Города внутри страны. Во всех случаях, кроме россии, видимо можно пренебречь. Насчет россии - с ходу не ясно :)
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    в принципе, расстояние можно достаточно точно и быстро получать в виде квадрата косинуса половины угла между точками

    k = cos2(alpha) = (dX2 + dY2)/R2

    с увеличением угла до 90o cos будет уменьшаться

    расстояние

    l = Pi*R * (2*alpha / Pi) = (2*R) * alpha

    угол из косинуса вполне можно получать таблицей (R в первом случае константа и ей можно пренебречь или задаться любым числом, а вот квадратами не стоит). достаточно быстро и точность можно наперед задать. скажем, 1000 4х байтных коэфициентов займет 1кб и даст точность в 1км для 1000 км. ну а на 1 - 10 км помехи от ландшафта будут больше чем неточность от кривизны.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Всем спасибо за помощь! Задача решена.
     
  9. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Тогда просто надо умножить на радиус Земли (6411 км.) и все...

    Код (Text):
    1. (abs(Fi2 - Fi1) + abs(Lm2 - Lm1))*6411
    PS: разность углов, естественно, в радианах
    PPS: надо контролировать разность углов: если abs(Fi2 - Fi1) > Pi, вычесть Pi и т.д.