class A
{
int x;
};
class B
{
B( ) : x(1), c('a') { }
int x;
char c;
};
int main( )
{
A a;
B b;
a = b; // b.c == 'a' is "sliced" off
return 0;
}
blockquote>
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
Это лучший запрос
Чтобы найти ближайшее место, вы можете использовать класс геокодирования. Поскольку у вас есть Геопотоки (широта и долгота), можно использовать обратное геокодирование. Обратное геокодирование - это процесс преобразования координаты (широты, долготы) в (частичный) адрес. Для получения дополнительной информации см. этот .
SELECT latitude, longitude, SQRT(
POW(69.1 * (latitude - [startlat]), 2) +
POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;
, где [starlat] и [startlng] - это позиция, в которой начать измерять расстояние, а 25 - расстояние в км.
Рекомендуется использовать хранимую процедуру для использования запроса, потому что он будет проверять множество строк, чтобы найти результат.
Когда метод должен выполнить, лучше сначала фильтровать по широте и долготе, а затем вычислить квадратное расстояние, приближенное. Для стран Северной Европы он будет составлять около 0,3 процента в пределах 1000 км.
Таким образом, вместо вычисления на расстоянии:
dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)
можно вычислить приблизительное значение (предположим, что lat = lat 1 близок к lat 2) как
const cLat2 = cos lat ^ 2
const r_earth2 = r_earth ^ 2
dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2)
Order by Dist_App 2, а затем просто вытащите квадратный корень из результата.
sesach : ( 3959 * acos( cos( radians('.$_REQUEST['latitude'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$_REQUEST['longitude'].') ) + sin( radians('.$_REQUEST['latitude'].') ) * sin( radians( latitude ) ) ) ) <='.$_REQUEST['mile'];
Поиск местоположений рядом с MySQL
Вот оператор SQL, который найдет ближайшие 20 местоположений, находящихся в радиусе 25 миль от координаты 37, -122. Он вычисляет расстояние, основанное на широте / долготе этой строки и целевой широте / долготе, а затем запрашивает только строки, где значение расстояния меньше 25, заказывает весь запрос по расстоянию и ограничивает его до 20 результатов. Чтобы выполнить поиск по километрам вместо миль, замените 3959 на 6371.
Структура таблицы:
id,name,address,lat,lng
ПРИМЕЧАНИЕ. Здесь широта = 37 & amp; долгота = -122. Итак, вы просто передаете свои собственные.
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) *
sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING
distance < 25 ORDER BY distance LIMIT 0 , 20;
Здесь вы можете найти подробности здесь .
У SQL проблемы. В таблице, подобной:
`ubicacion` (
`id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
`latitud` DOUBLE NOT NULL ,
`longitud` DOUBLE NOT NULL ,
PRIMARY KEY (`id_ubicacion`) )
Изменение id_ubicacion при использовании:
SELECT `id_ubicacion` , ( 3959 * ACOS( COS( RADIANS( 9.053933 ) ) * COS( RADIANS( latitud ) ) * COS( RADIANS( longitud ) - RADIANS( - 79.421215 ) ) + SIN( RADIANS( 9.053933 ) ) * SIN( RADIANS( latitud ) ) ) ) AS distance
FROM ubicacion
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20