| |
|
|
|
|
|
핑거아이즈는 공간서버인 지오서비스(GeoService-Xr)의 지오프로세싱(Geoprocessing) 서비스를 통해 지오메트리의 버퍼 연산을 수행할 수 있습니다. 아래의 코드는 레이어의 구성 항목 중 하나의 도형에 대해 버퍼 반경값 10으로 하여 버퍼 연산을 수행하는 코드입니다.1번과 2번 코드를 통해 버퍼 연산 대상이 되는 도형을 가져옵니다. 그리고 이 도형에 대한 지오메트리 정보를 WKT 형식으로 변환하는 코드가 5~6번 코드입니다. 마지막으로 7~13번 코드를 통해 공간서버로 요청을 날립니다. 아래의 이미지는 버퍼 연산의 대상이 되는 도형입니다.
버퍼 연산 서비스를 요청하고 그 결과는 onBufferRequestCompleted 함수를 통해 전달되며 다음과 같은 예로 구성될 수 있습니다. 버퍼 연산 결과에 대한 지오메트리 역시 WKT 형식입니다. 연산 결과를 다시 대상이 되는 도형에 반영하고 있습니다. 그 결과는 다음과 같습니다.
|
김형준(Dip2K)
2012/02/03 16:51
2012/02/03 16:51
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/806 |
|
|
|
|
|
|
|
Geometry로 Feature를 가져온다는 의미는 임의의 지오메트리와 공간상에서 교차하는 Feature를 가져온다는 의미입니다. 임의의 지오메트리이므로 폴리곤, 폴리라인, 포인트 등 제약이 없습니다. 기준 지오메트리는 WKT 형식으로 쉽게 지정할 수 있습니다. 다음은 지정한 폴리라인과 교차하는 Feature를 서버측으로부터 가져오라는 코드 예입니다. 대상이 되는 레이어를 1번 코드를 통해 가져옵니다. 속성과 도형에 대한 기능이므로 XrShapeMapLayer만이 가능합니다. 그리고 4번에서 queryByGeometry 매서드를 통해 쿼리 합니다. 첫번째 인자는 기준 지오메트리로써 WKT 형식으로 지정합니다. 그리고 두번째 인자는 도형 데이터 뿐만 아니라 속성 데이터까지 가져오라는 의미입니다. 그리고 세번째 인자는 공간 데이터 쿼리가 완료되었을때 발생하는 콜백함수이며 아래는 그 예입니다. 서버 측으로 받은 결과에서 도형의 중심점과 2번째 속성값만을 확인하는 예입니다.
|
김형준(Dip2K)
2012/02/01 16:02
2012/02/01 16:02
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/805 |
|
|
|
|
|
|
|
FID값은 FeatureID로써 이 값에 대한 Feature를 가져오는 예제 코드입니다. 참고로 Feature는 공간 데이터 + 속성 데이터의 셋입니다. 먼저 대상 레이어를 파악해야 합니다. FID에 관련된 레이어이므로 1번 코드에서 XrShapeMapLayer가 필요하고 요청할 FID의 리스트를 3~4번에서 만들고 있습니다. 그리고 5번 코드에서 queryByFIDs 매서드를 통해 리퀘스트를 서버에 날립니다.
서버에 대한 응답은 비동기적으로 처리되므로 콜백함수가 필요하며 queryByFIDs의 세번째 인자에 지정합니다. 두번째 인자는 공간 데이터 뿐만 아니라 속성 데이터까지 가져오라는 의미입니다. 그렇다면 서버로부터 받은 Feature를 처리하기 위한 콜백함수를 살펴보면, 그 예는 다음과 같습니다. 결과가 오면 도형의 중심점과 두번째 속성값을 표시하는 코드입니다.
|
김형준(Dip2K)
2012/02/01 15:21
2012/02/01 15:21
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/804 |
|
|
|
|
|
|
|
핑거아이즈는 서버측의 DBMS에 UPDATE, INSERT, DELETE와 같은 SQL 문을 실행할 수 있도록 요청할 수 있습니다. 다음 코드는 그 예입니다. SQL문의 실행을 서버측에 요청하고 그 결과를 받아오는 일련의 과정을 사용하기 쉽게 캡슐화된 XrUpdateTableService 클래스를 이용합니다. 서버의 IP와 사용하는 DBMS의 종류 그리고 SQL 문이 서버측에서 성공적으로 실행되었을때와 실패했을때에 대한 콜백함수를 생성자의 인자로 지정합니다.
아래는 SQL문이 성공적으로 실행되었을때와 실패했을때에 대한 콜백함수의 예입니다.
|
김형준(Dip2K)
2012/02/01 14:02
2012/02/01 14:02
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/803 |
|
|
|
|
|
|
|
진행하고 있는 프로젝트에서 사용하고 있는 공간 DBMS로 PostGIS를 사용하고 있습니다. 공간 테이블을 직접 만들어어 활용해야할 필요가 있어 찾은 내용을 정리해 봅니다.
고유한 ID 값으로써 fid와 기타 필드로써 name 그리고 Geometry 값에 대한 the_geom이라는 이름의 필드를 가지는 테이블을 생성하는 SQL 문의 예는 다음과 같습니다. 1번 줄에 생성할 테이블 명으로써 tst_Table로 지정했습니다. 2~4번 줄이 앞서 언급한 필드들이구요. 6번 줄은 Geometry에 대한 필드인 the_geom의 차원이 2차원, 즉 X와 Y의 쌍이어야 한다는 제약 조건입니다. 그리고 8번 줄의 제약 조건은 Geometry가 MULTIPOLYGON 타입이며 NULL 일 수 있다는 것 입니다. 그리고 13번 줄은 Geometry의 Spatial Reference ID에 대한 제약 조건입니다.
이제 아래는 앞서 생성한 공간 테이블에 하나의 레코도를 추가하는 SQL 문입니다. 일반적인 INSERT SQL 문입니다. 단지 주목해야할 줄은 11번입니다. Geometry에 대한 WKT 형식으로 지정했으며 공간참조로 -1을 주었습니다. 이 값은 앞서 공간 테이블을 생성할때 제약 조건과 일치합니다.
|
김형준(Dip2K)
2012/01/25 11:25
2012/01/25 11:25
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/801 |
|
|
|
|
|
|
|
서로 다른 좌표계를 가진 SHP 파일의 좌표계 변환툴입니다. 입력 SHP가 사용하는 좌표계를 지정하고 변환하고자 하는 좌표계를 선택해 주면 쉽게 좌표계가 변환됩니다. SHP 파일 변환 뿐 아니라 단일 좌표계 변환 및 간단한 도분초 단위의 변환 기능을 지원합니다.
서로 다른 타원체 간의 변환에 사용되는 파라메터를 적용할 수 있으므로 변환에 사용된 파라메터를 알고 있다면 보다 정확하게 좌표계를 변환할 수 있습니다.
이 좌표계 변환툴은 DuraMap-Xr 엔진을 사용하였습니다. DuraMap 엔진에 대한 자세한 소개는 다음 URL을 참고하시기 바랍니다.
http://www.gisdeveloper.co.kr/notice/574또한 DuraMap-Xr의 다운로드는 다음 URL에서 가능합니다. 듀라맵 엔진의 최신 버전(3.2.0.0)을 사용해야 합니다. 예전 버전은 국내 좌표계만을 대상으로 하였으나 최신 버전에서는 PROJ4 문자열 방식을 사용하여 전세계의 모든 좌표계를 지원할 수 있도록 하였습니다. 참고로 아래의 PROJ4 문자열은 이 좌표계 변환툴에서 사용하는 좌표계에 대한 내용입니다. 소스코드와 실행 파일을 각각 별도로 다운로드 받을 수 있습니다. 개발이 가능하신 분이라면 PROJ4를 통해 좌표체계를 쉽게 추가하거나 변경할 수 있습니다. 소스코드와 실행 파일은 다음 URL을 통해 다운로드 받으실 수 있습니다. 본 프로그램에 대한 사용에 있어 궁금한 점이나 개선에 대한 피드백은 언제든 환영입니다. 여러분의 피드백을 통해 다양한 상황에 대해 매우 편리하고 정확한 좌표계 변환툴로 발전하기를 기대합니다.
|
김형준(Dip2K)
2012/01/23 16:43
2012/01/23 16:43
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/800 |
|
|
|
|
|
|
|
핑거아이즈에서 마우스로 거리와 면적을 측정하는 방법에 대한 설명입니다. 펑거아이즈는 면적과 거리에 대해서도 스냅핑 기능을 적용할 수 있음으로 보다 정확하게 면적과 거리를 측정할 수 있습니다. 예를 들어 지적도를 대상으로 스냅핑을 적용할 경우 면적과 거리를 마우스를 이용해 측정할때 지적도의 도형의 정점이나 선분에 스냅핑되어 지적도를 정확히 참조하여 거리와 면적을 측정할 수 있습니다.핑거아이즈의 거리와 면적의 측정은 매쉬업 레이어를 대상으로 작동합니다. 그러므로 거리와 면적을 측정하기 위해서는 지도 컴포넌트에 XrMashupLayer 클래스를 통해 매쉬업 레이어를 추가해야 합니다. 아래의 코드는 "mashup"이라는 레이어 고유 식별자를 지정하여 매쉬업 레이어를 추가하는 코드입니다. 레이어 고유 식별자는 임이의 문자열로 지정 가능하며 각 레이어 마다 고유해야 합니다.
보시면, 매쉬업 레이어를 추가한 후에 편집 대상 레이어로써 추가한 매쉬업 레이어를 지정해 줘야 합니다. 면적 측정이나 거리 측정은 마우스를 통한 새로운 폴리곤과 폴리라인을 만들어 내는 작업이므로 간단한 편집 기능으로 분류되기 때문입니다.
이제 거리와 면적을 측정하는 코드에 대해 살펴보겠습니다. 먼저 면적을 측정하기 위한 버튼을 클릭하게 되면 발생하는 클릭 이벤트 처리 함수에 대해 다음처럼 코딩합니다.
먼저 3번 코드를 통해 맵의 상태를 편집 상태로 지정합니다. 편집 상태가 되면 마우스에 대한 조작은 모두 편집 행위로 간주됩니다. 다시 지도를 확대하고 축소하고 이동하려면 editMode를 false로 지정해 주면 됩니다. 그리고 4번 코드를 통해 고유한 id 값을 하나 만듭니다. fid 변수는 int 타입의 전역 변수로써 계속 1씩 증가해 중복되지 않은 값을 유지합니다. 물론 정말 중복되지 않도록 하려면 필요할 경우 다양한 방법이 적용되어야 할 것입니다. 5번 코드는 폴리곤을 그리라는 코드로써 앞서 만들어 놓은 중복되지 않는 정수값 인자 하나와 true 값 인자가 사용됩니다. 중요한 것이 바로 이 두번째 인자인 true입니다. true값이 지정되면 그래픽 요소를 그릴때 그래픽 요소에 관련된 측정값이 함께 표시됩니다. 여기서는 폴리곤이므로 폴리곤의 면적이 표시됩니다. 아래의 이미지는 면적 측정 버튼을 누른후 마우스 클릭을 통해 면적을 측정하는 화면입니다. 다음은 거리를 측정하는 코드입니다.
면적 측정과 다른 부분은 5번 코드 뿐입니다. 즉, addPolygon 대신에 거리 측정에 대한 폴리라인인 addPolyline 매서드로 대체되었습니다. 아래의 그림은 거리 측정 버튼을 클릭하고 마우스로 거리를 측정하는 화면입니다.
|
김형준(Dip2K)
2012/01/20 15:27
2012/01/20 15:27
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/799 |
|
|
|
|
|
|
|
| 또 다시 지오메트리에 대한 WKT 형식을 파싱해야할 상황이 생겼습니다. 예전엔 한땀.. 한땀.. -_-; 문자값 하나 하나를 파싱해서 좌표값을 뽑아 냈더랬습니다. 그런데.. 또 이짓을 해야한다고 생각하니.. 손과 뇌에 마비가 와 죽어도 못하겠더군요..
해서.. 뭔가 그럴듯한.. 세련된 방법이 없나.. 궁리를 하다가.. 정규표현식(Regular Expressions)를 이용해 보자라는 생각이 들었습니다. 예전에 정규표현식에 대해 살펴봤던 적이 있었는데.. 이런게 있구나 싶을 정도로만 봐두었던지라.. 떠올랐나봅니다.
실무에서 필요한 기술이라 생각되니.. 정규표현식을 사용하는 방법을 제법 집중해서 살펴보게 되었습니다.. 결국 원하는 결과를 얻어 냈습니다... 해서 정규표현식을 이용해 WKT 형식의 지오메트리의 좌표를 뽑아 내는 코드를 잠시 살펴보겠습니다.
대상이 되는 WKT는 다음과 같다고 하겠습니다. 예이므로 올바른 폴리곤은 아닙니다. 단지 WKT 형식이라는 점에만 유념해 주시면 됩니다. 이 WKT을 보면 폴리곤이 3개의 파트로 구성됩니다. 정규표현식을 이용해 3개의 파트에 대해 각 파트를 구성하는 좌표를 쭉... 뽑아내 보는 코드는 아래와 같습니다. 실제 결과는 다음과 같습니다.
정규표현식을 이제 막 익힌 제가 머리를 쥐어짜가며 구성한 코드입니다. 4개나 되는 정규표현식을 사용했습니다.. 정규표현식에 숙련된 자라면 휠씬 빠르고 적은 수의 표현식으로 동일한 결과를 얻어 낼 수 있을거라.. 생각해 봅니다.
아! 위의 코드는 예는 ActionScript입니다. 물론.. 정규표현식은 C#, JavaScript, C, PHP 등등 매우 많은 언어에서 사용할 수 있는 기능입니다. 각 언어에 따라 정규표현식에 대한 API가 다르지만 정규표현식 자체는 거의 동일합니다.
|
김형준(Dip2K)
2012/01/16 19:24
2012/01/16 19:24
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/797 |
|
|
|
|
|
|
|
"무엇인가를 완벽히 이해하려면, 천천히 씹어 삼키기 위한 자세와 열정적인 자기 헌신이 필요하다. 하지만 대부분의 사람은 그런 일을 하지 않는다", 1996년에 스티브잡스가 한 말이라고 합니다. 하나의 목표를 정했고.. 그 목표를 이루기 위한 태도와 마음가짐을 표현한 말이라 생각합니다. 오늘 이후.. 목표를 이루기 위한 과정 중... 힘들때... 이 글이 내 자신에게 힘이 되어 주길 바랍니다..
"이미 짐작했잔아.. 뭘 힘들다 투정대는거야? 계속 가!"
|
김형준(Dip2K)
2012/01/11 20:29
2012/01/11 20:29
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/795 |
|
|
|
|
|
|
|
안드로이드 기반의 GIS 엔진인 블랙포인트은 사용자가 볼 수 있는 지도의 축척을 일정한 범위로 제한할 수 있습니다. 아래의 코드는 축척을 1:700000 ㅡ 1:500 사이에서만 지도를 볼 수 있도록 하는 예제입니다.
블랙포인트는 축척이 변경될때마다 축척 변경에 대한 이벤트가 발생합니다. 이 이벤트를 이용하는 방법인데요. 이 축척 변경 이벤트 안에서 축척값을 조사해 범위를 벗어나면 축척값을 다시 설정해 주면 원하는 결과를 얻을 수 있습니다.
|
김형준(Dip2K)
2012/01/09 15:05
2012/01/09 15:05
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/793 |
|
|
|
|
|
|
|
오직 공간 도형에 대한 FID 값만을 알고 있는 상태에서 해당 도형의 MBR 영역을 얻어는 방법입니다. 물론 공간 데이터는 저...... 멀리 떨어진 서버에 존재하고 있습니다. 사용하는 클래스는 XrQueryMBRByFIDService이며 사용 예에 대한 코드는 다음과 같습니다.
1번과 2번 코드를 통해 FID 값은 77707이며 검색 대상이 되는 레이어를 레이어 명으로 얻어옵니다. 그리고 XrQueryMBRByFIDService의 run 함수를 통해 FID와 대상 레이어를 인자로 해서 호출합니다.
성공적으로 MBR을 얻어오면 onRequestMBRComplete 함수가 호출되며 실패하면 onRequestMBRError가 호출됩니다. 이 함수들의 코드는 다음과 같은 형태가 될 수 있습니다.
MBR 얻기가 성공했을때 호출되는 콜백함수에는 MBR 값이 XrExtent 타입으로 넘어옵니다. 이 타입을 통해 MBR에 접근해 지도를 이동시키는 등의 작업을 할 수 있습니다.
아래의 이미지는 위의 코드를 기반으로 지적 검색 기능을 실제 프로젝트에 적용해 본 화면입니다. 읍면 그리고 리 등과 같은 정보를 입력하고 검색을 누르면 해당 지번이 검색되고 검색된 지번 중 하나를 선택하고 이동 버튼을 누르면 선택된 지번의 FID 값을 이용해 해당 위치로 이동합니다.
|
김형준(Dip2K)
2012/01/05 17:28
2012/01/05 17:28
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/792 |
|
|
|
|
|
|
|
Flex 기반의 GIS 엔진인 핑거아이즈는 데이터베이스 테이블의 데이터를 쉽게 쿼리할 수 있는 매우 손쉬운 API를 내장하고 있습니다. XrQueryTableService라는 클래스로 이름에서도 알 수 있듯이 테이블에 대해 쿼리를 날려주는 서비스를 제공하는 녀석입니다. SQL 구문 중 SELECT 구문을 통해 쉽게 데이터를 질의할 수 있습니다. 아래는 이 클래스를 사용하는 한가지 예입니다.
DBMS는 127.0.0.1:8080 주소에 존재하는 서버에 있습니다. 그리고 DBMS는 postgis이구요. arcsde나 jdbc로도 지정이 가능합니다. 쿼리가 성공했을 시 searchQueryRequestComplete라는 함수가 콜백되고 실패했을 시에는 searchQueryRequestError라는 함수가 콜백됩니다. 실제 SQL문의 지정은 XrQueryTableService의 run 매서드를 통해 실어 보낼 수 있습니다.
쿼리시 성공했을 때와 실패했을 때의 콜백 함수의 예는 다음과 같습니다.
위에서 ta는 Flex의 TextArea 컴포넌트입니다. 버튼을 클릭했을 시 위의 코드들을 통해 쿼리를 날리고 결과를 받아 화면에 표시하는 화면은 아래와 같습니다.
보시는 것처럼 TextArea에 쿼리 결과가 XML 형태로 넘어 오는 것을 알 수 있습니다. 핑거아이즈는 개발자가 쉽게 DBMS에 접근하여 개발할 수 있도록 XrQueryTableService라는 클래스를 제공합니다. 이 외에도 ID를 통해 공간 도형의 MBR을 가져오는 서비스 등도 클라이언트 맵 엔진 단에서 제공하고 있습니다.
|
김형준(Dip2K)
2012/01/04 15:51
2012/01/04 15:51
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/791 |
|
|
|
|
|
|
|
| 먼저 블랙포인트를 이용해 구로구의 행정동 SHP 파일을 통해 레이어를 추가합니다. 레이어 추가 코드는 아래와 같습니다.
단지 레이어를 추가한 상태인지라.. 실행을 해도 화면 상에는 아무것도 표현되지 않습니다. 필요한 것은 현재 화면에 보여질 지도 영역을 지정해 주는 것입니다. 먼저 지도 이동 및 지도 축척 지정에 대한 코드입니다.
지도 좌표 (298722, 544094)를 화면 중심으로 위치하고 지도 축척을 1:200000으로 지정해 주는 코드입니다. 실행 결과는 아래와 같습니다.
위의 코드 대신에 아래의 코드는 지도를 110% 확대하는 코드입니다. 결과는 아래와 같습니다.
이와 대응하는 함수로써 90%로 축소시키는 코드는 ZoomOut 입니다. 다음 코드는 보고자 하는 지도 영역을 지정하는 코드입니다. 결과는 아래와 같습니다.
여기서 주의할 점은 지정한 지도 영역과 화면상에 실제로 표시된 지도 영역이 정확히 일치하지 않는다는 점입니다. 이는 지정한 지도 영역과 실제 화면의 가로/세로 비율이 일치하지 않기 때문입니다.
끝으로 지도를 회전시키는 코드입니다. 시계 방향으로 45도 회전시키는 코드는 아래와 같습니다.
반시계 방향은 마이너스(-) 값을 주면 됩니다. 위 코드의 실행 결과는 아래와 같습니다.
또한 현재 회전된 각도 값을 알기 위해서는 CoordMapper의 getRotationAngle 함수를 통해 얻을 수 있습니다.
|
김형준(Dip2K)
2011/12/28 09:16
2011/12/28 09:16
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/790 |
|
|
|
|
|
|
|
블랙포인트에서 ShapeLayer는 SHP 파일 또는 공간서버에서 받은 좌표값 리스트와 속성 데이터를 통해 도형과 라벨을 화면상에 표시할 수 있습니다. 이러한 도형과 라벨에 대해 지도의 축척에 따라 보일지 않보일지를 지정하는 코드의 예는 아래와 같습니다.
1~2번 코드는 지도 컨트롤의 LayerManager를 통해 레이어를 추가하는 일반적인 코드입니다. 그리고 4~7번 코드는 라벨을 표시하기 위해 사용될 데이터 테이블의 필드명과 라벨의 사용 여부 및 라벨의 폰트 크기를 지정하고 있는 코드입니다.
9~12번 코드가 바로 도형에 대해서 원하는 축척 범위 안에서 보이도록 하는 코드로써 1/1 ~ 1/100000의 범위에서만 도형을 보이도록 지정하고 있습니다. 그리고 14~17번 코드가 라벨에 대해서 원하는 축척 범위안에서 보이도록 하는 코드로써 1/1 ~ 1/20000의 범위에서만 라벨을 보이도록 지정하고 있습니다.
결국 위의 코드는 아래의 이미지처럼 지정된 축척 범위에서만 도형과 라벨을 표시하게 됩니다.
|
김형준(Dip2K)
2011/12/27 07:29
2011/12/27 07:29
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/788 |
|
|
|
|
|
|
|
블랙포인트의 지도의 배경 색상은 기본적으로 검정색(Black)입니다. 이 기본 색상을 사용자가 원하는 색상으로 변경하는 코드는 다음과 같습니다.
위의 코드를 통해 변경된 지도의 배경색상이 반영된 화면은 다음과 같습니다.
기본값인 검정색보다.. 좀더 운치있는 색상을 적용하면 좋을듯합니다.
|
김형준(Dip2K)
2011/12/22 19:28
2011/12/22 19:28
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/787 |
|
|
|
|
|
|
|
블랙포인트는 안드로이드 기반의 GIS 엔진으로써 디바이스의 GPS를 통해 현재 위치를 지도 상에 쉽게 찾아 갈 수 있습니다. GPS는 기본적으로 WGS84 타원체의 경위도 좌표계입니다. 만약 사용하는 지도 데이터가 WGS84 경위도 좌표계라면 별 문제가 없지만 지도 데이터가 WGS84 경위도 좌표계가 아닌 다른 좌표계인 경우 좌표계 변환을 해주어야 합니다.
아래의 코드는 수신받은 GPS 좌표를 카텍(Katec) 좌표계로 변환해 사용하겠다는 의미의 코드입니다.
이렇게 하면 GPS에서 수신받은 WGS84 경위도 좌표가 카텍(Katec)으로 변환되어 개발자(사용자)가 사용할 수 있습니다.
블랙포인트는 GPS의 기능을 XrMap의 LocationManager라는 타입의 클래스를 통해 접근할 수 있습니다. 위의 코드에서 getLocationManager() 라는 매서드를 통해 얻을 수 있는 바로 그 클래스입니다.
아래의 코드는 GPS로 부터 수신받은 좌표를 통해 지도를 이동시키는 코드의 예입니다.
물론 위의 코드가 제대로 작동하기 위해서는 모바일 디바이스의 GPS가 활성화되어야 하며 LocationManager의 start() 매서드가 호출되어져야 합니다. start()와 반대로 stop()은 GPS로부터 위치값을 받기를 멈춥니다.
또한 블랙포인트는 트래킹 모드(Tracking Mode) 기능을 지원하여 위의 코드처럼 직접 위치를 이동시켜주지 않고 자동으로 위치를 항상 화면 중앙으로 맞춰주도록 하는 기능이 있습니다. 이 기능을 활성화 시키는 코드는 아래와 같습니다.
|
김형준(Dip2K)
2011/12/21 13:40
2011/12/21 13:40
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/786 |
|
|
|
|
|
|
|
실제 PNU 값은 자주 변경되며 행안부의 주민등록주소코드 자료실을 통해 다운로드 받으실 수 있습니다.
|
김형준(Dip2K)
2011/12/20 16:47
2011/12/20 16:47
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/785 |
|
|
|
|
|
|
|
그래픽 레이어나 SHP 파일을 통한 레이어에서 MBR을 구하는 코드는 다음과 같습니다.
주의할 점은 레이어의 MBR을 얻기 위해서는 먼저 LayerManager의 addLayer 매서드를 통해 레이어로 추가된 후여야 한다는 점입니다. 이는 addLayer 매서드가 수행되어야 해당 Layer의 MBR 정보를 데이터 소스로부터 읽어 오기 때문입니다. 또한 모든 레이어에 대한 MBR을 합한 전체 MBR을 얻어 오는 코드는 다음과 같습니다.
MBR의 중심점은 다음 코드로 쉽게 얻을 수 있습니다.
|
김형준(Dip2K)
2011/12/20 09:10
2011/12/20 09:10
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/784 |
|
|
|
|
|
|
|
| 안드로이드 기반의 범용 GIS 엔진인 블랙포인트에서 SHP 파일을 화면에 표시한 뒤에 터치를 통해 도형의 속성을 확인하는 Identify 기능에 대한 API 사용 방법입니다.
먼저 터치를 통한 속성을 확인할 SHP 파일을 레이어로 추가하는 코드는 다음과 같습니다.
기억해야 할 것은 추가한 레이어의 이름을 7번 코드처럼 ri_layer로 지정했다는 것과 10번 코드를 통해 화면 상에 표시되는 도형에 대한 FID를 기억해 두라는 코드입니다. 10번 코드가 꼭 필요한 것은 아니지만 속도 향상을 위해서라면 추가해 주는 것이 좋습니다. 위의 코드를 통해 레이어가 추가된 화면은 다음과 같습니다.
다음 코드는 레이어를 추가한 후에 지도의 위치를 설정해 주는 코드입니다.
(145207, 263662) 좌표가 화면의 중심에 놓일 것이며 지도 축척은 1:740000이 될 것입니다. 위의 addLayer 함수와 moveMap 코드를 Activity의 onStart 함수에서 실행합니다.
12번과 13번 코드가 바로 레이어 추가와 지도 이동에 대한 함수입니다. 15번 코드는 블랙포인트의 맵 컴포넌트에서 터치 이벤트를 발생할 수 있도록 풀어주는 코드입니다. 15번 코드처럼 마우스 모드를 PickingMode로 지정하지 않으면 지도 조작(지도 확대/축소, 이동, 회전)으로 화면 터치 이벤트가 활용됩니다. PickingMode로 지정해 줌으로써 화면 터치가 더 이상 지도 조작 기능이 아닌 본래의 터치 이벤트 발생으로써 반응합니다. 16번 코드는 화면 터치에 대한 이벤트를 설정해 주기 위한 함수로 다음과 같습니다.
코드가... 졸라맨입니다.. ㅡ_ㅜ 어렵지 않은 코드이니.. 하나 하나 설명드리면 다음과 같습니다. 2번 코드는 일반적으로 안드로이드에서 터치에 대한 TapUp 이벤크 리스너를 할당하는 코드입니다. 4번 코드는 터치가 발생하는 순간에 지도가 그려지고 있는지를 상태를 저장해 둡니다. 5번 코드는 인자를 true로 줌으로써 강제로 지도 그리기를 멈추게 합니다. 만약 false를 주면 지도 그리기가 완료될때까지 대기합니다. 7~8번 코드는 앞서 레이어를 추가할때 지정해 둔 레이어 이름으로 레이어를 얻어옵니다. 11~13번 코드는 화면 좌표를 지도 좌표로 변환하는 코드입니다. 15번 코드가 터치된 위치의 도형의 ID 목록을 얻어오는 코드입니다. 19~26번 코드는 터치된 도형의 속성을 얻기 위한 객체를 준비하는 것이고 실제 24번 코드를 통해 파일에서 속성값을 로드(load)합니다. 28~38번 코드는 속성값으로 메세지로 표시할 문자열값을 구성합니다. 그리고 40~50번 코드를 통해 문자열을 화면에 대화창으로 표시합니다. 53~55번은 앞에서 저장해둔 터치 당시에 지도 그리기 중이였다면 다시 지도를 그리도록 합니다. 그리고 57번의 return문을 통해 함수를 종료합니다. 이후의 코드는 터치한 위치에 도형이 존재하지 않는다라는 메세지를 표시하는 코드입니다. 코드보다... 설명이 더 간단하군요... ㅡOㅡ; 아래의 결과는 실제 터치를 통해 속성값 정보가 표현된 화면입니다.
장황한 설명이였지만.. 실제 코드는 어렵지 않습니다. 아래 URL을 통해 전체 소스 코드를 다운로드해 다시 살펴보시기 바랍니다.
|
김형준(Dip2K)
2011/12/18 00:50
2011/12/18 00:50
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/783 |
|
|
|
|
|
|
|
블랙포인트(BlackPoint-Xr)는 안드로이드 기반의 범용 GIS 엔진으로 지오서비스(www.geoservice.co.kr)에서 개발한 제품입니다. 범용 GIS 엔진으로써 갖춰야 하는 기능 중.. 공간 연산 기능에 대한 예입니다. 공간연산 기능은 다양하며.. 그 다양한 기능 중 버퍼(buffer) 기능에 대한 예를 통해 블랙포인트의 공간연산기능을 소개하겠습니다.
먼저 터치를 통해 화면상에 폴리라인을 스케치 합니다. 터치를 통해 폴리라인을 그리면 아래의 화면처럼 폴리라인이 추가됩니다.
이 폴리라인에 버퍼(Buffer) 연산을 수행해 보는 코드는 다음과 같습니다.
위의 코드에 대한 결과에 대한 화면은 다음과 같습니다.
|
김형준(Dip2K)
2011/12/17 15:47
2011/12/17 15:47
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/779 |
|
|
|
|
|
|
|
그래픽 레이어의 구성 항목을 모두 제거하는 코드는 다음과 같습니다.
아래의 코드는 특정한 ID 값을 갖는 항목을 제거하는 코드입니다.
아래는 위의 기능과 동일한 특정한 ID값을 갖는 그래픽 항목을 제거하는 좀 더 간단한 다른 코드입니다.
|
김형준(Dip2K)
2011/12/15 15:52
2011/12/15 15:52
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/781 |
|
|
|
|
|
|
|
핑거아이즈는 지오서비스에서 개발한 RIA 맵엔진입니다. 기존에 PC 기반의 견고한 GIS 시스템 개발에 안정적으로 활용되어 왔습니다.
최근 플래시를 개발한 Adobe에서 RIA를 통해 한번의 개발로 Android, iOS, BlackBerry 기반의 디바이스에서 구동이 가능한 앱 개발을 적극 지원함으로써 이에 대해 핑거아이즈를 활용하여 안드로이드에서 지도를 볼 수 있는 앱을 간단히 만들어 공개해 봅니다.
어도비의 AIR의 성능이 향상됨에 따라 모바일 디바이스에서 핑거아이즈의 지도 표출 속도 역시 매우 향상되었습니다. 다음은 위의 앱에 대한 안드로이드 설치 파일(APK)입니다. 안드로이드 디바이스를 가지고 계시는 분들은 받아서 설치해 테스트 해보시기 바랍니다.
핑거아이즈(FingerEyes-Xr)는 지오서비스(www.geoservice.co.kr)에서 개발한 GIS 엔진입니다. LGPL 기반의 오픈소스(OpenSource)이며 전체 소스코드는 지오서비스 홈페이지 자료실을 통해 다운로드 받으실 수 있습니다.
|
김형준(Dip2K)
2011/12/14 19:07
2011/12/14 19:07
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/780 |
|
|
|
|
|
|
|
블랙포인트는 사용자가 원하는 그래픽 요소를 구성하기 위한 레이어로써 GraphicLayer 기능을 가지고 있습니다. GraphicLayer를 통해 Point, Polyline, Polygon, Rectangle, Circle, Ellipse, Text를 표현할 수 있습니다. 아래의 코드는 그래픽 레이어를 추가하고 이 그래픽 레이어에 Polyline을 추가하는 코드입니다.
결과는 아래와 같이 5개의 정점으로 구성된 폴리라인이 표시됩니다.
일단 그래픽 레이어에 폴리라인이 추가되면 폴리라인을 구성하는 정점과 심벌을 자유롭게 변경할 수 있습니다. 아래는 폴리라인을 구성하는 정점 리스트를 얻는 코드입니다.
정점의 인덱스가 1인, 즉 두번째 정점을 제거했으므로 다음과 같이 폴리라인의 변경됩니다.
여기서 주의할 점은 현재 폴리라인 그래픽 요소는 Single입니다. 현재 Multi Polyline 형태로 개선 중에 있으므로 지금은 ArrayList<PointD> 타입이지만 추후 ArrayList<ArrayList<PointD>> 타입으로 변경될 수 있습니다.
|
김형준(Dip2K)
2011/12/13 19:09
2011/12/13 19:09
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/778 |
|
|
|
|
|
|
|
| GeoService-Xr은 DuraMap-Xr, FingerEyes-Xr, BlackPoint-Xr을 통해 공간 데이터를 서비스하는 공간 데이터 서버입니다. GeoService-Xr은 ArcSDE, MySQL 그리고 PostgreSQL을 통해 공간 데이터를 읽고 쓸 수 있습니다.
PostgreSQL은 PostGIS을 통해 공간 데이터를 질의하고 있으며 GeoService-Xr 역시 PostGIS를 사용합니다. 이러한 PostGIS을 통해 지오메트리를 읽는 GeoService-Xr의 기능 중 Multi-Polygon에 대해 옳바르게 도형을 표현하지 못하는 문제점이 있어서 이에 대한 버그를 해결하였습니다.
버그 대상이 되는 폴리곤은 Ring을 여러개 가지는 폴리곤으로써.. 예를 들어 구멍이 뚫린 폴리곤의 경우입니다. 아래의 그림은 버그가 해결된 상태에서 PostGIS를 통해 공간 데이터를 가져와 FingerEyes에서 표출한 화면입니다. 클릭하면 원본 크기로 볼 수 있습니다.
해결된 부분에 대한 GeoService-Xr의 소스 코드 부분은 다음과 같습니다. 문제의 근본적인 원인은 PostGIS에서 폴리곤에 대한 Geometry Type에 대한 제 스스로에 대한 이해 부족입니다. 혹... PostGIS를 통해 공간 데이터를 쿼리하고 결과를 받아 좌표를 뽑아 낼때 아래의 코드가 조금이나마 도움이 되시길 바랍니다.
주의 할점은 멀티폴리곤은 Polygon으로 구성되며 Polygon은 다시 LinearRing으로 구성된다는 점입니다. Polygon이 다시 LinearRing으로 구성되는 이유는 구멍이 뚫린 폴리곤 등을 나타내기 위함입니다.
|
김형준(Dip2K)
2011/12/05 14:27
2011/12/05 14:27
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/772 |
|
|
|
|
|
|
|
블랙포인트는 안드로이드 기반의 범용 GIS 엔진입니다. 별도의 맵 컴포넌트를 View 형태로 제공함으로써 개발하고자 하는 시스템에 쉽게 사용할 수 있습니다. 블랙포인트는 현장에서 데이터를 취득하기 위한 앱 개발을 위해 현장에서 공간 데이터를 쉽게 편집할 수 있는 공간 데이터 편집 기능을 제공합니다.
위의 화면은 블랙포인트에서 편집 기능에 대한 데모 화면으로 공간 데이터로써 폴리곤을 그릴때 스냅핑 기능을 실행하고 있는 화면입니다. 블랙포인트의 스냅핑 대상은 정점(Vertex)와 세그먼트(Segment)입니다. 이외에도 공간 데이터 편집에 대한 Undo/Redo 기능을 제공하여 보다 정확하고 편리하게 공간 데이터를 편집할 수 있습니다.
다음은 블랙포인트(BlackPoint-Xr)의 편집에 대한 기능 목록 중 일부입니다.- 폴리곤/폴리라인/포인트에 대한 Simple Feature Type에 대한 편집
- 사각형, 원, 타원, 텍스트에 대한 도형 편집
- 정점 추가 및 삭제 편집
- 편집 이력에 대한 Undo/Redo 지원
- 정점과 세그먼트에 대한 스냅핑 기능
블랙포인트에 대해 보다 구체적인 기능이 궁금하시면 언제든 지오서비스(hjkim@geoservice.co.kr)에 문의 하시면 직접 방문하여 시연을 통해 소개해 드리도록 하겠습니다.
|
김형준(Dip2K)
2011/12/05 09:57
2011/12/05 09:57
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/771 |
|
|
|
|
|
|
|
| 다음 코드는 블랙포인트에서 SHP 파일을 통한 레이어에서 특정 FID에 해당하는 도형 정보와 속성 정보를 얻는 예입니다. 먼저 SHP 파일을 통한 레이어 추가는 다음과 같습니다. 레이어 추가에 대한 보다 더 자세한 내용은 http://www.gisdeveloper.co.kr/745 를 참고하시기 바랍니다.
이제 이 레이어에서 도형과 속성 정보에 접근할 수 있는 접근자(Access)를 얻는 코드는 다음과 같습니다.
SHP 파일은 공간 도형 데이터로 구성되므로 접근자가 ShapeAccess 클래스 타입입니다. 다음으로 FID를 알고 있다고 할때 해당 FID의 도형정보(MBR과 첫번째 구성 좌표)를 얻는 코드는 다음과 같습니다.
블랙포인트는 SHP 파일을 통해 레이어를 구성할때 안드로이드의 메모리 한계에 대한 제약을 받지 않도록 하기 위해 메모리를 사용하지 않습니다. 이러한 전제조건으로 인해 위와 같은 다소 특이한.... 코드 사용이 나타나고 있습니다. 1번 코드에서 loadById 매서드를 통해 Row를 메모리에 올립니다. getRow라는 매서드도 제공하는데.. SHP 파일의 경우 getRow는 언제나 null을 반환합니다. 앞서 설명드렸듯... 이는 SHP 파일을 통한 레이어는 메모리를 사용하지 않는다는 전제조건(제약) 때문입니다. 결국 loadById를 통해 Row를 얻고 해당 FID에 대한 Row가 존재하는지 2번 줄의 조건문에서 확인해서 3번 코드를 통해 MBR을 얻습니다. 그리고 도형의 구성 좌표를 얻기 위해 4번 코드처럼 ShapeRow로 형변환한 후.. 도형을 얻고(getShape 매서드) getVertex를 통해 도형을 구성하는 첫번째 좌표를 얻습니다. getVertex 매서드의 첫번째 인자는 파트(Part) 인덱스이고 두번째 인자는 정점 인덱스입니다. 파트라는 인자가 나오는 이유는 멀티 폴리곤, 멀티 폴리라인 등과 같이 여러개의 파트로 구성된 도형의 좌표를 구분하기 위함입니다.
끝으로... 오늘도 제가 가장 많이 달렸군요.........
|
김형준(Dip2K)
2011/11/29 21:00
2011/11/29 21:00
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/769 |
|
|
|
|
|
|
|
3주전인가.. 마침.. 갤럭시탭 10.1을 테스트할 수 있는 기회가 생겨서 기존에 블랙포인트로 개발된 데모 시스템 하나를 갤럭시탭 10.1에서 테스트해 보았습니다.
기존에 사용하는 테스트 디바이스의 경우, 화면 해상도도 작고.. 싱글 코어인 상황인지라.. 갤럭시탭 10.1의 더욱 커진 화면 해상도에 대한 메모리 사용에 대한 문제 발생 여부와 듀얼 코어에 대한 스레드 안정성에 대한 문제가 발생할 가능성이 있다고 판단되었지만.. 다행히도 두가지 문제점이 실제로 발생하지 않았습니다.
그러나 화면 해상도가 커짐에 따라 지도 표출 속도가 저하되는 문제가 발생했습니다. 몇가지 개선을 통해 속도를 향상시켜 놓았으나.. 좀 더 근본적으로 이 문제를 개선할 방안을 고민 중입니다. 현재로써는 SHP 파일을 바로 사용하는 방식인데... 이를 자체 포맷 형태로 변환해 사용하는 방식을 지원하는 것을 통해 속도를 개선시킬 계획입니다.
아래의 화면은 갤럭시탭 10.1에서 블랙포인트의 데모를 올려 실행시킨 화면에 대한 스크린샷입니다. 클릭하시면 원래 실행 화면 크기로 보실 수 있습니다.
블랙포인트는 지오서비스(www.geoservice.co.kr)에서 개발된 안드로이드 기반의 GIS 맵 엔진입니다.
|
김형준(Dip2K)
2011/11/24 17:06
2011/11/24 17:06
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/760 |
|
|
|
|
|
|
|
제목이.. 참.. 거시기 합니다.. 좀더 풀어 설명드리면.. 하나의 SHP 파일을 사용자가 지정한 행과 열의 수로 격자를 만들고.. 이 격자의 수 만큼.. 도형을 분리해 다수의 SHP 파일로 만들어 주는 툴입니다. 격자에 따라 분리를 할뿐.. 격자에 맞춰 도형을 잘라내지 않습니다. 아래는 이 프로그램의 실행 화면입니다.
위의 화면은 하나의 SHP 파일을 불러들인 후 격자의 행 수를 3으로 하고 열의 수를 3으로 하여 총 9개의 SHP 파일로 뽑아 내는 경우입니다. 9개의 SHP 파일의 이름은 d:/shp로 시작하여 shp_0_0.shp, shp_0_1.shp 등으로 지정됩니다. 아래의 화면은 이렇게 만들어진 9개의 SHP 파일을 ArcMap에서 레이어로 불러와 표시한 화면입니다.
이 프로그램은 DuraMap-Xr를 통해 개발되었으므로 먼저 DuraMap-Xr를 다운로드(http://www.gisdeveloper.co.kr/notice/574) 받으신 후 실행하시기 바랍니다. 이 프로그램에 대한 소스 코드와 실행 파일(Release 폴더)은 다음 url을 통해 다운받으시기 바랍니다.
|
김형준(Dip2K)
2011/11/15 13:40
2011/11/15 13:40
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/763 |
|
|
|
|
|
|
|
블랙포인트는 화면 상의 지도에 대한 축척이 변경했을 경우에 이벤트가 발생합니다. 아래의 코드는 블랙포인트의 지도 컴포넌트인 XrMap에 대해서 지도 축척에 대한 변경이 발생했을때 이벤트를 처리하기 위한 핸들러를 지정하는 코드입니다.
이 코드는 축척이 변경되었을때 축척변경이라는 메세지를 나타내도록 한 예입니다. 지도의 축척이 변경된 경우는 터치를 통한 지도 확대/축소가 가장 대표적인 경우입니다.
|
김형준(Dip2K)
2011/11/14 16:15
2011/11/14 16:15
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/762 |
|
|
|
|
|
|
|
| 핑거아이즈가 OGC 표준 맵 서비스인 WMS를 지원하게 되었습니다. 지원에 대한 테스트 WMS 버전은 1.1.1입니다. 아래는 핑거아이즈에서 WMS를 통해 지적도를 서비스 받아 표시한 화면입니다.
테스트에 대해 사용한 공간서버는 GeoServer 2.1.1입니다. GeoServer에 대한 셋팅과 SHP 파일을 통한 레이어 구성등은 On Spatial(www.onspatial.com) 블로그에서 제공하는 문서(http://ss.textcube.com/blog/3/30800/attach/XVnDChhGSs.pdf)를 참고하여 진행하였습니다. 아래는 위의 지적도를 표출을 위해 서비스 되고 있는 GeoServer의 실행 화면입니다.
WMS에 대한 내용의 이해는 OGC에서 제공하는 OpenGIS Web Map Server Implementation Specification 문서를 통해 파악하였습니다. 끝으로 핑거아이즈에서 WMS를 통한 레이어를 추가하는 코드는 아래와 같습니다.
|
김형준(Dip2K)
2011/11/04 14:03
2011/11/04 14:03
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/759 |
|
|
|
|
«
2012/02
»
| 일 |
월 |
화 |
수 |
목 |
금 |
토 |
| |
|
|
1 |
2 |
3 |
4 |
| 5 |
6 |
7 |
8 |
9 |
10 |
11 |
| 12 |
13 |
14 |
15 |
16 |
17 |
18 |
| 19 |
20 |
21 |
22 |
23 |
24 |
25 |
| 26 |
27 |
28 |
29 |
|
|
|
|
Total : 930596
Today : 65
Yesterday : 645 |
|
|
|