- Node.js - 크롬의 자바스크립트 런타임이 내장된 Node.js 플랫폼이다. 이는 이벤트 기반과 넌블럭 아키텍처 기반이다.
- Express.js - node.js 기반의 웹 프레임워크이다.(루비의 Sinatra 와 유사하다) 응용 프로그램에 대하여 쉽게 Configuration을 할 수 있고, 괜찮은 구조를 만들어 준다.
- Jade - node.js 의 뷰 템플릿 엔진으로 HTML 태그 보다 심플한 형태의 마크업을 작성하면, 자동으로 HTML을 생성해 주는 역할을 한다.
- node-mariasql - MariaDB를 node.js에 바인딩할 수 있는 클라이언트 라이브러이다.
- xml2js - XML 파싱을 위한 node 모듈이다.
- Google Maps - 최종결과를 맵에 표시하기 위해 필요하다.
그리고 이 소스의 라이선스는 MIT Lecense 를 따르고 있음으로 저작권 고지 및 라이선스 사본 포함 정도의 규정만 지키면 된다.
2. 설치 하기
설치를 할 환경은 CentOS7 64비트를 기준으로 하겠다.
기본적으로 root 계정을 사용하지 말고 다른 사용자 계정을 만들어 사용하자. 여기서 사용할 계정은 binrang 이라는 계정에 sudo 권한을 부여하여 사용할 것이다.
[binrang@binrang routes]$ sudo adduser binrang
[binrang@binrang routes]$ sudo usermod -G wheel binrang
|
MariaDB 에서 10.0 을 다운로드를 받아 설치를 하자. (참고 : CentOS7에서 MariaDB 10.0 설치하기)
MariaDB에 running 이라는 데이터베이스를 생성하자.
mysql -u root -p
MariaDB [(none)]> create database running;
|
이 프로그램의 Github 저장소 에서 running.sql 을 다운 받아 생성한 데이터베이스에 import 를 하자.
[root@binrang-db ~]# wget https://raw.githubusercontent.com/rasmushoj/nodejs-gpx-mariadb/master/running.sql
--2016-11-04 17:42:42-- https://raw.githubusercontent.com/rasmushoj/nodejs-gpx-mariadb/master/running.sql
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.100.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.100.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1770 (1.7K) [text/plain]
Saving to: ‘running.sql’
100%[==================================================================================>] 1,770 --.-K/s in 0s
2016-11-04 17:42:42 (501 MB/s) - ‘running.sql’ saved [1770/1770]
[root@binrang-db ~]# mysql -u root -p running < running.sql
|
환경준비 :
- nodejs 설치 (참고 : CentOS7에 nodejs 설치하기)
- Express.js 설치
[binrang@binrang mariajs]$ npm install express
/home/binrang/mariajs
└─┬ express@4.14.0
├─┬ accepts@1.3.3
│ ├─┬ mime-types@2.1.12
│ │ └── mime-db@1.24.0
│ └── negotiator@0.6.1
......
├── utils-merge@1.0.0
└── vary@1.1.0
npm WARN enoent ENOENT: no such file or directory, open '/home/binrang/mariajs/package.json'
npm WARN mariajs No description
npm WARN mariajs No repository field.
npm WARN mariajs No README data
npm WARN mariajs No license field.
[binrang@binrang mariajs]$
|
- Jade 설치
[binrang@binrang mariajs]$ npm install jade
npm WARN deprecated jade@1.11.0: Jade has been renamed to pug, please install the latest version of pug instead of jade
npm WARN deprecated transformers@2.1.0: Deprecated, use jstransformer
/home/binrang/mariajs
└─┬ jade@1.11.0
├── character-parser@1.2.1
├─┬ clean-css@3.4.20
│ ├─┬ commander@2.8.1
│ │ └── graceful-readlink@1.0.1
......
├── void-elements@2.0.1
└─┬ with@4.0.3
├── acorn@1.2.2
└── acorn-globals@1.0.9
npm WARN enoent ENOENT: no such file or directory, open '/home/binrang/mariajs/package.json'
npm WARN mariajs No description
npm WARN mariajs No repository field.
npm WARN mariajs No README data
npm WARN mariajs No license field.
[binrang@binrang mariajs]$
|
- MariaDB non-blocking client 설치
[binrang@binrang mariajs]$ npm install mariasql
> mariasql@0.2.6 install /home/binrang/mariajs/node_modules/mariasql
> node-gyp rebuild
make: Entering directory `/home/binrang/mariajs/node_modules/mariasql/build'
CXX(target) Release/obj.target/taocrypt/deps/libmariadbclient/extra/yassl/taocrypt/src/aes.o
CXX(target) Release/obj.target/taocrypt/deps/libmariadbclient/extra/yassl/taocrypt/src/aestables.o
CXX(target) Release/obj.target/taocrypt/deps/libmariadbclient/extra/yassl/taocrypt/src/algebra.o
......
make: Leaving directory `/home/binrang/mariajs/node_modules/mariasql/build'
/home/binrang/mariajs
└─┬ mariasql@0.2.6
├── lru-cache@2.7.3
└── nan@2.4.0
npm WARN enoent ENOENT: no such file or directory, open '/home/binrang/mariajs/package.json'
npm WARN mariajs No description
npm WARN mariajs No repository field.
npm WARN mariajs No README data
npm WARN mariajs No license field.
[binrang@binrang mariajs]$
|
- 이제 마지막으로 xml2js 모듈을 설치한다.
[binrang@binrang mariajs]$ npm install xml2js
/home/binrang/mariajs
└─┬ xml2js@0.4.17
├── sax@1.2.1
└─┬ xmlbuilder@4.2.1
└── lodash@4.16.6
npm WARN enoent ENOENT: no such file or directory, open '/home/binrang/mariajs/package.json'
npm WARN mariajs No description
npm WARN mariajs No repository field.
npm WARN mariajs No README data
npm WARN mariajs No license field.
[binrang@binrang mariajs]$
|
3. git 을 이용하여 소스를 받아오자.
[binrang@binrang mariajs]$ git clone https://github.com/rasmushoj/nodejs-gpx-mariadb.git
Cloning into 'nodejs-gpx-mariadb'...
remote: Counting objects: 226, done.
remote: Total 226 (delta 0), reused 0 (delta 0), pack-reused 226
Receiving objects: 100% (226/226), 156.56 KiB | 161.00 KiB/s, done.
Resolving deltas: 100% (75/75), done.
[binrang@binrang mariajs]$ ls -al
합계 16
drwxrwxr-x. 5 binrang binrang 71 11월 9 09:48 .
drwx------. 31 binrang binrang 4096 11월 9 09:47 ..
drwxrwxr-x. 92 binrang binrang 4096 11월 8 17:33 node_modules
drwxrwxr-x. 6 binrang binrang 4096 11월 9 09:48 nodejs-gpx-mariadb
[binrang@binrang mariajs]$
|
- nodejs-gpx-mariadb 디렉토리로 이동 후 npm install 명령을 실행한다.
[binrang@binrang mariajs]$ cd nodejs-gpx-mariadb/
[binrang@binrang nodejs-gpx-mariadb]$ npm install
npm WARN deprecated jade@1.11.0: Jade has been renamed to pug, please install the latest version of pug instead of jade
npm WARN deprecated transformers@2.1.0: Deprecated, use jstransformer
application-name@0.0.1 /home/binrang/mariajs/nodejs-gpx-mariadb
├─┬ express@3.4.5
│ ├── buffer-crc32@0.2.1
│ ├─┬ commander@1.3.2
│ │ └── keypress@0.1.0
......
├── void-elements@2.0.1
└─┬ with@4.0.3
├── acorn@1.2.2
└── acorn-globals@1.0.9
[binrang@binrang nodejs-gpx-mariadb]$
|
위 소스는 MIT 라이선스 규약을 따른다.
이 프로그램에 대한 환경 분석.
아래 common.js 와 data.js 를 통해 모듈을 데이터베이스를 핸들링하게 된다.
[binrang@binrang nodejs-gpx-mariadb]$ pwd
/home/binrang/mariajs/nodejs-gpx-mariadb
[binrang@binrang nodejs-gpx-mariadb]$ vi app.js
.......
var user = require('./routes/user');
var common = require('./routes/common');
|
업로드 되는 파일의 대한 경로는 아래 코드와 같다.
app.use(express.bodyParser({ keepExtensions: true, uploadDir: __dirname + '/public/uploads' }));
|
app.js 파일에 이 프로그램에서 필요한 URL 매핑을 정의한 부분이다.
app.get('/upload', common.fileForm);
app.post('/upload', common.fileUpload);
app.get('/readfile', common.readFile);
app.get('/parsegpx', common.parseGPX);
app.get('/track', common.listPoints);
app.get('/xmltracks', common.xmlTracks);
app.get('/xmltracksduration', common.xmlTracksDuration);
app.get('/showmap', function (req, res) {
res.sendfile(__dirname + '/views/maps.html');
});
app.get('/showxmlfiles', function (req, res) {
res.sendfile(__dirname + '/views/xmltracks.html');
});
app.get('/trackinfo', common.trackInfo);
|
maridb의 환경이 다른 서버로 되어 있다면 data.js 파일에서 환경을 설정한다.
[binrang@binrang nodejs-gpx-mariadb]$ pwd
/home/binrang/mariajs/nodejs-gpx-mariadb
[binrang@binrang nodejs-gpx-mariadb]$ vi data.js
// adapted from https://github.com/mscdex/node-mariasql
var inspect = require('util').inspect;
var Client = require('mariasql');
var client = new Client();
exports.connect = function() {
client.connect
(
{
host: '원격 mariadb IP',
user: '접근 DB 계정',
password: '접근 DB 패스워드',
db: 'running'
}
);
|
그리고 해당 DB에 테이블을 조회하여 보자.
[binrang@binrang-db ~]$ mysql -uroot -p running
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.0.28-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [running]> show tables;
+-------------------+
Tables_in_running |
+-------------------+
trackpoints |
+-------------------+
1 row in set (0.00 sec)
MariaDB [running]>
|
이제 서버를 구동 시켜 보자.
[binrang@binrang nodejs-gpx-mariadb]$ node app
connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0
Express server listening on port 3000
|
먼저 브라우저로 열기 전에 uploads 디렉토리에 파일이 있는지 체크 부터 해 보자.
[binrang@binrang uploads]$ pwd
/home/binrang/mariajs/nodejs-gpx-mariadb/public/uploads
[binrang@binrang uploads]$ ls -al
합계 4
drwxrwxr-x. 2 binrang binrang 23 11월 9 09:48 .
drwxrwxr-x. 4 binrang binrang 38 11월 9 09:48 ..
-rw-rw-r--. 1 binrang binrang 42 11월 9 09:48 .emptyfile
[binrang@binrang uploads]$
|
이제 웹 브라우저로 화면을 열어보자.
http://해당 IP:3000/ 으로 접속시 Express 화면을 만날 수 있다. |
http://해당IP:3000/upload 로 접속 시 화면 |
첨부파일 중의 gpx 파일을 선택 |
자세히 보면 파일 업로드 경로와 파일명을 확인 할 수 있다. |
서버의 해당 디렉토리를 확인해보자.
[binrang@binrang uploads]$ ls -al
합계 36
drwxrwxr-x. 2 binrang binrang 58 11월 15 11:24 .
drwxrwxr-x. 4 binrang binrang 38 11월 9 09:48 ..
-rw-rw-r--. 1 binrang binrang 42 11월 9 09:48 .emptyfile
-rw-rw-r--. 1 binrang binrang 31656 11월 15 11:24 13641-16x33l1.23139v0a4i.gpx
[binrang@binrang uploads]$
|
이번에는 GPX 파일을 파싱하는 부분이다.
GPX 파일은 아래와 같이 구성되어 있다.
<trkpt lat="37.860275" lon="128.549301"><ele>839.848389</ele><time>2016-08-20T08:22:34Z</time></trkpt>
<trkpt lat="37.860302" lon="128.550125"><ele>826.139038</ele><time>2016-08-20T08:23:06Z</time></trkpt>
<trkpt lat="37.860474" lon="128.550873"><ele>831.081543</ele><time>2016-08-20T08:24:06Z</time></trkpt>
<trkpt lat="37.860561" lon="128.551697"><ele>841.117920</ele><time>2016-08-20T08:25:07Z</time></trkpt>
<trkpt lat="37.860779" lon="128.552582"><ele>841.464233</ele><time>2016-08-20T08:26:07Z</time></trkpt>
<trkpt lat="37.860634" lon="128.552124"><ele>852.028809</ele><time>2016-08-20T08:26:37Z</time></trkpt>
<trkpt lat="37.860649" lon="128.551849"><ele>842.237671</ele><time>2016-08-20T08:27:08Z</time></trkpt>
|
현재 DB의 trackpoints 테이블에는 아무런 데이터가 없다.
MariaDB [running]> select * from trackpoints;
Empty set (0.01 sec)
MariaDB [running]>
|
파싱과 관련된 코드는 아래와 같다.
[binrang@binrang routes]$ pwd
/home/binrang/mariajs/nodejs-gpx-mariadb/routes
[binrang@binrang routes]$ vi common.js
......
exports.parseGPX = function(req, res) {
var data = require('../data.js');
var json = '';
try {
var fileData = fs.readFileSync(req.session.uploadedFilePath, 'ascii');
var parser = new xml2js.Parser();
parser.parseString(fileData.substring(0, fileData.length), function (err, result) {
json = result;
});
var debug = '';
var lon = null;
var lat = null;
data.connect();
for(var i in json.gpx.trk[0].trkseg[0].trkpt) {
lon = json.gpx.trk[0].trkseg[0].trkpt[i].$.lon;
lat = json.gpx.trk[0].trkseg[0].trkpt[i].$.lat;
data.insertPoint(lon, lat);
debug += "lon: " + lon + " - ";
debug += "lat: " + lat + "\n";
}
data.disconnect();
res.send(debug);
} catch (ex) {
res.send(ex);
};
};
|
이 부분에서 data의 insertPoint를 통해 DB에 데이터를 입력한다.
[binrang@binrang nodejs-gpx-mariadb]$ pwd
/home/binrang/mariajs/nodejs-gpx-mariadb
[binrang@binrang nodejs-gpx-mariadb]$ vi data.js
......
exports.insertPoint = function(lon, lat) {
// console.log('INSERT INTO trackpoints (gpsPoint) VALUES (PointFromText(:loc))', { loc: 'POINT(' + lon + " " + lat + ')' });
client.query('INSERT INTO trackpoints (gpsPoint) VALUES (PointFromText(:loc))', { loc: 'POINT(' + lon + " " + lat + ')' })
|
웹 브라우저에서 http://해당IP:3000/parsegpx 로 접속해 보자.
GPX 파일을 파싱하는 부분을 확인 할 수 있다. |
DB를 확인하여 보자.
MariaDB [running]> select * from trackpoints;
+---------+---------+---------------------------+
pointId | trackId | gpsPoint |
+---------+---------+---------------------------+
151 | 1 | հߓ`@H¿}큀 |
152 | 1 | ȶ¾`@yW=`큀 |
153 | 1 | `@w$큀 |
154 | 1 | ¤w§`@E䚦큀 |
155 | 1 | wKr.`@³
.큀 |
156 | 1 | Ū`@¯老)큀 |
157 | 1 | 軿¨`@㨖¿)큀 |
|
이제 웹브라우저로 다시 돌아가 showmap을 확인해 보자.
그러나 뭔가 문제가 있다.. 예시와 같이 맵에 추적이 되지 않는다.
??? 이유가 뭘까? |
참조 URL : https://mariadb.org/node-js-mariadb-and-gis/
댓글 없음:
댓글 쓰기