1

我数据库中的每个用户都与一个城市相关联(带有经度和纬度)

我将如何找出哪些城市彼此靠近?

即在英国,剑桥离伦敦相当近。

所以如果我有一个住在剑桥的用户。靠近他们的用户将是居住在周边城市的用户,例如伦敦、赫特福德等。

有什么想法可以解决这个问题吗?而且,我将如何定义什么是接近的?即在英国关闭将比在美国更接近,因为美国更加分散。

想法和建议。另外,您知道提供此类功能的任何服务吗?

谢谢

4

5 回答 5

0

从城市名称获取坐标称为反向地理编码。谷歌地图有一个很好的 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

于 2011-01-11T20:00:15.337 回答
0

您需要空间索引或 GIS 功能。你用的是什么数据库?MySQL 和 PostgreSQL 都具有 GIS 支持,这将允许您使用 SQL 查询找到 N 个最近的城市。

于 2011-01-12T15:49:25.523 回答
0

最简单的方法是根据城市的纬度和经度以及距离(通过将距离转换为经度)来计算边界框。

一旦你有了那个框(最小纬度,最大纬度,最小经度,最大经度),查询其纬度和经度在边界框内的其他城市。这将为您提供一个近似列表,并且应该非常快,因为它将能够使用您在纬度和经度列上可能拥有的任何索引。

如果需要,您可以从那里使用真实的“球体上的点之间的距离”函数缩小列表范围。

于 2011-01-11T20:06:38.760 回答
0

您可能要考虑的另一个选择是将所有城市放入空间搜索树中,例如 kd-tree。Kd-trees 有效地支持最近邻搜索,以及对给定边界框中所有点的快速搜索。然后,您可以通过搜索一些城市最近的邻居来找到附近的城市,然后使用与这些邻居的距离来获得要搜索的边界框的估计大小。

于 2011-01-18T09:56:30.250 回答
0

如果您可以调用外部 Web 服务,则可以使用 GeoNames API 来定位您定义的某个半径内的附近城市:

http://www.geonames.org/export/web-services.html

于 2011-01-11T19:55:11.897 回答