преобразовать к м в GPS координаты - PullRequest
1 голос
/ 08 июля 2010

Я должен посмотреть, находятся ли некоторые координаты GPS в круге, который я создаю. Когда я говорю, что создаю этот круг, я ссылаюсь на это: у меня есть lat1, long1, мое фактическое местоположение, и я хочу проверить, есть лилюбые данные, окружающие это место, но не далее, чем 1 км.Я пытаюсь использовать неравенство окружности: (x2-a2)2+(y2-b2)2 <R2, где a = lat1, b = long1 и R = радиус.Я знаю, что R = 1 км, но как мне преобразовать 1 км в данные, которые можно сравнить с координатами GPS?и x, y - каждое значение из коллекции, которое проверяется на соответствие.

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Координаты широты / долготы не работают с формулой Фитагора, поскольку Земля - ​​это сфера, а не плоская ...

Посмотрите на это руководство:

http://www.movable -type.co.uk / scripts / latlong.html

Вам нужно уравнение расстояния, чтобы увидеть, есть ли расстояние между широтой / шириной, которое вы имеете, и широтой / долготой центракруга меньше чем R.

0 голосов
/ 09 июля 2010

Это не так просто.Вы не можете вообще использовать евклидово расстояние.Вот как я думаю, вы могли бы сделать это:

Правильный путь

Правильный способ сделать это - вычислить расстояние по большому кругу (кратчайшее расстояние пешком по поверхности), котороеЯ никогда не понимал, но это довольно легко гуглить (и Адамк уже дал вам ссылку на него).

Ленивый путь

Предположим, что ваши очки не слишком близко к полюсам ичто они рядом друг с другом.Тогда вы можете использовать широту и долготу, как если бы они были евклидовыми координатами.(это в основном какая-то цилиндрическая проекция ).Тогда 1 градус широты будет (earth_circumference / 360) длинным, а 1 градус долготы будет (cos (lat) * earth_circumference / 360) длинным.

полный код будет выглядеть примерно так:

double distance_lazy(double lat1, double lon1, double lat2, double lon2){
    double xDist = (lat2 - lat1) * EARTH_CIRCUMFERENCE / 360.0;
    double yDist = cos(lat1) * (lon2 - lon1) * EARTH_CIRCUMFERENCE / 360.0;
    return sqrt(xDist^2 + yDist^2);
}

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

Способ "странного определения"

Еще одна вещь, которую вы можете сказать, это то, что «расстояние» - это прямая линия длины между точками, даже если она проходит сквозь землю.Тогда это станет вычислением трехмерных координат точки, а затем их евклидова расстояния

double distance_straight_line(double lat1, double lon1, double lat2, double lon2){
    double x1 = cos(lat1) * cos(lon1) * EARTH_RADIUS;
    double y1 = sin(lat1) * cos(lon1) * EARTH_RADIUS;
    double z1 = sin(lon1) * EARTH_RADIUS;

    double x2 = cos(lat2) * cos(lon2) * EARTH_RADIUS;
    double y2 = sin(lat2) * cos(lon2) * EARTH_RADIUS;
    double z2 = sin(lon2) * EARTH_RADIUS;

    return sqrt((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2);
}

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

Надеюсь, это поможет.

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