Google'ın çözümü:
Tablo Oluşturma
MySQL tablosunu oluşturduğunuzda, lat ve lng özniteliklerine özellikle dikkat etmek istersiniz. Google Haritalar'ın mevcut yakınlaştırma özellikleriyle, ondalık basamaktan sonra yalnızca 6 basamak hassasiyete ihtiyacınız vardır. Tablonuz için gereken depolama alanını minimumda tutmak için lat ve lng özniteliklerinin boyutta kayan (10,6) olacağını belirtebilirsiniz. Bu, alanların ondalık basamaktan sonra 6 basamak ve ondalık basamaktan önce 4 basamağa kadar depolamasını sağlar, örneğin -123.456789 derece. Tablonuzda ayrıca birincil anahtar olarak kullanılacak bir id niteliği de olmalıdır.
CREATE TABLE `markers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 60 ) NOT NULL ,
`address` VARCHAR( 80 ) NOT NULL ,
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;
Tabloyu doldurma
Tabloyu oluşturduktan sonra, verileri veri ile doldurma zamanı geldi. Aşağıda verilen örnek veriler, Amerika Birleşik Devletleri'ne dağılmış yaklaşık 180 pizzacı içindir. PhpMyAdmin'de, CSV (virgülle ayrılmış değerler) dahil olmak üzere çeşitli dosya biçimlerini içe aktarmak için İTHALAT sekmesini kullanabilirsiniz. Microsoft Excel ve Google E-Tablolar CSV biçiminde dışa aktarılır, böylece CSV dosyalarını dışa / içe aktararak elektronik tablolardan MySQL tablolarına kolayca veri aktarabilirsiniz.
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Frankie Johnnie & Luigo Too','939 W El Camino Real, Mountain View, CA','37.386339','-122.085823');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Amici\'s East Coast Pizzeria','790 Castro St, Mountain View, CA','37.38714','-122.083235');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Kapp\'s Pizza Bar & Grill','191 Castro St, Mountain View, CA','37.393885','-122.078916');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Round Table Pizza: Mountain View','570 N Shoreline Blvd, Mountain View, CA','37.402653','-122.079354');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Tony & Alba\'s Pizza & Pasta','619 Escuela Ave, Mountain View, CA','37.394011','-122.095528');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Oregano\'s Wood-Fired Pizza','4546 El Camino Real, Los Altos, CA','37.401724','-122.114646');
MySQL ile Konum Bulma
İşaretler tablonuzda belirli bir enlem / boylamın belirli bir yarıçap mesafesinde olan konumları bulmak için, Haversine formülüne dayalı bir SELECT ifadesi kullanabilirsiniz. Haversine formülü genellikle bir küre üzerindeki iki çift koordinat arasındaki büyük daire mesafelerini hesaplamak için kullanılır. Vikipedi tarafından derinlemesine bir matematiksel açıklama verilir ve formülün programlama ile ilgili iyi bir tartışması Hareketli Tip'in sitesinde bulunmaktadır.
İşte 37, -122 koordinatına 25 mil yarıçap içinde en yakın 20 konumu bulan SQL deyimi. Mesafeyi, o satırın enlem / boylamına ve hedef enlem / boylama göre hesaplar ve sonra yalnızca mesafe değerinin 25'ten küçük olduğu satırları sorar, tüm sorguyu mesafeye göre sıralar ve 20 sonuçla sınırlar. Mil yerine kilometre ile arama yapmak için 3959 yerine 6371 yazın.
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 < 28
ORDER BY distance LIMIT 0, 20;
Bu, 28 milden daha kısa bir mesafede enlem ve boylamları bulmaktır.
Bir diğeri, onları 28 ila 29 mil arasında bir mesafede bulmaktır:
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 < 29 and distance > 28
ORDER BY distance LIMIT 0, 20;
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map