从城市名称中获取坐标称为反向地理编码。谷歌地图有一个很好的 Api fot。
还有Geonames 项目,您可以在其中获得包含城市、邮政编码等及其坐标的庞大数据库
但是,如果您已经有了坐标,则可以通过简单的计算来获得距离。
棘手的事情是获得一个性能不错的版本。您可能将其存储在 mysql 数据库中,因此您需要在那里快速完成。
绝对有可能。我曾经做过一个包含该代码的项目,我将获取它并发布在此处。
但是,为了加快速度,我建议首先围绕中心坐标进行矩形选择。使用蜜蜂树索引甚至更好的东西,如多维范围搜索,这非常非常快。然后在其中,您可以计算有限数据集的确切距离。
在矩形选择之外,方向是如此之大,以至于不需要如此精确地显示或计算。或者只显示国家、大陆或类似的东西。
我还在办公室,但是当我回到家时,我可以为您取密码。同时,如果您能告诉我您如何存储数据,那就太好了。
编辑:与此同时,您有一个对我来说看起来正确的函数(我在一个查询中没有函数就做到了......)
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