Spatialite에서 공간 데이터를 가지는 Table 생성하기

Spatialite에서는 테이블 생성시 바로 공간 데이터 필드를 추가할 수 없다. 먼저 공간 데이터 필드를 제외하고 테이블을 생성한다.

CREATE TABLE  main_item (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    layer TEXT,
    title TEXT,
    feature_id INTEGER
);

이제 공간 데이터 필드를 추가한다.

SELECT AddGeometryColumn('main_item', 'geometry', -1, 'GEOMETRY', 'XY');

AddGeometryColumn 함수의 3번째는 EPSG 코드값이며, 4번째는 POINT, LINESTRING, POLYGON, MULTIPOINT 등이 올 수 있다. GEOMETRY는 모든 타입의 공간 데이터를 받을 수 있다.

공간 데이터 필드에 공간 인덱스를 건다.

SELECT CreateSpatialIndex('main_item', 'geometry');

끝으로 Row를 추가하는 SQL문은 다음과 같다.

INSERT INTO main_item (layer, title, feature_id, geometry) 
VALUES ('layer1', 'title1', 100, ST_GEOMFROMTEXT('POINT(128.32132 37.34322)', -1));

[Android] 화면 터치 중 Swiping을 이용한 View 전환

화면 터치가 가능한 모바일 단말기에서 터치를 통한 UI의 조작은 매우 효과적입니다. 이러한 터치 기반의 UI의 활용에 대해 자연스러운 사용은 사용자에게 프로그램의 친밀도를 높여줍니다. 화면 터치에 대한 조작 중 Swiping은 사용자가 화면을 스치듯이 상하좌우로 쓸어넘기는 행위입니다. 이러한 Swiping 중 좌우에 대한 이벤트를 처리하기 위한 클래스는 다음과 같습니다.

package geoservice.nexgen

import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View

abstract class OnSwipeTouchListener(context: Context?) : View.OnTouchListener {
    companion object {
        private const val SWIPE_DISTANCE_THRESHOLD = 100
        private const val SWIPE_VELOCITY_THRESHOLD = 100
    }

    private val gestureDetector: GestureDetector

    abstract fun onSwipeLeft()
    abstract fun onSwipeRight()

    override fun onTouch(v: View?, event: MotionEvent?): Boolean {
        return gestureDetector.onTouchEvent(event)
    }

    private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {
        override fun onDown(e: MotionEvent): Boolean {
            return true
        }

        override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
            val distanceX = e2.x - e1.x
            val distanceY = e2.y - e1.y
            if (Math.abs(distanceX) > Math.abs(distanceY) 
                    && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD 
                    && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0) onSwipeRight() else onSwipeLeft()
                return true
            }
            return false
        }
    }

    init {
        gestureDetector = GestureDetector(context, GestureListener())
    }
}

위 클래스를 실제 View에 적용하는 코드의 예는 다음과 같습니다.

llListScroll.setOnTouchListener(object: OnSwipeTouchListener(context) {
    override fun onSwipeLeft() { btnNext.performClick() }
    override fun onSwipeRight() { btnPrevious.performClick() }
})

실제 위의 코드는 모바일 기반의 GIS 솔루션인 Mobile NexGen에 반영된 코드인데요. 위의 코드와 연관된 기능에 대한 시연 영상은 아래와 같습니다.