[GIS] FingerEyes-Xr for HTML5 ㅡ Code로 GraphicLayer에 마커 추가하기

FingerEyes-Xr은 그래픽 레이어를 통해 지도 상의 원하는 위치에 다양한 그래픽 요소를 추가해 표현할 수 있는데요. 이와 관련된 API를 정리해 봅니다. 그래픽 요소를 추가하기 위해서 그래픽 레이어가 하나 필요합니다. 아래의 코드를 통해 그래픽 레이어를 추가합니다.

var gfxLyr = new Xr.layers.GraphicLayer("g");
map.layers().add(gfxLyr);

그래픽 레이어의 이름을 ‘g’로 하여 이 이름을 통해 그래픽 레이어 객체를 얻을 수 있습니다. 이 그래픽 레이어에 마커를 3개 추가할 것인데요. 아래의 코드처럼 마커를 추가하는 함수를 만들어 사용하겠습니다.

function addPoint(gl, id, x, y, imgUrl) {
    var rs = gl.rowSet();
    var p = new Xr.PointD(x, y);
    var psd = new Xr.data.PointShapeData(p);
    var pgr = new Xr.data.PointGraphicRow(id, psd);
    var ims = new Xr.symbol.ImageMarkerSymbol({
        width: 48, height: 48,
        url: imgUrl
    });

    pgr.markerSymbol(ims);

    rs.add(pgr);
}

위의 addPoint 함수는 총 5개의 인자를 받습니다. 첫번째 gl은 그래픽 레이어 객체이고, id는 추가할 마커 그래픽 요소의 id값이며, x와 y는 마커가 위치할 좌표.. 끝으로 imgUrl은 마커를 지도 상에 표시할때 어떤 이미지로 표시할지에 대한 이미지 URL에 대한 문자열입니다. 이제 다음 코드처럼 3개의 마커 그래픽 요소를 추가할 수 있습니다. 아래의 코드는 버튼의 이벤트 함수 안이나.. DB 서버로부터 어떤 조회가 완료되었을 때 호출되는 함수에 위치하면 될 것입니다.

var gl = map.layers("g");

addPoint(gl, 0, 938085, 1671020, "http://www.gisdeveloper.co.kr/images/pikachu.png");
addPoint(gl, 1, 938185, 1671020, "http://www.gisdeveloper.co.kr/images/pokeball.png");
addPoint(gl, 2, 938285, 1671020, "http://www.gisdeveloper.co.kr/images/weedle.png");

map.coordMapper().moveTo(938185, 1671020).zoomByMapScale(4000);

map.update();

이제 실행하면 다음 화면처럼 이미지 마커가 3개 표시된 것을 볼 수 있습니다.

여기서 좀더 진행해.. 이제 위의 3개의 마커를 클릭했을 때 정보창을 표시하도록 하겠습니다. 지도의 클릭 이벤트를 아래처럼 등록하는데요. 지도에 대한 map 객체를 얻어 온 코드 다음에 아래의 코드가 있으면 됩니다.

map.addEventListener(Xr.Events.MapClick, onMapClick);

이제 지도를 클릭할 때 onMapClick 함수가 호출되는데요. onMapClick 함수는 아래와 같습니다.

function onMapClick(e) {
    var gl = map.layers("g");
    var ids = gl.IdByMousePoint(e.viewX, e.viewY, true); // bOnlyOne
    var cntIds = ids.length;

    if(cntIds == 1) {
        var id = ids[0];
        var row = gl.rowSet().row(id);
        var ims = row.markerSymbol();
        var url = ims.url();

        gl.hilighting(id);

        var content = "";

        var infoWin = new Xr.ui.InfoWindowControl("iwc", map,
            new Xr.PointD(e.mapX, e.mapY), content, {  });

        map.userControls().remove("iwc");
        map.userControls().add(infoWin);
    }
}

3번 코드에서 IdByMousePoint 함수의 3번째 인자는 클릭 지점에 여러개의 그래픽 요소를 발견했다고 해도, 단 하나만을 얻겠다는 의미입니다. 이제 실행하고 지도 상에 표시된 마커 그래픽을 클릭하면 다음과 같은 결과를 볼 수 있습니다.

사용자 삽입 이미지

[Golang] PostgreSQL 다루기

Golang은 다양한 데이터베이스를 다룰 수 있는데요. Oracle, MySQL, MSSQL Server, DB2 그리고 PostgreSQL 등에 대한 DB 드라이버 라이브러리를 제공합니다. 각 드라이버는 github를 통해 소스코드와 함께 제공되며 드라이버에 대한 라이브러리 소스코드는 go get {URL}처럼 Command Line을 통해 설치하여 사용할 수 있습니다.

이 글은 Local PC에 설치된 PostgreSQL에 연결하여, 이미 존재하는 postgres 데이터베이스의 test 테이블에 데이터를 추가(INSERT)하고 쿼리(SELECT)하는 코드를 설명합니다.

먼저 postgreSQL에 연결하는 코드는 아래와 같습니다.

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/lib/pq"
)

const (
    DB_USER     = "postgres"
    DB_PASSWORD = "ILOVEU"
    DB_NAME     = "postgres"
)

func main() {
    dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable",
        DB_USER, DB_PASSWORD, DB_NAME)

    db, err := sql.Open("postgres", dbinfo)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // ... 계속

다음 코드는 연결된 DB에 데이터를 추가(INSERT)하는 코드입니다.

    result, err := db.Exec("INSERT INTO test (name, age) VALUES('Jackass', 19)")
    if err != nil {
        panic(err)
    }

    cntAffected, err := result.RowsAffected()
    if err != nil {
        panic(err)
    }

    fmt.Println("Affected Rows:", cntAffected)

    // ... 계속

위의 코드 중 11번은 INSERT 된 데이터의 개수를 나타내며, 여기서는 1개를 추가했으므로 1이 됩니다. 다음 코드는 저장된 데이터를 조회(SELECT)하는 코드입니다.

    rows, err := db.Query("SELECT name, age FROM test")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    var name string
    var age int
    for rows.Next() {
        err := rows.Scan(&name, &age)
        if err != nil {
            panic(err)
        }

        fmt.Println(name, age)
    }
}	

실행 결과는 다음과 같습니다.

Affected Rows: 1
Dip2K                            40
Dip2K                            40
Jackass                          19
Jackass                          19
Jackass                          19
Jackass                          19
Jackass                          19
Jackass                          19
Jackass                          19

CentOS 7에서, 인터넷이 되지 않는 환경에서 PostgreSQL, PostGIS 설치 절차

인터넷이 되지 않은 환경에서 PostgreSQL과 PostGIS를 설치하는 절차에 대해 정리한 글을 Keep해 둡니다. Windows에서 pgAdmin으로 접속하여 ‘CREATE EXTENSION postgis’ 명령 처리에 대한 내용까지 확인하였습니다.

먼저 PostgreSQL 설치 절차입니다.

# postgresq RPM Install
rpm -Uvh pgdg-centos94-9.4-2.noarch.rpm
rpm -ivh postgresql94-libs-9.4.9-1PGDG.rhel7.x86_64
rpm -ivh postgresql94-9.4.9-1PGDG.rhel7.x86_64.rpm
rpm -ivh postgresql94-server-9.4.9-1PGDG.rhel7.x86_64.rpm
rpm -ivh postgresql94-devel-9.4.9-1PGDG.rhel7.x86_64.rpm
rpm -ivh libxslt-1.1.28-5.el7.x86_64.rpm
rpm -ivh postgresql94-contrib-9.4.9-1PGDG.rhel7.x86_64.rpm

# init DB
./postgresql194-setup initdb

# OS start, start PostgreSQL Server
systemctl enable postgresql-9.4

# Start Postgresql service
systemctl enable postgresql-9.4.service
systemctl start postgresql-9.4.service

# Firewall allow port 5432
firewall-cmd --zone=public --add-port=5432/tcp

# allow connection for all client IP
vi postgresql.conf
listen_addresses = "*"

# Configuring PostgreSQL Authentication
su - postgres
psql
\password postgres
\q

# edit pg_hba.conf
local all all peer
-> Do change
local all all md5

host all all 127.0.0.1/32 ident
-> Do change
host all all 0.0.0.0/0 md5

host all all ::1/128 ident
-> Do change
host all all ::1/128 md5

# restart Postgresql service
systemctl stop postgresql-9.4.service
systemctl start postgresql-9.4.service

다음은 PostGIS 설치 절차입니다.

# proj 설치
tar zxf proj-4.8.0.tar.gz
cd proj-4.8.0
./configure
make && make install

# geos 컴파일
tar xvf geos-3.4.2.tar.bz2
cd geos-3.4.2
./configure
make && make install

# libxml 설치 (rpm에서 package 총돌시 --replacefiles 옵션을 사용)
rpm -ivh ./libxml2-2.9.1-5.el7_1.2.x86_64.rpm
rpm -ivh ./xz-libs-5.1.2-12alpha.el7.x86_64.rpm
rpm -ivh ./xz-devel-5.1.2-12alpha.el7.x86_64.rpm
rpm -ivh ./zlib-libs-1.2.7-15.el7.x86_64.rpm
rpm -ivh ./zlib-devel-1.2.7-15.el7.x86_64.rpm
rpm -ivh ./libxml2-devel-2.9.1-5.el7_1.2.x86_64.rpm

# json 설치
rpm -ivh ./json-c-0.11-4.el7_0.x86_64.rpm

# gdal 컴파일
tar zxf gdal-1.9.2.tar.gz
cd gdal-1.9.2.tar.gz
./configure
make && make install

# postgis 컴파일
tar zxf postgis-2.0.3SVN.tar.gz
cd postgis-2.1.8
./configure --with-pgconfig=/usr/pgsql-9.4/bin/pg_config --with-raster
make && make install

# 모듈 파일(.so) 업데이트
echo /usr/local/lib >> /etc/ld.so.conf
ldconfig

# postgis 배포
cd extensions/postgis
make clean
make && make install
cd ..
cd postgis_topology
make clean
make && make install

# restart Postgresql service
systemctl restart postgresql-9.4.service

인터넷이 되지 않는 환경에서 PostgreSQL과 PostGIS 설치를 하는 분들에게 도움이 되시기 바랍니다.