让我回顾一下我认为你所说的流程:
- UserA 在位置 A 签到(假设是公开签到)
- 您的服务器决定它需要通知哪些其他用户该签入(根据位置的接近程度)并向他们发送一个列出用户及其新签入位置的 socket.io 通知。
- 当客户端收到该通知时,它会更新本地地图以显示新签入的用户,然后(可能)提醒本地用户附近有新用户在他们的设备上。
- 当有人从某个位置签出时,您会重复签入过程,但这次事件会通知他们用户正在签出并且客户端可以将其从地图中删除。
无论是公共签入/签出还是私人签入/签出,逻辑都是相同的。与私人签到的唯一区别是您只分析朋友的位置来决定通知谁,而不是分析每个人。
因此,如果这是整体流程,您似乎通常需要能够确定谁在入住/退房地点附近(一定距离内),以便通知他们签入或签出事件。
因此,对于第 2 步,您需要预先存储想要参与此流程的所有用户的地理位置。然后,您需要能够有效地浏览整个列表,并找出谁可能在新签到的目标距离内。虽然您可以计算每个用户的绝对距离,但首先检查纬度或经度差是否大于某个阈值可能更有效,因为这意味着不需要更多涉及的数学来排除它们。这将使您只有一部分用户可以进行完整匹配,以查看他们是否足够接近。如果您按诸如经度值之类的方式对用户列表进行排序,那么找到一个子集来比较实际距离会更快。
一旦您找到一组位于目标距离内的用户,您就会向该组用户发送 socket.io 通知,宣布新的签到。当这些客户端收到该消息时,他们会相应地更新他们的地图并进行任何用户通知。您可以将您通知的这组用户保存在 socket.io 房间中,但我认为这并不是必需的(请参阅下面的步骤)。
对于第 4 步,用户签出某个位置。您基本上可以重复步骤 2 的过程。找出谁还在附近并向他们发送结帐消息,他们将相应地更新他们的地图。如果您已将所有用户保存在房间中,则可以将此结帐广播到房间,但是当用户自签入通知(见下文)后移动时会产生一些问题,并且您似乎可以使用相同的逻辑您之前用于第 2 步来计算第 4 步要通知的用户。
用户在其他人签到时移动
如果用户 B(收到用户 A 签入通知)决定在用户 A 签出之前搬家,您将需要使用用户 B 的新位置更新服务器并让用户 B 更新他们自己的地图。当他们更新他们的地图时,他们可以从地图中删除现在离他们的新位置太远的任何签到(他们将这些信息保存在本地,然后看看谁现在离他们太远了)。当他们通知服务器他们的新位置时,服务器会针对他们的新位置重复第 2 步,并根据他们的新位置通知他们现在离他们足够近的任何用户。
如果您使用房间来存储用户 A 签到的原始用户列表,那么每次该房间中的某人更改其位置时,您都必须不断更新该房间。由于每次有人移动时可能有很多房间需要更新,因此每次有人移动时似乎需要进行大量维护计算无论如何,因为它会被大量使用。
所以,无论如何,这些都是我的想法。希望对您有所帮助。