Tweetをgoogle map上に表示したいです。
受付中
回答 0
投稿
- 評価
- クリップ 0
- VIEW 522

退会済みユーザー
行いたいこと
現在地情報がついているツイートをgoogle map上に表示するものを作りたいです。
javascriptを使用しています。
コード内に不必要な文や、おかしい箇所など多々あると思うので修正していただけたら幸いです。
発生している問題・エラーメッセージ
/**/({"errors":[{"message":"The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.","code":64}]});と、google chromeのコンソール上にエラーが出てしまいます。
該当のソースコード
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script>
<!--
<script type="text/javascript" src="./twitter/js/do.js"></script>
<script type="text/javascript" src="./twitter/js/notification.js"></script>
-->
<script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
<style type="text/css" src="./twitter/css/common.css"></style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<!-- googlemap api 認証 -->
<script type="text/javascript"
src="http://maps.googleapis.com/maps/api/js?key=AIzaSyAfGJ6jgHJCiPyRc6YhwaL0Y1rIP3t-aSA&libraries=geometry">
</script>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0; padding: 0; background-color: #DDDDDD;font: 20px sans-serif;}
#map_canvas { height: 90%; width: 100% }
</style>
<script type="text/javascript">
var map, infoWindow, markersHash = {}, markersArray = [], geocoder;
//緯度経度、半径(km)、ツイートに含めたい文字を指定して、ツイートを取得する。
function fetchTweets(latLng, query, radiusKM) {
var url = 'http://twitter.com/search?q=place%3A07d9cd6afd884001=?';
var data = {
q: query,
rpp: 100,
geocode: latLng.lat() + ',' + latLng.lng() + ',' + radiusKM
};
$.getJSON(url, data, function (data, status) {
if (status === 'success') {
addTweetsAsMarkers(data);
} else {
alert('twiter error');
}
});
}
//マーカーとして未追加で、緯度経度を含むツイートのみ追加する。
function addTweetsAsMarkers(data) {
var i;
for (i = 0; i < data.results.length; i++) {
var id = data.results[i].id_str;
var geo = data.results[i].geo;
if (!markersHash[id] && geo && geo.type === 'Point') {
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(parseFloat(geo.coordinates[0]), parseFloat(geo.coordinates[1])),
title: '@' + data.results[i].from_user,
icon: data.results[i].profile_image_url,
result: data.results[i] //情報ウィンドウにツイートを表示するために使う
});
google.maps.event.addListener(marker, 'click', function() {
//クリックされたmarkerはthisで参照できる。
showInfoWindow(this);
});
markersHash[id] = marker;
markersArray.push(marker);
}
}
}
//情報ウィンドウを表示する
function showInfoWindow(marker) {
marker.setZIndex(9999); //表示位置を一番上にする
var linkToTheTweet = '<a target="_blank" href="http://twitter.com/' + marker.result.from_user
+ '/status/' + marker.result.id_str + '"> 開く </a></p>';
//ツイート内のリンクをクリック可能にする。
var text = marker.result.text.replace(/(https?:\/\/[\x21-\x7e]+)/gi, function () {
var uri = arguments[1];
return '<a target="_blank" href="' + uri + '">' + decodeURI(uri) + '</a>';
});
infoWindow.content = '<p style="font-size:0.9em;">' + text + '<div style="font-size:0.7em;">'
+ linkToTheTweet + '</div></p>';
infoWindow.open(map, marker);
}
//検索する範囲を表示画面の大きさから計算して、ツイートを取得する。
function fetchTweetsWithRadius() {
var distanceKM = 3.0;
var bounds = map.getBounds();
if(bounds) {
var latlng = new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getNorthEast().lng());
var distanceM = google.maps.geometry.spherical.computeDistanceBetween(bounds.getNorthEast(), latlng);
distanceKM = Math.floor(distanceM / 2 / 100) / 10;
}
fetchTweets(map.getCenter(), $('#filter').val(), distanceKM + 'km');
}
//ページが読み込み終わったら実行する。
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(35.698619, 139.773288),
zoom: 11,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
infoWindow = new google.maps.InfoWindow();
//地図内をクリックしたら情報ウィンドウを閉じる
google.maps.event.addListener(map, 'click', function () {
infoWindow.close();
});
//ドラッグが終わった位置で、ツイートを検索する。
google.maps.event.addListener(map, 'dragend', function () {
fetchTweetsWithRadius();
});
//ダブルクリックしズームした位置で、ツイートを検索する。
google.maps.event.addListener(map, 'dblclick', function () {
fetchTweetsWithRadius();
});
fetchTweetsWithRadius();
setInterval(fetchTweetsWithRadius, 30000); //30秒ごとにツイートを検索する。
setInterval(showNextTweet, 4000); //4秒ごとに情報ウィンドウを表示する。
geocoder = new google.maps.Geocoder();
}
//追加したマーカーが画面上にあれば情報ウィンドウを表示する。
var currentMarker = null;
function showNextTweet() {
if (currentMarker) {
currentMarker.setMap(null);
infoWindow.close();
currentMarker = null;
}
var marker = markersArray.shift();
while (marker) {
var bounds = map.getBounds();
//はじめに表示したときには、boundsがundefinedになってしまう。
if (!bounds || bounds.contains(marker.getPosition())) {
map.panTo(marker.getPosition());
showInfoWindow(marker);
currentMarker = marker;
return;
} else {
marker.setMap(null);
marker = markersArray.shift();
}
}
}
//地名から緯度経度を取得して、地図を移動させ、ツイートを検索する。
function codeAddress() {
geocoder.geocode({
'address': $('#address').val()
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
fetchTweetsWithRadius();
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});
}
//すべてのマーカーを削除してツイートを検索する。
function reload() {
var i;
for (i = 0; i < markersArray.length; i++) {
markersArray[i].setMap(null);
}
markersArray.length = 0;
markersHash = {};
fetchTweetsWithRadius();
}
//ツイートをフィルターする文字列をクリアし、ツイートを検索する。
function clearFilter() {
$('#filter').val('');
reload();
}
</script>
</head>
<body onload="initialize()">
<div style="font-size: 0.5em;">
<fieldset style="float:right;">
<legend>この文字を含むツイートだけ表示</legend>
<input type="text" id="filter" value="http://" size="40">
<input type="button" id="reload" value="再表示" onclick="reload();">
<input type="button" id="clear" value="クリア" onclick="clearFilter();">
</fieldset>
<fieldset>
<legend>地名を指定して移動</legend>
<input type="text" id="address" value="新大阪駅" size="60">
<input type="button" value="移動" onclick="codeAddress();">
</fieldset></div>
<div id="map_canvas" style="width:100%; height:90%"></div>
</body>
</html>
試したこと
TwitterAPI1.1でしか動かないのに、それ以前のバージョンを使用しているためにエラーが出ていると思われます。
補足情報(言語/FW/ツール等のバージョンなど)
https://takatamajp.wordpress.com/2012/08/28/mapping-tweets-using-jsdo-it-and-google-maps-api/のtakatamaさんのページを参考にさせてもらっています。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.97%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
Lhankor_Mhy
2017/03/04 12:33
https://teratail.com/help/avoid-asking