У меня есть две таблицы MySQL с местоположениями, table1
и table2
(см. ниже). В каждой таблице > 100 тыс. строк. Я хотел бы найти расстояние между каждым местоположением в этих двух таблицах, используя их геолокации.
Вот запрос MySQL, чтобы найти расстояние между одной геолокацией, например (-37,22, 88,88), и всеми местоположениями в table1
.
$lat = -37.22;
$long = 88.88;
SELECT id, latitude, longitude, name
((2 * 3960 *
ATAN2(
SQRT(
POWER(SIN((RADIANS($lat - latitude))/2), 2) +
COS(RADIANS(latitude)) *
COS(RADIANS($long)) *
POWER(SIN((RADIANS($long - longitude))/2), 2)
),
SQRT(1-(
POWER(SIN((RADIANS($lat - latitude))/2), 2) +
COS(RADIANS(latitude)) *
COS(RADIANS($long)) *
POWER(SIN((RADIANS($long - longitude))/2), 2)
))
)
)) AS distance FROM table1 ORDER BY distance;
Table1
id name latitude longitude
1 foo1 -37.12 62.34
2 foo2 -47.12 72.34
3 foo3 -57.12 82.34
Table2
id name latitude longitude
1 bar1 -38.22 66.11
2 bar2 -48.22 76.11
3 bar3 -58.22 86.11
Учитывая, что это тоже большие данные, я не уверен, с чего начать. Мысли?
sin()
иcos()
только один раз. Можете ли вы подробно рассказать о цикле, который создает данные в блоках. Это просто простой циклfor
на любом языке программирования, смешанный сlimit
offset
в MySQL? Я никогда не занимался большими данными, поэтому предполагаю, что есть более причудливые решения (не то чтобы я хотел быть причудливым). 23.06.2016select distance(*) from table1, table 2 where table1 between 1 and 10.000
примерно за час, то просто скопируйте/вставьте 10 раз. Просто не запускайте все это вместе, иначе оно будет обрабатываться как транзакция и будет хранить временные таблицы для всего процесса. 23.06.2016