都市名から座標を取得することは、リバース ジオ コーディングと呼ばれます。Google マップには、そのための優れた API があります。
都市、郵便番号などの巨大なデータベースとその座標を取得する Geonames プロジェクトもあります。
ただし、座標が既にある場合は、距離を取得するための簡単な計算です。
トリッキーなことは、それの優れたパフォーマンスのバージョンを取得することです。おそらくmysqlデータベースに保存されているので、そこですばやく実行する必要があります.
それは絶対に可能です。私はかつてそのコードを含むプロジェクトを行ったことがあります。それを取得してここに投稿します。
ただし、速度を上げるために、最初に中心座標の周りに長方形の選択を行うことをお勧めします。これは、蜂の木のインデックスや、多次元範囲検索などのより優れたものを使用すると、非常に高速です。その中で、限られたデータセットで正確な距離を計算できます。その長方形の選択の外では、方向は非常に広大であるため、正確に表示または計算する必要はありません。または、国、大陸などを表示するだけです。
私はまだオフィスにいますが、家に帰ったらコードを取得できます。それまでの間、データの保存方法を教えていただければ幸いです。
編集:それまでの間、あなたは私にぴったりの関数を持っています(私は1つのクエリで関数なしでそれをしました...)
CREATE FUNCTION `get_distance_between_geo_locations`(`lat1` FLOAT, `long1` FLOAT, `lat2` FLOAT, `long2` FLOAT)
RETURNS FLOAT
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE distance FLOAT DEFAULT -1;
DECLARE earthRadius FLOAT DEFAULT 6371.009;
-- 3958.761 --miles
-- 6371.009 --km
DECLARE axis FLOAT;
IF ((lat1 IS NOT NULL) AND (long1 IS NOT NULL) AND (lat2 IS NOT NULL) AND (long2 IS NOT NULL)) THEN -- bit of protection against bad data
SET axis = (SIN(RADIANS(lat2-lat1)/2) * SIN(RADIANS(lat2-lat1)/2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * SIN(RADIANS(long2-long1)/2) * SIN(RADIANS(long2-long1)/2));
SET distance = earthRadius * (2 * ATAN2(SQRT(axis), SQRT(1-axis)));
END IF;
RETURN distance;
END;
私はここからこれを引用しました:http://sebastian-bauer.ws/en/2010/12/12/geo-koordinaten-mysql-funktion-zur-berechnung-des-abstands.html
ここに別のリンクがあります:http://www.andrewseward.co.uk/2010/04/sql-function-to-calculate-distance.html