从地理坐标计算本地用户的最有效方法是啥?

Posted

技术标签:

【中文标题】从地理坐标计算本地用户的最有效方法是啥?【英文标题】:Whats the most efficient way to calculate local users from a geo coord?从地理坐标计算本地用户的最有效方法是什么? 【发布时间】:2011-05-04 23:40:32 【问题描述】:

[编辑] - 正如 cmets 中向我指出的那样,我应该注意到我将使用基于 LAMP 的架构,即 mysql 数据库。很抱歉忘记提及这一点。

我必须为 iPhone 应用程序创建 php 后端。该应用程序发送用户坐标并请求关闭 10 个本地用户。

我只是想知道确定这一点的最有效方法是什么,我不想扫描整个用户表,计算他们的地理坐标和目标之间的距离并从最低到最远排序。

谁能提出一个更优雅的解决方案,而不是扫描所有用户?感谢您的宝贵时间。

【问题讨论】:

您没有写下您正在使用哪个数据库。有些支持开箱即用,有些支持扩展。 二进制空间分区可以帮助您限制搜索字段。 我将使用 MySQL,感谢您的提醒 :) GIS and Spatial Extensions with MySQL; Geo Distance Search with MySQL 【参考方案1】:

您可以按近似的纬度和经度对用户进行分组(例如,按整度或十分之一度,或任何适合您所获得分布的比例),然后从查询用户的存储桶向外工作。

但不确定额外的复杂性是否值得,除非蛮力方法真的是性能消耗。

【讨论】:

另见***.com/questions/516574/… 谢谢大卫,也许我太谨慎了,蛮力可能足以满足我期望的用户数量【参考方案2】:

最有效的方法是使用空间索引或空间填充曲线。空间索引将 2d 复杂度降低到 1d 复杂度,因此它有助于细分表面。您想查找 Nick 的空间索引四叉树希尔伯特曲线博客。

【讨论】:

听起来很复杂,但我会研究一下,谢谢你的墓志铭回复 你可以在 phpclasses.org (hilbert-curve) 下载我的希尔伯特曲线类。【参考方案3】:

有多种方法可以做到这一点。这是在 sql 查询中执行此操作的一种方法。

$sql = "Select id, abs($currlat - latitude) + abs($currlon - longitude) as distance from geo_loc_table order by distance asc";

这样做的问题是它的效率不是很高。我建议您购买某种可以为您完成工作的索引软件。狮身人面像可能很合适。

【讨论】:

计算实际差异会比实际更复杂。我建议无论如何尝试 Sphinx。【参考方案4】:

由于地球曲线,你必须做一些计算

SELECT id, 6371 * ACos(Cos(RADIANS(users.Lat)) * Cos(RADIANS(CurrentLat)) * Cos(RADIANS(CurrentLng) - RADIANS(users.Lng)) + Sin(RADIANS(users.Lat)) * Sin(RADIANS(CurrentLat)) ) AS distance
FROM users
ORDER BY distance
LIMIT 10;

distance 以公里为单位,如果您想要里程,请将 6371 替换为 3959

【讨论】:

以上是关于从地理坐标计算本地用户的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中禁用/启用本地通知?

在 CouchBase 上获取未经用户投票的帖子的最有效方法是啥?

创建零填充 JavaScript 数组的最有效方法是啥?

计算多点之间地理空间距离的最有效方法?

反向数据编码是啥

电脑杀毒后其他电脑共亨打不开是啥原因?