NodejsとGooglemapsを利用したWEBアプリについて
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,906
概要
node.jsのWebSocketとgoogleapiのmapを利用して
待ち合わせWEBアプリを作成しています
位置情報取得->マップ表示->自分のMarker表示->infoWindow表示まではできたのですが。
接続されているユーザをMarker表示したいのですが
二回目以降に接続されたユーザがそれ以前に接続されたユーザの
Marker情報を取得するアルゴリズムが思いつきません
またhtml側でインターバルを取りsocketを送って位置更新しているのですが
過去の自分のMarkerを消すことは可能なのですが
他人の過去のMarkerを消すことができません
消すよりも移動の方がいいと思ったのですが移動するにもMarker情報を
サーバ側で持つこともhtml側で判断するのも試したのですが、わかりませんでした。
該当のソースコード
index.html側の関係するScript(諸々省略します)
// script開始
var socket = io.connect('http://localhost:8000');
navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
function successCallback(position)
{
latitude = position.coords.latitude;
longitude = position.coords.longitude;
map.panTo(new google.maps.LatLng(latitude,longitude));
var mark = [latitude,longitude];
socket.emit("moveMarker",mark);
}
function start()
{
var latlng = new google.maps.LatLng(35,140);
var opts =
{
zoom: 19,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"), opts);
}
socket.on("markMove",function(markMove)
{
var LatLng = new google.maps.LatLng(markMove[0],markMove[1]);
var marker = new google.maps.Marker({
position : LatLng,
map : map,
});
marker.metadata
var infoWindow = new google.maps.infoWindow({
content : "namae"
});
marker.addListener("click",function(){
infoWindow.open(map,marker);
});
});
socket.on("moveMarker",function(mark){
var latLng = new google.maps.LatLng(mark[0],mark[1]);
var marker = new google.maps.Marker({
title : "タイトル用",
position : latLng,
map : map
});
var infoWindow = new google.maps.InfoWindow({
content : "namae"
});
marker.addListener("click",function(){
infoWindow.open(map,marker);
});
var ul = document.getElementById("marker_List");
var li = document.createElement("li");
var title = marker.getTitle();
li.innerHTML = title;
ul.appendChild(li);
google.maps.event.addEventListener(li,"click",function(){
google.maps.event.trigger(marker,"click");
});
});
setInterval("move();",3000);
function move()
{
navigator.geolocation.getCurrentPosition(successMove, errorCallback);
}
function successMove(position)
{
latitude = position.coords.latitude;
longitude = position.coords.longitude;
var markMove = [latitude,longitude];
socket.emit("markMove",markMove);
}
// script終了
<body onload="start();">
<div id="map_canvas" style="width:500px; height:300px"></div>
</body>
app.js側
var mysql = require("mysql");
var fs = require("fs");
var server = require("http").createServer(function(req, res) {
res.writeHead(200, {"Content-Type":"text/html"});
var output = fs.readFileSync("./index.html", "utf-8");
res.end(output);
}).listen(8000);
var io = require("socket.io").listen(server);
var marker = [];
var i = 0;
io.sockets.on("connection", function (socket) {
socket.on("moveMarker",function(mark)
{
io.sockets.emit("moveMarker",mark);
});
socket.on("markMove",function(markMove){
io.sockets.emit("markMove",markMove);
});
});
試したこと
app.js側でmapを定義してそれを接続時に送信して描画
配列でgoogle.maps.markerをapp.js側で持っておき接続時に送信
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
サーバ側のon("connection")で受け取ったsocketにはidという接続を固有に識別できる文字列があります。
それを使ってサーバ上に各接続ユーザの情報を保持しておくことが第一の段階だと思います。
以下のコードを参考に、ソケットとマーカーを管理します。
var sockets = {}; // ソケットを管理
var markers = {}; // 各接続者のマーカーを管理
io.sockets.on("connection", function (socket) {
// 接続されたらまずはリストに入れる
sockets[socket.id] = socket;
markers[socket.id] = {
id:socket.id,
latlng:null
};
socket.on("disconnect", function(e) {
io.socket.emit("disconnected", {id:socket.id});// 全員に誰かが接続切断されたことを通知
delete sockets[socket.id];
delete markers[socket.id];
});
}
あとは今サーバ側が送信している位置情報に、socket.idを付与して渡してやり、クライアント側でidの一致するマーカーを移動、削除してやればよいと思います。
また、過去に接続しているユーザの位置情報はサーバ側のmarkersに記録されているので、全ユーザの位置情報を取るイベントを新しく作成して、サーバ側でそれを受け取った時に全ユーザの座標を返す通知をしてやればよいと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/06/08 17:31
markerにidを付けて管理したいと思います
コメント省いたため見づらくてすみません以後気をつけます