2012-04-25 2 views
0

У меня есть разные продавцы, сэкономившие свои собственные широтные и продольные позиции в моей базе данных.20 км/миль вокруг лата, длинный

Затем я использую карты Google, чтобы указать их на карте, однако у вас также есть функция поиска, где вы можете ввести любой адрес, который вы хотите, с 5/10/20 км/мили «вокруг».

Так, например, когда я ищу Лондон и 10 км вокруг, я ожидал бы, что все продавцы из лондона вернутся в лат и длинный + 10 км вокруг этой точки.

сейчас я функция работала с небольшой разницей (очевидно, без опции радиуса)

private function findServicesNearLocation($filter = array(), $lat, $lng) { 
    // set radius 
    $difference = 0.07; 

    // build filter 
    $latitude_from = floatval($lat) - $difference; 
    $latitude_to = floatval($lat) + $difference; 
    $longitude_from = floatval($lng) - $difference; 
    $longitude_to = floatval($lng) + $difference; 

    $filter[] = "a.gps_latitude >= {$latitude_from}"; 
    $filter[] = "a.gps_latitude <= {$latitude_to}"; 
    $filter[] = "a.gps_longitude >= {$longitude_from}"; 
    $filter[] = "a.gps_longitude <= {$longitude_to}"; 

    // return services 
    return $this->vendors->getVendors(implode(' AND ', $filter)); 
} 

Как бы я должен изменить вышеуказанную функцию, чтобы сделать соответствующую оценку и выбрать все поставщик от определенного «10 км вокруг» тех латов и долго.

Спасибо

+0

Вы можете посмотреть на [этой] подобный вопрос (http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude -точность-точки) на SO. – eggyal

+0

он не похож, человек должен был рассчитать расстояние между двумя точками, у меня всего 1 очко в пространстве, как лат, длинный, и мне нужно выбрать всех моих продавцов в этом положении на 20 км и более – Highstrike

+0

Принцип тот же. Но я даю вам, ваша проблема распространяется на то, как этот принцип применяется в вашем случае. – eggyal

ответ

1

Я думаю, что это ответ на то, о чем вы просите. Широта и долгота градусов примерно на 111 км друг от друга, поэтому вы можете понять это в своей математике. Надеюсь, это то, о чем вы просите.

private function findServicesNearLocation($filter = array(), $lat, $lng, $distanceKilometers=0) { 
    // set radius 
    $difference = 0.07; 
    $distance=$distanceKilometers!=0?ceil($distanceKilometers/111):0; 
    // build filter 
    $latitude_from = floatval($lat) - $difference - $distance; 
    $latitude_to = floatval($lat) + $difference + $distance; 
    $longitude_from = floatval($lng) - $difference - $distance; 
    $longitude_to = floatval($lng) + $difference + $distance; 

    $filter[] = "a.gps_latitude >= {$latitude_from}"; 
    $filter[] = "a.gps_latitude <= {$latitude_to}"; 
    $filter[] = "a.gps_longitude >= {$longitude_from}"; 
    $filter[] = "a.gps_longitude <= {$longitude_to}"; 

    // return services 
    return $this->vendors->getVendors(implode(' AND ', $filter)); 
} 
+1

По крайней мере, вы должны, вероятно, ввести [теорему Пифограса] (http://en.wikipedia.org/wiki/Pythagorean_theorem), чтобы получить радиус, а не прямоугольник ... – eggyal

+0

@eggyal вы могли бы помочь мне с этим? – Highstrike

+1

@Highstrike: Вы хотите '(a.gps_lat- $ lat_from)^2 + (a.gps_long- $ long_from)^2 <= $ distance^2' – eggyal

1

Посмотрите, как Вы ищете на прямоугольнике, а не в радиусе.

Для этого можно использовать MySQL Пространственное Extension и читать больше о реализации здесь: Geo-Distance-Search-with-MySQL

Но для вашей информации, MongoDB может сделать это с помощью простой «SELECT». Дайте ему положение и диапазон, и все будет готово. Дополнительная информация: MongoDB Geospatial Indexing

+0

, в то время как это, вероятно, было бы лучшим способом сделать это, установка расширения не может быть решена, так как владельцы очень строгие в этом вопросе, тем не менее, мне нравится следующий запрос: – Highstrike

+0

'SELECT destination. *, 3956 * 2 * ASIN (SQRT (POWER (SIN ((orig.lat -dest.lat) * pi()/180/2), 2) + COS (orig.lat * pi()/180) * COS (dest.lat * pi()/180) * POWER (SIN ((orig.lon -dest.lon) * pi()/180/2), 2))) asdistance FROM users destination, users originWHERE origin.id = userid и destination.longitude между lon1 и lon2 и destination.latitude между lat1 и lat2 с расстоянием Highstrike

+0

, хотя это был бы мой выбор в качестве ответа, из-за строгих владельцев я не могу использовать это, извините. – Highstrike

-2
SELECT Latitude, Longitude, 111.045* DEGREES(ACOS(COS(RADIANS(latpoint)) * COS(RADIANS(Latitude)) * COS(RADIANS(longpoint) - RADIANS(Longitude)) + SIN(RADIANS(latpoint)) * SIN(RADIANS(Latitude)))) AS distance_in_km FROM table JOIN (SELECT 42.81 AS latpoint, -70.81 AS longpoint) AS p ON 1=1 ORDER BY distance_in_km LIMIT 15 
+0

Формула без какого-либо контекста или комментария не имеет особого отношения ни к кому. – Teepeemm

+0

Упоминайте, что вы там сделали? Благодарю. – Highstrike