2014-10-01 4 views
0

мне было интересно, если есть быстрый способ известково расстояние между буксировка точки Lat и LNG у меня есть этот код, но это медленноMySql Широта и Долгота

SELECT * FROM `hotels` WHERE (SQRT(POW(`lat` - 32.171253 , 2) + POW(`lng` - 35.057362, 2)) * 100) < 1 

заносить точки находятся в 1 км вокруг

благодарственное-х заранее

+0

это не сработает. широта-долгота находятся на сфере, а не на плоскости .... Сделайте поиск ... –

+0

Я сделал поиск, что я нахожу, как эта работа, но медленная. – skynet

+0

@shyam я не стал теперь так благодарить, так что же такое уравнение? – skynet

ответ

1
CREATE FUNCTION dbo.DistanceKMFromLatLong 
(
    @srcLatitude decimal(9,6), 
    @srcLongitude decimal(9,6), 
    @destLatitude decimal(9,6), 
    @destLongitude decimal(9,6) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT DistanceKM = ACOS(SIN(PI()*@srcLatitude/180.0)*SIN(PI()*@destLatitude/180.0)+COS(PI()*@srcLatitude/180.0)*COS(PI()*@destLatitude/180.0)*COS(PI()*@destLongitude/180.0-PI()*@srcLongitude/180.0))*6371   
) 
GO 

Ref: Haversine formula

Вы используете это путь объединения двух таблиц, содержащих источник и назначение лат/долготы следующий:

select 
    p.Latitude, 
    p.Longitude, 
    s.Latitude, 
    s.Longitude, 
    DistanceFromStoreKMNew = d.DistanceKM 
from 
    Staging.PostcodesToLatLong p 
    join dbo.Store s on s.StoreId = p.StoreId 
    cross apply dbo.DistanceKMFromLatLong(p.Latitude, p.Longitude, s.Latitude, s.Longitude) d 

Можно также создать скаляр функцию из формулы гаверсинуса.

Если вы хотите это быстрее, создайте хранимую процедуру CLR.

+0

хорошо, но не могли бы вы предоставить, как использовать, например, как установить lat и lng, и какой результат в миле или километре? – skynet

Смежные вопросы