Как эффективно использовать значения долготы / широты в Mysql? - PullRequest
3 голосов
/ 22 сентября 2009

Благодаря Wikileaks, здесь, в Великобритании, мы теперь можем получить доступ к нашим координатам долготы и широты для каждого почтового индекса почтовых индексов wikileaks uk ВАЖНО. Не используйте эти данные в общедоступных приложениях. Существует опасение, что данные были умышленно испорчены, и вы можете быть признаны нарушившими закон об авторском праве. Попробуйте использовать данные с сайта с открытым исходным кодом, например Почтовый индекс сайта Великобритании

Теперь можно рассчитать расстояния между каждой точкой, используя следующий расчет (первоначально из прекрасной книги Pro Mysql):

Расстояние d между двумя точками (x1, y1) и (x2, y2) можно рассчитать по следующему уравнению (при условии, что значения x являются широтой, а значения y - долготой в радианах, r - радиус сферы что составляет 3956 миль):

d = acos (sin (x1) * sin (x2) + cos (x1) * cos (x2) * cos (y2-y1)) * r

Теперь это достаточно хорошо, или я должен использовать новые типы данных и функции ГИС, и если да, то как мне преобразовать ссылки на долготу и широту в тип данных Point? Я понимаю, что, поскольку Земля не является идеальной сферой, вычисление расстояния, которое я цитирую выше, не является совершенным; однако это достаточно хорошо для моих целей. Будет ли использование новой функциональности ГИС а) ускорять расчет расстояния б) уточнять расчет расстояния?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

Чтобы сфокусироваться на (а):

В прошлом я предварительно вычислял части, сохраняя значения lat, long, xaxis, yaxis и zxais, где x, y & z определены как:

xaxis = cos(radians(Lat)) * cos(radians(Lon))
yaxis = cos(radians(Lat)) * sin(radians(Lon))
zaxis = sin(radians(Lat))

Затем расстояние можно вычислить с использованием SQL, например, (acos( xaxis * $xaxis + yaxis * $yaxis + zaxis * $zaxis ) * 6367.0 / 1.852) (где значения, начинающиеся с $, предварительно вычисляются для рассматриваемой начальной точки таким же образом, как указано выше)

Предварительное вычисление таким образом переводит относительно дорогостоящий триггер в одноразовое событие и упрощает запрос.

1 голос
/ 22 сентября 2009

Ну, чтобы ответить на ваш вопрос "B", потому что ваше уравнение предполагает идеальную сферу, вы будете немного отстранены (и, скорее всего, будет становиться все хуже и хуже, чем дальше эти две точки находятся друг от друга) ). Если ГИС учитывает это, то вы получите более точные расчеты расстояния.

Что касается преобразования из широты / долготы в точку, я мог бы поклясться, что это было предоставлено в API Карт Google . (См. Справочник GLatLng .)

...