したがって、緯度、経度、および半径パラメータに基づいて最寄りの都市を計算するこの機能があります。都市表からのジオロケーション距離SQL
DELIMITER $$
DROP PROCEDURE IF EXISTS `world_db`.`geolocate_close_cities`$$
CREATE PROCEDURE `geolocate_close_cities`(IN p_latitude DECIMAL(8,2), p_longitude DECIMAL(8,2), IN p_radius INTEGER(5))
BEGIN
SELECT id, country_id, longitude, latitude, city,
truncate((degrees(acos(sin(radians(latitude))
* sin(radians(p_latitude))
+ cos(radians(latitude))
* cos(radians(p_latitude))
* cos(radians(p_longitude - longitude))))
* 69.09*1.6),1) as distance
FROM cities
HAVING distance < p_radius
ORDER BY distance desc;
END$$
DELIMITER ;
ここに私の都市テーブルの構造です:
> +------------+-------------+------+-----+---------+----------------+ |
> Field | Type | Null | Key | Default | Extra |
> +------------+-------------+------+-----+---------+----------------+ |
> id | int(11) | NO | PRI | NULL | auto_increment | |
> country_id | smallint(6) | NO | | NULL | | |
> region_id | smallint(6) | NO | | NULL | | |
> city | varchar(45) | NO | | NULL | | |
> latitude | float | NO | | NULL | | |
> longitude | float | NO | | NULL | | |
> timezone | varchar(10) | NO | | NULL | | |
> dma_id | smallint(6) | YES | | NULL | | |
> code | varchar(4) | YES | | NULL | |
> +------------+-------------+------+-----+---------+----------------+
それは非常によく動作します。私は(pseudcode)を行うためにLKE思い何
のようなものです:
SELECT * FROM cities WHERE DISTANCE(SELECT id FROM cities WHERE id={cityId}, {km))
、それは私に最も近い都市を返します。
どうすればいいですか?
現時点では、関数を呼び出した後、IDを繰り返し配列に渡してから、都市テーブルでWHEREINを実行しますが、これは明らかに効率的ではありません。
何か助けが大歓迎です。ありがとう。
こんにちは@Ollie Jones。あなたの迅速な対応をありがとうございました。正直言って、私はあなたのSQLが何をするかに合わせて私の関数を変更する方法を完全に理解しているとは思えません。ありがとう! :-) – Flukey
私は半正矢式をcreatedeは、ここに私のクエリです:cities_tempから 'SELECT * どこ52.205> = a.latitude - 100/111.12 と52.205 <= a.latitude + 100/111.12 と半正矢(52.205、 (52.205、a.latitude、0.144、a.longitude、 'KM') 'ここで、緯度は52.205、経度は0.144(緯度は0.144、緯度は0.144、緯度は 'KM')<= 100 ケンブリッジ、英国) – Flukey