0

「socket.io を使用して、ユーザーから送信されたメッセージをすべてのクライアントのサブセットにのみブロードキャストしたいと考えています。サブセットは、メッセージを送信しているユーザーから特定の距離 (たとえば 1 km) 内にあります。必要があるようです。 [socket.on 'broadcast', (メッセージ) ] 以下のコードのセクション (これは coffeescript であり、Shoaib Burq の geochat-example github リポジトリ (https://github.com/sabman/geochat-example) から取得したものであることに注意してください)。

リカルドの提案を含め、古い [socket.on 'broadcast', (message) ->] セクションを彼の入力に置き換えます (ただし、残りの server.coffee コードとの一貫性を保つために、「user」を「record」に変更しました) 、および最後の [find:] セクション。ただし、何かがおかしいので、それが html コードに関係しているのか、coffeescript の更新に関係しているのかはわかりません。よろしくお願いします。

コードはまだ実行されていません。リカルドの最新の提案を含む:

 socket.on 'broadcast', (message) ->
    # find the sender and extract it's position
    Character.find { clientId: socket.id }, (record) =>
        chat_data =
            user: record
            conversation: message
        [lat, lng] = record.geometry.coordinates
        # find everyone within a 1km square
        km = 1/111
         area = 
            type: 'Polygon'
            coordinates: [
               [lat - km, lng - km]
               [lat + km, lng - km]
               [lat + km, lng + km]
               [lat - km, lng + km]
            ]
        Character.find { within: area }, (record) ->
            // send message to each user

     socket.broadcast.send JSON.stringify(chat_data)

問題は「検索」セクションにあるのではないかと感じています。たとえば、リカルドは次のように書いています。

    console.log ">> find #{JSON.stringify(attrs)}"

しかし、元のコードでは、これは ">>" の代わりに "=>" で読み取られます。

    console.log "=> find #{JSON.stringify(attrs)}"

qs = require 'querystring'

find: (query, callback) ->
    console.log ">> find #{JSON.stringify(attrs)}"

    q = { operator: "or",  properties: attrs }
    url = lyr_config_characters.api_url
    key = lyr_config_characters.acl.get

    if query.id?
      url += "/#{attrs.id}?" + qs.stringify({ key })
    else if query.within?
      url += "/functions/within?" + qs.stringify({ key, input : query.within })
    else
      url += qs.stringify { key, input: q }

    req =
        method: "GET"
        uri: url
        headers: { "Content-Type": "application/json" }

    request req, (error, response, body) ->
        console.log error if error
        console.log "<< find #{body}"
        callback JSON.parse body ? '{}'

ありがとうございました!

4

1 に答える 1

0

あなたが使用している例は、非常に不完全なドキュメントがあるように見えるspatialdbに基づいています。

見た目から、ジオメトリ オブジェクトを使用してユーザーにクエリを実行する必要があります。これは、以下に含まれるポイント (ユーザー) を返します。

socket.on 'broadcast', (message) ->
    # find the sender and extract it's position
    Character.find { clientId: socket.id }, (user) ->
        chat_data =
            user: user
            conversation: message
        [lat, lng] = user.geometry.coordinates
        # find everyone within a 1km square
        km = 1/111
        area = 
            type: 'Polygon'
            coordinates: [
               [lat - km, lng - km]
               [lat + km, lng - km]
               [lat + km, lng + km]
               [lat - km, lng + km]
            ]
        Character.find { within: area }, (users) ->
            // send message to each user

また、クエリfindを使用するようにメソッドを変更する必要があります。within

find: (attrs, callback) ->
    console.log "=> find #{JSON.stringify(attrs)}"
    q = { operator: "or",  properties: attrs }
    if _.contains(_.keys(attrs), "id")
      url = "#{lyr_config_characters.api_url}/#{attrs.id}?key=#{lyr_config_characters.acl.get}"
    else if _.contains(_.keys(attrs), "within")
      url = "#{lyr_config_characters.api_url}/functions/within?key=#{lyr_config_characters.acl.get}&input=#{encodeURIComponent(JSON.stringify(attrs.within))}"
    else
      url = "#{lyr_config_characters.api_url}?key=#{lyr_config_characters.acl.get}&input=#{encodeURIComponent(JSON.stringify(q))}"
    req = { method: "GET", uri: url, headers: {"Content-Type": "application/json"} }

(正気を保つために、書き直します)

qs = require 'querystring'

find: (query, callback) ->
    console.log ">> find #{JSON.stringify(attrs)}"

    q = { operator: "or",  properties: attrs }
    url = lyr_config_characters.api_url
    key = lyr_config_characters.acl.get

    if query.id?
      url += "/#{attrs.id}?" + qs.stringify({ key })
    else if query.within?
      url += "/functions/within?" + qs.stringify({ key, input : query.within })
    else
      url += qs.stringify { key, input: q }

    req =
        method: "GET"
        uri: url
        headers: { "Content-Type": "application/json" }

    request req, (error, response, body) ->
        console.log error if error
        console.log "<< find #{body}"
        callback JSON.parse body ? '{}'
于 2012-04-12T22:38:29.423 に答える