2017年7月11日火曜日

GoogleMap Clusterの利用

以前使っていたGoogleMapのクラスタが古くなって表示できなくなったので、新しいのに変えました。
今回は https://github.com/googlemaps/js-marker-clusterer を利用しました。

1.設置
上記リンクからファイルをダウンロードして、FTPで設置します。
Cakephpを利用しているので、下記に設置しました。
app/webroot/js/markerclusterer.js
app/webroot/img/cluster/画像ファイル.png  (clusterフォルダは自分で生成)

2.コントローラとビューの作成
コントローラは既存のを使います。件数を増やしておくといいかも。
ビューは次のように
<?php echo $this->Html->script('http://maps.google.com/maps/api/js?sensor=true', false); ?>
<div class="highschools index">
<h2><?php echo __('Highschools'); ?></h2>
<?php echo $this->Html->script('markerclusterer'); ?>
<script>
function initialize() {
var center = new google.maps.LatLng(34.738249, 137.9592173);
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 9,
center: center,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var markers = [];
<?php $i = 0; ?>
<?php foreach ($highschools as $highschool): ?>
<?php if($result[$i++][3] == 1){?>
var marker = new google.maps.Marker({
position: new google.maps.LatLng(<?php echo $highschool['Highschool']['latitude'];?>, <?php echo $highschool['Highschool']['longitude'];?>)
});
markers.push(marker);
<?php }?>
<?php endforeach; ?>
var options = {
imagePath: '/img/cluster/m'
};
var markerCluster = new MarkerClusterer(map, markers, options);
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
<div id="map" style="width: 1200px; height: 800px;"></div>
view raw gistfile1.txt hosted with ❤ by GitHub


3.確認
参考
https://github.com/googlemaps/js-marker-clusterer

2017年7月8日土曜日

RStudio : RのAPI化

Rで得られた結果をWebシステムで利用します。Rパッケージのplumberを利用します。

1.plumberのインストール
> install.packages("plumber")
> library(plumber)
2.RScriptの作成
テスト用のスクリプトを生成します。注意:最後のカッコの後に1行必要みたいです。
[ha.R]
#* @get /ha
ha <- function() {
return("Hello API!")
}
view raw gistfile1.txt hosted with ❤ by GitHub

> source('~/Test01/ha.R')
> r <- br="" ha.r="" plumb="">> r$run(port=8000)
(Test01はプロジェクト名)
ブラウザでアクセスしてみます。
http://サーバURL:8000/ha
グラフを表示してみます。
[ api_graph.R]
#* @get /graph
#* @png
graph <- function(){
plot(sin, -pi, 2*pi)
}
view raw gistfile1.txt hosted with ❤ by GitHub

> source('~/Test01/api_graph.R')
> r <- api_graph.r="" br="" plumb="">> r$run(port=8000)
ブラウザでアクセスします。
http://サーバURL:8000/graph
これでRの結果を他のシステムで表示できます。

これを例えばcakephpで表示する場合はViewに次のように書きます。
<?php echo $this->Html->image('http://サーバURL:8000/graph01',array('width'=>'900','height'=>'500')); ?>
view raw gistfile1.txt hosted with ❤ by GitHub

localhost:8000とやってもうまく表示されませんでした。

あとは起動を素早くするために、plumberを関数化しとくといいです。
例えばgraph.Rを作った時に
[exe.R]
exe <- function(){
library(plumber)
r <- plumb("graph.R")
r$run(port=8000)
}
view raw gistfile1.txt hosted with ❤ by GitHub

としておけば、exe()で実行できます。

課題
・exe()を実行してからでないとグラフが表示されない

ポート指定して実行なので、仕方ないですが、バックグラウンドで常に実行しておきたいと思って
$ Rscript --slave --vanilla exe.R
$ nohup R CMD BATCH exe.R &
など試したのですが、ループなどを設けないとすぐ終了してしまいます。
当面、グラフが必要な時は、サーバの負担も考えて、exe()を実行してからグラフを見るようにしたいと思います。解決できれば嬉しい。

参考
https://www.rplumber.io/
http://uribo.hatenablog.com/entry/2016/03/12/213000