1. 程式人生 > >Java呼叫R ,從資料庫讀取資料,用R根據讀取的資料生成圖片儲存

Java呼叫R ,從資料庫讀取資料,用R根據讀取的資料生成圖片儲存

Java呼叫R 以及用R生成的圖片儲存 使用 png()可以保證圖片質量

有人說繪製的圖片上有中文會出現亂碼,其實設定下字型就好了

family=‘STXihei’

Java呼叫R 以及用R生成的圖片儲存

Rserve的配置和啟動:

①安裝Rserve包。通過R命令列:install.packages(“Rserve”);

②在R命令列輸入:library(Rserve),載入Rserve;

然後輸入Rserve(),啟動服務。

Java呼叫R:

maven專案,座標為:

<dependency>
    <groupId>org.rosuda.REngine</groupId>
    <artifactId>REngine</artifactId>
</dependency>
<dependency>
    <groupId>org.rosuda.REngine</groupId>
    <artifactId>Rserve</artifactId>
</dependency>

Java程式碼

/**
 * 從資料庫中查詢25組打擊-警情的資料,繪製線性關係圖
 * @param args
 */
public static void main(String[] args) {
        String host = "127.0.0.1";
        int port = 6311;
        String db_name = "mytest";
        String db_user = "sa";
        String db_pwd = "1234qwer!";
        try {
            //連線 R
            RConnection connection = new RConnection(host, port);
            connection.setStringEncoding("utf8");
            //載入包,建立連線
            connection.eval("library(RODBC)");
            connection.eval("conn <- odbcConnect(\"" + db_name + "\",uid=\"" + db_user + "\",pwd=\"" + db_pwd + "\")");
            //從資料庫查詢資料
            connection.eval("base <- sqlQuery(conn,\"SELECT u.*, cc.field11 as djzs, " +
                    "pc.field11 as 'jqzs' " +
                    "FROM unit u LEFT JOIN population_v2 p ON p.field2 = u.code LEFT JOIN police_forces_v2 pf ON pf.field2 = u.code " +
                    "LEFT JOIN police_case_v2 pc ON pc.field2 = u.code " +
                    "LEFT JOIN combat_crime_v2 cc ON cc.field2 = u.code where p.year = '2017' and pf.year = '2017' and pc.year = '2017' and cc.year = '2017' ORDER BY u.code\")");
            //生成線性圖片的儲存路徑
            connection.eval("png('/Users/ianly/Desktop/test.png',width=600*3,height=3*600,res=72*3))");
            // 繪圖,雜湊點
            connection.eval("plot(base$jqzs,base$djzs,xlab='警情',ylab='打擊',main='打擊-警情關係圖',family='STXihei')");
            // 繪圖 ,線性直線
            connection.eval("abline(lm(base$djzs~base$jqzs),col='red')");
            //本單位散點特殊標色
            connection.eval("index <- which(base$name == '虹橋所')");
            connection.eval("current_dj_point_x <- base$jqzs[index]");
            connection.eval("current_dj_point_y <- base$djzs[index]");
            connection.eval("points(current_dj_point_x, current_dj_point_y, pch=19, col='red', cex=2)");
            //關閉裝置 生成圖片
            connection.eval("dev.off()");
            //記得關閉連線,否則記憶體的資源不被釋放,會引起程序衝突
            connection.close();
        } catch (RserveException e) {
            e.printStackTrace();
        }
    }

family=‘STXihei’ 這個是設定中文亂碼的

最後在桌面生成test.jpg的圖片 在這裡插入圖片描述