azure - 有关在 Azure 存储中存储和搜索地理位置数据的问题

标签 azure geolocation

大家好,我正在建立一个网站,需要能够存储一个人的物理位置,并允许某人搜索该位置一定半径内的其他人。举个例子,让我们假设它是一个约会网站(事实并非如此),因此作为用户,您希望找到当前位置 50 英里范围内满足其他一组搜索条件的人。

目前,我将所有用户信息存储在 Azure 表存储中。然而,这是我第一次尝试创建地理感知搜索算法,因此我想验证我不会浪费时间做一些完全疯狂的事情。为此,我的实现思路如下:

  1. 将用户位置的经度和纬度存储在 Azure 表中
  2. 每个条目的 PartitionKey 是该人居住的州(或国家/地区,如果在美国以外)
  3. 我想使用半正矢方程计算当前用户与所有其他用户之间的距离。我假设我可以将其嵌入到我的 LINQ 查询中?
  4. 最终我希望能够获得半径内所有州/国家的列表,以便我可以根据 PartitionKey 进行优化

自然,这种实现策略会带来一些问题:

  1. 如果我在 LINQ 查询中执行半正矢方程,它会在哪里执行?我最不想要的就是我的 WebRole 从 azure 存储中提取每条记录,以便在应用程序进程中对其运行这个半正矢方程
  2. 使用 Azure 存储执行此操作的想法完全疯狂吗?我知道有像 MongoDB 这样的解决方案能够内置空间搜索查询。我喜欢 Azure 的可扩展性,但我应该研究一些更好的替代方案吗?

感谢您提前提供的帮助!

最佳答案

如果您希望对 Azure 表进行快速查询,则必须针对分区键和行键运行查询。此外,如果您使用 LINQ 查询 Azure 表,那么您需要小心使用哪些函数。如果可以为所有行计算一次值,LINQ 会很聪明,并在将查询发送到 AZT 之前对其进行评估,但是如果需要对每一行进行评估,那么您只能使用 Azure 支持的那些值(即一个非常短的列表)。

如果您想为您的区域使用边界正方形而不是边界圆,您也许可以实现此目的。将纬度存储在 PartitionKey 中,将经度存储在 RowKey 中,并使用如下所示的查询:

var query = from UserLocation ul
            in repository.All()
        where
            ul.PartitionKey.CompareTo(minimumLatitude) > 0
            && ul.PartitionKey.CompareTo(maximumLatitude) < 0
            && ul.RowKey.CompareTo(minimumLongitude) > 0
            && ul.RowKey.CompareTo(maximumLongitude) < 0
        select
            ul;

这可能并不像您希望的那么聪明。如果这对您不起作用,那么您需要考虑其他选择。 SQL Azure 支持geospatial queries如果您想留在 Microsoft 大家庭。

关于azure - 有关在 Azure 存储中存储和搜索地理位置数据的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8055900/

相关文章:

android - 如何保护 Android 应用程序中的 Azure 翻译 API key

c# - GSM 基站定位和三角测量算法(类似于 OpenCellID/Skyhook/Google 的 MyLocation)

iOS 自定义 map 、地理位置、 map 绘制等

javascript - 使用 javascript 或 jQuery,检测用户是否拒绝浏览器定位计算机的请求

azure - 我应该使用哪种机器人解决方案,Botframework 或 Composer 工具或 Power Virtual Agent? Power 虚拟代理成本高吗?

azure - 使用 Azure 自动缩放时,我是否需要在 web.config 中指定 MachineKey?

.net - SQL Azure 上的全文搜索

java - 如何在Android中获取当前位置

android - 提取GPS信息到 "steady"和 "Moving"

c# - 在 Azure 实例上实现简单的本地内存缓存