好的,这就是设置:
构建实时AngularJS聊天应用程序。但是,我想限制用户通过API调用看到的消息,该API调用确定其附近的其他消息。
出于某种原因,我无法解决这个问题。我已经探索了socket.io,FireBase,PubNub,我似乎无法想出一种很好的方法来限制基于设置参数的API调用从这些服务返回的数据。
思想?
答案 0 :(得分:4)
要按位置连接两个或更多人的群组,您将采用纬度/经度值并降低精确度的分辨率,通过这样做,您可以扩展邻近度。您可以一次使用多种分辨率或使用固定分辨率。
接下来,我们将介绍geo哈希lat / long coords的一些源代码片段。通过降低浮点值的精度来增加纬度/长度的半径是相当简单的。使用此功能,您可以展开圆圈并收集Lat / Long。
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Geo Hash
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
function geohash( coord, resolution ) {
var rez = Math.pow( 10, resolution || 0 );
return Math.floor(coord * rez) / rez;
}
“缩放”级别,基本上是几个不同的笛卡尔网格,粒度越来越大。一旦Geofencing事件触发,您将发布到与每个缩放级别对应的一组通道。缩放级别很重要,因为我们实际构建Geofencing和PubNub之间的链接。缩放级别是笛卡尔坐标Lat / Long的分辨率/分辨率(想想X,Y坐标)。通过降低纬度/经度坐标的分辨率,我们可以构造一个点击网格的1个框的通道名称。分辨率越小意味着框越大,并且需要确定关联的PubNub通道。
// Create Proximity Channel
channel = geohash( pos.latitude, 0 ) + '' + geohash( pos.longitude, 0 );
这将创建一个非常宽的圆并生成用于连接的通道名称。接下来使用此频道名称连接到PubNub。
// Connect to Proximity Channel
pubnub.subscribe({
channel : channel,
message : receive,
connect : ready,
presence : presence
});
您将计算周围的方块,以提供更精确的方式扩展锥度和半径。这将消除“击剑”效应。
就是这样!您只需降低地理坐标的分辨率,并将其用作PubNub上的通道名称。另请查看浏览器的navigator.geolocation.getCurrentPosition(...)
方法,以获取chrome / firefox / ie / opera / mobile / safari浏览器中的lat / long。