内容が古くなっている可能性がありますのでご注意下さい。
地理空間情報を活用したモバイルWebアプリケーションのサーバー環境として、Node.jsとPostGISのインストールができましたので、今回はサーバー側のプログラムを開発します。
前回、PostGISに投入した応急給水拠点のデータをJSONで返す、簡単なNode.jsプログラムを作成します。
はじめに、Node.jsでPostGIS(PostgreSQL)にアクセスするために使用するnode-postgresをインストールします。
# yum install postgresql93-devel
でPostgreSQLのヘッダファイルやpg_configをインストールしてから、
# npm install pg
でnode-postgresをインストールします。
サーバープログラム(water.js)の完全なリストは以下の通りです。
var http = require('http'); var url = require('url'); var pg = require('pg'); var connStr = 'tcp://username:password@localhost:5432/postgis'; pg.connect(connStr, function(error, client) { if(error) { console.log('Database Connection Error'); } else { var server = http.createServer(function(req, res){ var urlParam = url.parse(req.url, true).query; var queryStr = 'SELECT name, type, longitude, latitude ' + 'FROM watersupplysites ' + 'WHERE ST_DWithin(geog, ST_Point(' + urlParam.lon + ',' + urlParam.lat + '), ' + urlParam.dist + ')'; client.query(queryStr, function(error, result) { if(error) { res.writeHead(503, {'Content-Type': 'text/plain'}); res.write('Service Temporarily Unavailable\n'); res.end(); } else { var jsonObjs = []; res.writeHead(200, {'Content-Type': 'application/json'}); for(i=0 ; i<result.rows.length ; i++) { var obj = { name : result.rows[i].name, type : result.rows[i].type, longitude : result.rows[i].longitude, latitude : result.rows[i].latitude }; jsonObjs.push(obj); } res.write(JSON.stringify(jsonObjs)); res.end(); } }); }).listen(8080); } });
まず、3つのモジュールをロードします。
var http = require('http'); var url = require('url'); var pg = require('pg');
httpモジュールはHTTPサーバの機能を実現します。urlモジュールはリクエストパラメータの取得に、pgモジュールはPostGIS(PostgreSQL)へのアクセスに使用します。
pg.connect()でPostGISサーバに接続します。接続文字列は、
tcp://ユーザ名:パスワード@サーバ名:ポート番号/データベース名
という形式です。
PostGISとの接続に失敗したらログを出力して終了します。
PostGISと接続できたら、http.createServer()でHTTPサーバを作成します。HTTPリクエストを受けると、url.parse()でHTTPリクエストパラメータを分解してurlParamに格納し、urlParam.lon、urlParam.lat、urlParam.distを用いてSQL文を組み立てます。
SQL文では、前回使用したPostGISの空間関係関数ST_DWithin()を使用しています。
query()メソッドでクエリを発行し、失敗した場合はステータスコード503を返し、成功した場合は、クエリ結果からオブジェクトの配列を作成し、JSON.stringify()でJSON形式に変換してからwrite()メソッドでレスポンスを返します。
# pm2 start water.js
でサーバープログラムを起動し、D3.jsを用いた簡単なテストプログラム
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>test client</title> <script type="text/javascript" src="d3.min.js"></script> </head> <body> <p></p> <script type="text/javascript"> var server = 'http://■■■■■.cloudapp.net/api'; var query = server + '?lon=139.5377387&lat=35.51274191&dist=1000'; d3.json(query, function (error, json) { d3.select("p") .selectAll("ul") .data(json) .enter() .append("li") .text(function(d) { return d["name"] + '(' + d["type"] + ')'; }); }); </script> </body> </html>
を使用して動作確認します。以下のように表示されればOKです。