2012-06-20 23 views
25

Ben google maps bu tüm verileri getirilen gelmişEnlem ve boylamı sql veritabanından kullanarak en yakın konum nasıl bulunur?

Address       Latitude    longitude 

Kathmandu 44600, Nepal    27.7     85.33333330000005 
Los, Antoniterstraße    37.09024    -95.71289100000001 
Sydney NSW, Australia    49.7480755    8.111794700000019 
goa india       15.2993265    74.12399600000003 

veritabanı tablosu aşağıdaki bir yakın konumu bulmak istiyorum. Burada bir yerden en yakın yeri bulmalıyım. Diyelim ki Surkhet'in enlemi 28.6 ve boylam 81.6, 'dur. Surkhet mekanından en yakın yeri nasıl bulabilirim.

+0

soldaki * ilgili * linklere baktınız >>> bunların bir kısmı sizin için konuya bakıyor. –

+2

@Dagon - Ben * diğer * sol demek istediğini varsayalım? –

+0

@Damien_The_Unbeliever güney yarımkürede yaşadım, solumuz sağınız :-) –

cevap

16

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;

Bu

+0

mesafe 25 mil mi burada? – Sripaul

+7

Evet. 3959 - Miles, 6371 - Ben işlevinde koyarsanız –

+0

@Krishna Karki'nin, bu bir enlem ve boylam dönecektir kilometrenin? –

67

bulma yerleri yakındaki MySQL ile

İşte 37 ila 25 millik bir yarıçap içinde olan en yakın 20 yerleri bulacaksınız SQL deyimi var, -122 koordinat. Bu satırın enlem/boylamına ve hedef enlem/boylamına bağlı olarak mesafeyi hesaplar ve sonra sadece mesafe değerinin 25'ten az olduğu satırları sorar, tüm sorguyu mesafeye göre sıralar ve bunu 20 sonuçla sınırlar. Mil yerine kilometre kullanarak arama yapmak için 6371.

Tablo Yapısı 3959 yerine:

id,name,address,lat,lng 

NOT - İşte = 37 & boylam = -122 enlem. Yani sadece kendininkini geçersin.

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; 

Ayrıntılar here.

+3

Bu. Her şeyi güzel bir şekilde açıklıyor. Https://developers.google.com/maps/articles/phpsqlsearch – Scorpion

+0

Enlem 28.6 ve enlem 81.6 olan Surkhet'ten en yakın yeri bulmalıyım. bu sorguyu bu noktayı içerecek şekilde nasıl .. –

+0

:) .. Bana önermek nota bakın lütfen. Cevabımı düzenledim. Lat & lng'nizi 37 & -122, – Scorpion

3

Yakındaki konumunuzu bulmak için, Geocoder Sınıfını kullanabilirsiniz. Geopoints (enlem ve boylam) sınıfına sahip olduğunuzdan, Ters coğrafi kodlama kullanılabilir. Ters Coğrafi Kodlama bir (enlem, boylam) koordinatının bir (kısmi) adrese dönüştürülmesi işlemidir. Daha fazla bilgi için this'a bakın.

0

SQL bir sorun var En Sorgu olduğunu. Tablosunda gibi:

`ubicacion` (
    `id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT , 
    `latitud` DOUBLE NOT NULL , 
    `longitud` DOUBLE NOT NULL , 
    PRIMARY KEY (`id_ubicacion`)) 

id_ubicacion değişiklik olduğunda kullanım:

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 
0
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']; 
0

yöntem enlem ve boylam ilk filtreye daha güzel yapar ve daha sonra kare uzaklık aşağı yukarı hesaplamalıdır . İskandinav ülkeleri için 1000 km'de yaklaşık yüzde 0,3 olacak.

Bunun yerine olarak mesafe hesaplama:

dist_Sphere = r_earth * acos (sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1) 

bir yaklaşık değeri hesaplanabilir Dist_App 2 ile

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 gibi (= lat 1 lat 2 lat yakın olduğu varsayılmaktadır) ve sonra karekökü sonuçtan çıkar.[starlat] ve [startlng] mesafe ve 25 ölçme başlamak için bir pozisyon

0
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; 

km'lik mesafedir.

Sorguyu kullanmak için saklı yordamın yapılması önerilir çünkü sonucu bulmak için çok sayıda satırın kontrol edilmesi gerekir.

İlgili konular