<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>김형준 GIS 연구소 (for Developers)</title>
		<link>http://www.gisdeveloper.co.kr/</link>
		<description></description>
		<language>ko</language>
		<pubDate>Fri, 03 Feb 2012 16:56:01 +0900</pubDate>
		<generator>Textcube 1.7.7 : Con moto</generator>
		<image>
		<title>김형준 GIS 연구소 (for Developers)</title>
		<url>http://www.gisdeveloper.co.kr/attach/1/1185080577.gif</url>
		<link>http://www.gisdeveloper.co.kr/</link>
		<width>160</width>
		<height>120</height>
		<description></description>
		</image>
		<item>
			<title>[FingerEyes] 지오메트리의 버퍼(Buffer) 연산</title>
			<link>http://www.gisdeveloper.co.kr/806</link>
			<description>핑거아이즈는 공간서버인 지오서비스(GeoService-Xr)의 지오프로세싱(Geoprocessing) 서비스를 통해 지오메트리의 버퍼 연산을 수행할 수 있습니다. 아래의 코드는 레이어의 구성 항목 중 하나의 도형에 대해 버퍼 반경값 10으로 하여 버퍼 연산을 수행하는 코드입니다.&lt;div&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
var ml:XrMashupLayer = _map.layers.getLayer(&quot;myLyr&quot;) as XrMashupLayer;
var mashup:IXrMashup = ml.getMashup(0);
if(mashup != null)
{
    var wkt:IXrWKT = mashup as IXrWKT;
    var strKwt:String = wkt.toWKT();
    var loader:URLLoader = new URLLoader();
    var url:String = &quot;http://localhost/Gp?command=buffer;geometry=&quot; 
        + strKwt + &quot;;distance=10&quot;;
    var request:URLRequest = new URLRequest(url);

    loader.addEventListener(Event.COMPLETE, onBufferRequestCompleted);
    loader.load(request);			
}
&lt;/textarea&gt;&lt;/div&gt;1번과 2번 코드를 통해 버퍼 연산 대상이 되는 도형을 가져옵니다. 그리고 이 도형에 대한 지오메트리 정보를 WKT 형식으로 변환하는 코드가 5~6번 코드입니다. 마지막으로 7~13번 코드를 통해 공간서버로 요청을 날립니다. 아래의 이미지는 버퍼 연산의 대상이 되는 도형입니다.&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/attach/1/1111325373.png&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;229&quot; width=&quot;229&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;버퍼 연산 서비스를 요청하고 그 결과는 onBufferRequestCompleted 함수를 통해 전달되며 다음과 같은 예로 구성될 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
private function onBufferRequestCompleted(event:Event):void
{
    var loader:URLLoader = event.target as URLLoader;
    var result:String = loader.data;				
    var ml:XrMashupLayer = 
        _map.layers.getLayer(&quot;myLyr&quot;) as XrMashupLayer;
    var mashup:IXrMashup = ml.getMashup(0);
    if(mashup != null)
    {
        var wkt:IXrWKT = mashup as IXrWKT;
        wkt.fromWKT(result);
        ml.updateItem(0, false);
    }

    loader.removeEventListener(Event.COMPLETE, onBufferRequestCompleted);
}
&lt;/textarea&gt;버퍼 연산 결과에 대한 지오메트리 역시 WKT 형식입니다. 연산 결과를 다시 대상이 되는 도형에 반영하고 있습니다. 그 결과는 다음과 같습니다.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/attach/1/1016559612.png&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;229&quot; width=&quot;229&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<category>FingerEyes-Xr</category>
			<category>FingerEyes</category>
			<category>GIS</category>
			<category>Xr</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/806</guid>
			<comments>http://www.gisdeveloper.co.kr/806#entry806comment</comments>
			<pubDate>Fri, 03 Feb 2012 16:51:56 +0900</pubDate>
		</item>
		<item>
			<title>[FingerEyes] Geometry로 Feature 가져오기</title>
			<link>http://www.gisdeveloper.co.kr/805</link>
			<description>Geometry로 Feature를 가져온다는 의미는 임의의 지오메트리와 공간상에서 교차하는 Feature를 가져온다는 의미입니다. 임의의 지오메트리이므로 폴리곤, 폴리라인, 포인트 등 제약이 없습니다. 기준 지오메트리는 WKT 형식으로 쉽게 지정할 수 있습니다. 다음은 지정한 폴리라인과 교차하는 Feature를 서버측으로부터 가져오라는 코드 예입니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
var pnuLyr:XrShapeMapLayer = map.layers.getLayer(&quot;JIBUN&quot;) as XrShapeMapLayer;
if(pnuLyr != null)
{
&amp;nbsp; &amp;nbsp; var bOK:Boolean = pnuLyr.queryByGeometry(
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;LINESTRING(250661 54225, 250343 53233)&quot;,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; true,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback);

&amp;nbsp; &amp;nbsp; if(!bOK)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Error !
&amp;nbsp; &amp;nbsp; }
}
&lt;/textarea&gt;대상이 되는 레이어를 1번 코드를 통해 가져옵니다. 속성과 도형에 대한 기능이므로 XrShapeMapLayer만이 가능합니다. 그리고 4번에서 queryByGeometry 매서드를 통해 쿼리 합니다. 첫번째 인자는 기준 지오메트리로써 WKT 형식으로 지정합니다. 그리고 두번째 인자는 도형 데이터 뿐만 아니라 속성 데이터까지 가져오라는 의미입니다. 그리고 세번째 인자는 공간 데이터 쿼리가 완료되었을때 발생하는 콜백함수이며 아래는 그 예입니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
private function callback(arg:XrSpatialQueryResult):void&amp;nbsp; 
{ &amp;nbsp; 
&amp;nbsp; &amp;nbsp; if(arg != null) &amp;nbsp; 
&amp;nbsp; &amp;nbsp; { &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var shp:IXrShape = null; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var shapes:Object = arg.shapeSet.rows; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for each(shp in shapes) &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var attribute:XrAttributes = &amp;nbsp;&amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arg.attributeSet.rows[shp.fid] as XrAttribute; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(attribute != null) &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; trace(shp.centroid.x + &quot; &quot; + shp.centroid.y &amp;nbsp;&amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + &quot; &quot; + attribute.getValueAsString(1)); &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp; 
&amp;nbsp; &amp;nbsp; } &amp;nbsp; 
&amp;nbsp; &amp;nbsp; else&amp;nbsp; 
&amp;nbsp; &amp;nbsp; { &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 아무것도 오질 않았음.. &amp;nbsp; 
&amp;nbsp; &amp;nbsp; } &amp;nbsp; 
}&amp;nbsp; 
&lt;/textarea&gt;서버 측으로 받은 결과에서 도형의 중심점과 2번째 속성값만을 확인하는 예입니다.</description>
			<category>FingerEyes-Xr</category>
			<category>FingerEyes</category>
			<category>GIS</category>
			<category>Xr</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/805</guid>
			<comments>http://www.gisdeveloper.co.kr/805#entry805comment</comments>
			<pubDate>Wed, 01 Feb 2012 16:02:12 +0900</pubDate>
		</item>
		<item>
			<title>[FingerEyes] FID 리스트로 Feature 가져오기</title>
			<link>http://www.gisdeveloper.co.kr/804</link>
			<description>FID값은 FeatureID로써 이 값에 대한 Feature를 가져오는 예제 코드입니다. 참고로 Feature는 공간 데이터 + 속성 데이터의 셋입니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
var pnuLyr:XrShapeMapLayer = map.layers.getLayer(&quot;JIBUN&quot;) as XrShapeMapLayer;
if(pnuLyr != null) {
&amp;nbsp; &amp;nbsp; var fids:Vector.&amp;lt;uint&amp;gt; = new Vector.&amp;lt;uint&amp;gt;();
&amp;nbsp; &amp;nbsp; fids.push(100, 200, 300, 400, 500, 600, 700, 10000);
&amp;nbsp; &amp;nbsp; if(!pnuLyr.queryByFIDs(fids, true, callback))
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Query Request Error !!
&amp;nbsp; &amp;nbsp; }
}
&lt;/textarea&gt;먼저 대상 레이어를 파악해야 합니다. FID에 관련된 레이어이므로 1번 코드에서 XrShapeMapLayer가 필요하고 요청할 FID의 리스트를 3~4번에서 만들고 있습니다. 그리고 5번 코드에서 queryByFIDs 매서드를 통해 리퀘스트를 서버에 날립니다. &lt;br&gt;&lt;br&gt;서버에 대한 응답은 비동기적으로 처리되므로 콜백함수가 필요하며 queryByFIDs의 세번째 인자에 지정합니다. 두번째 인자는 공간 데이터 뿐만 아니라 속성 데이터까지 가져오라는 의미입니다. 그렇다면 서버로부터 받은 Feature를 처리하기 위한 콜백함수를 살펴보면, 그 예는 다음과 같습니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
private function callback(arg:XrSpatialQueryResult):void
{
&amp;nbsp; &amp;nbsp; if(arg != null)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var shp:IXrShape = null;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var shapes:Object = arg.shapeSet.rows;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for each(shp in shapes)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var attribute:XrAttributes = 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arg.attributeSet.rows[shp.fid] as XrAttribute;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(attribute != null)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; trace(shp.centroid.x + &quot; &quot; + shp.centroid.y 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + &quot; &quot; + attribute.getValueAsString(1));
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; else
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 아무것도 오질 않았음..
&amp;nbsp; &amp;nbsp; }
}
&lt;/textarea&gt;결과가 오면 도형의 중심점과 두번째 속성값을 표시하는 코드입니다.</description>
			<category>FingerEyes-Xr</category>
			<category>FingerEyes</category>
			<category>GIS</category>
			<category>Xr</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/804</guid>
			<comments>http://www.gisdeveloper.co.kr/804#entry804comment</comments>
			<pubDate>Wed, 01 Feb 2012 15:21:40 +0900</pubDate>
		</item>
		<item>
			<title>[FingerEyes] UPDATE, INSERT, DELETE SQL 문 실행</title>
			<link>http://www.gisdeveloper.co.kr/803</link>
			<description>핑거아이즈는 서버측의 DBMS에 UPDATE, INSERT, DELETE와 같은 SQL 문을 실행할 수 있도록 요청할 수 있습니다. 다음 코드는 그 예입니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
var svc:XrUpdateTableService = new XrUpdateTableService(
&amp;nbsp; &amp;nbsp; &quot;127.0.0.1:8076&quot;,
&amp;nbsp; &amp;nbsp; &quot;postgis&quot;,
&amp;nbsp; &amp;nbsp; __completed,
&amp;nbsp; &amp;nbsp; __error
);

var sql:String = &quot;INSERT INTO tstTbl VALUES (100, &#039;안녕하세요!&#039;)&quot;;

svc.run({sql:sql});
&lt;/textarea&gt;SQL문의 실행을 서버측에 요청하고 그 결과를 받아오는 일련의 과정을 사용하기 쉽게 캡슐화된 XrUpdateTableService 클래스를 이용합니다. 서버의 IP와 사용하는 DBMS의 종류 그리고 SQL 문이 서버측에서 성공적으로 실행되었을때와 실패했을때에 대한 콜백함수를 생성자의 인자로 지정합니다.&lt;br&gt;&lt;br&gt;아래는 SQL문이 성공적으로 실행되었을때와 실패했을때에 대한 콜백함수의 예입니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
protected function __completed(cntRowUpdated:uint):void
{
&amp;nbsp; &amp;nbsp; // cntRowUpdated는 SQL문의 실행에 의해 영향을 받은 Row의 수
}

protected function __error():void
{
&amp;nbsp; &amp;nbsp; // SQL 실행하는데 문제 있음
}
&lt;/textarea&gt;</description>
			<category>FingerEyes-Xr</category>
			<category>FingerEyes</category>
			<category>GIS</category>
			<category>Xr</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/803</guid>
			<comments>http://www.gisdeveloper.co.kr/803#entry803comment</comments>
			<pubDate>Wed, 01 Feb 2012 14:02:11 +0900</pubDate>
		</item>
		<item>
			<title>영화, &quot;부러진 화살&quot;</title>
			<link>http://www.gisdeveloper.co.kr/802</link>
			<description>이 영화를 보고 떠오른 영화가.. &quot;도가니&quot;였습니다. 도가니가 특수학교 학우라는 소외된 범위에 대한 매우 안타까운 이야기였다면.. 이 영화는 그냥.. 우리의 현실을 그린 실화를 바탕으로 한 영화라고 생각합니다..&lt;br&gt;&lt;br&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/attach/1/1196619714.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;500&quot; width=&quot;350&quot; /&gt;&lt;/div&gt;&lt;br&gt;꽤 늦은 저녁.. 사은품으로 받은 티켓이 아까워 예매를 하고 홀로 본 영화입니다. 눈이라고 해봐야 별로 내리지 않는 날임에도.. 기상청 스스로의 책임 회피를 위한 대설주의보가 발령된 어제지요.. &lt;br&gt;&lt;br&gt;가진자들이 정한 테두리 안에서 말 잘 듣고 튀지만 않으면.. 그럭 저럭.. 살만한 세상.. 이건 우리나라나.. 다른 나라나 다 마찬가지라고 생각합니다.. 다만.. 그 정도의 차이는 분명 존재한다고 생각합니다. &lt;br&gt;&lt;br&gt;가진자들이 이미.. 그렇게 하기로 결정한 것들 앞에서는 상식이나.. 정의나.. 이런것들 따위는 아무런 의미가 없어져 버리는.. 무서운 현실을 담아 내고 있습니다. 현실을 바탕으로 한 영화이기에.. 영화속의 무서운 현실이.. 영화가 끝나고 난 뒤.. 다시 현실로 돌아와서도.. 내 가슴을 떨리게 하였습니다..&lt;br&gt;&lt;br&gt;그래도.. 이 영화는 이런 현실속에서 살아갈 수 있는 방향과 방법을 제시합니다.. &quot;스스로 계속 똑똑해져라, 그리고 포기하지말고 나아가라.&quot;.. 식상하기만한.. 뭐 이런.. 할 방향과 방법이라고 생각됩니다만.. 이게.. 방법입니다.. 현실은.. 어디까지나 현실이니까요..&lt;br&gt;&lt;br&gt;어떤 영화든.. 보는 사람에게.. 그 나름대로 해석되고.. 자신이 가지고 있는 생각들과 섞여 그 사람에게 투영됩니다.. &#039;부러진 화살&#039;이 요즘 내가 생각하고 있는 것들과 섞여 만들어낸 생각.. 이 생각이 올해 내가 나아가고 내가 해야할 일들에 큰 영향을 줄것입니다..</description>
			<category>스치는 생각들</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/802</guid>
			<comments>http://www.gisdeveloper.co.kr/802#entry802comment</comments>
			<pubDate>Wed, 01 Feb 2012 10:20:16 +0900</pubDate>
		</item>
		<item>
			<title>[PostGIS] 공간데이터 테이블 생성에 대한 SQL</title>
			<link>http://www.gisdeveloper.co.kr/801</link>
			<description>진행하고 있는 프로젝트에서 사용하고 있는 공간 DBMS로 PostGIS를 사용하고 있습니다. 공간 테이블을 직접 만들어어 활용해야할 필요가 있어 찾은 내용을 정리해 봅니다.&lt;br&gt;&lt;br&gt;고유한 ID 값으로써 fid와 기타 필드로써 name 그리고 Geometry 값에 대한 the_geom이라는 이름의 필드를 가지는 테이블을 생성하는 SQL 문의 예는 다음과 같습니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
CREATE TABLE &quot;tst_table&quot;(
&amp;nbsp; &amp;nbsp; fid INTEGER PRIMARY KEY,
&amp;nbsp; &amp;nbsp; name VARCHAR(64),
&amp;nbsp; &amp;nbsp; the_geom geometry,

&amp;nbsp; &amp;nbsp; CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),

&amp;nbsp; &amp;nbsp; CONSTRAINT enforce_geotype_the_geom CHECK 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (geometrytype(the_geom) = &#039;MULTIPOLYGON&#039;::text 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; OR 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; the_geom IS NULL),

&amp;nbsp; &amp;nbsp; CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = (-1))
);
&lt;/textarea&gt;1번 줄에 생성할 테이블 명으로써 tst_Table로 지정했습니다. 2~4번 줄이 앞서 언급한 필드들이구요. 6번 줄은 Geometry에 대한 필드인 the_geom의 차원이 2차원, 즉 X와 Y의 쌍이어야 한다는 제약 조건입니다. 그리고 8번 줄의 제약 조건은 Geometry가 MULTIPOLYGON 타입이며 NULL 일 수 있다는 것 입니다. 그리고 13번 줄은 Geometry의 Spatial Reference ID에 대한 제약 조건입니다.&lt;br&gt;&lt;br&gt;이제 아래는 앞서 생성한 공간 테이블에 하나의 레코도를 추가하는 SQL 문입니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
INSERT INTO tst_Table 
 (
&amp;nbsp; &amp;nbsp; fid, 
&amp;nbsp; &amp;nbsp; name, 
&amp;nbsp; &amp;nbsp; the_geom
) 
VALUES 
 (
&amp;nbsp; &amp;nbsp; 0, 
&amp;nbsp; &amp;nbsp; &#039;테스트&#039;, 
&amp;nbsp; &amp;nbsp; ST_GeomFromText(&#039;MULTIPOLYGON(((0 0,1 0,1 1,0 1,0 0)))&#039;, -1)
); 
&lt;/textarea&gt;일반적인 INSERT SQL 문입니다. 단지 주목해야할 줄은 11번입니다. Geometry에 대한 WKT 형식으로 지정했으며 공간참조로 -1을 주었습니다. 이 값은 앞서 공간 테이블을 생성할때 제약 조건과 일치합니다.&lt;br&gt;</description>
			<category>GIS Working History</category>
			<category>PostGIS</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/801</guid>
			<comments>http://www.gisdeveloper.co.kr/801#entry801comment</comments>
			<pubDate>Wed, 25 Jan 2012 11:25:28 +0900</pubDate>
		</item>
		<item>
			<title>좌표계 변환툴, XrProjection 1.4</title>
			<link>http://www.gisdeveloper.co.kr/800</link>
			<description>서로 다른 좌표계를 가진 SHP 파일의 좌표계 변환툴입니다. 입력 SHP가 사용하는 좌표계를 지정하고 변환하고자 하는 좌표계를 선택해 주면 쉽게 좌표계가 변환됩니다. SHP 파일 변환 뿐 아니라 단일 좌표계 변환 및 간단한 도분초 단위의 변환 기능을 지원합니다.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/attach/1/1148635407.png&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;561&quot; width=&quot;400&quot; /&gt;&lt;/div&gt;&lt;br&gt;서로 다른 타원체 간의 변환에 사용되는 파라메터를 적용할 수 있으므로 변환에 사용된 파라메터를 알고 있다면 보다 정확하게 좌표계를 변환할 수 있습니다.&lt;br&gt;&lt;br&gt;이 좌표계 변환툴은 DuraMap-Xr 엔진을 사용하였습니다. DuraMap 엔진에 대한 자세한 소개는 다음 URL을 참고하시기 바랍니다.&lt;br&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.gisdeveloper.co.kr/notice/574&quot;&gt;http://www.gisdeveloper.co.kr/notice/574&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;또한 DuraMap-Xr의 다운로드는 다음 URL에서 가능합니다.&lt;br&gt;&lt;br&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.geoservice.co.kr/board/list.php?cate=02&quot;&gt;http://www.geoservice.co.kr/board/list.php?cate=02&lt;/a&gt;&lt;a href=&quot;http://www.geoservice.co.kr/board/list.php?cate=02&quot;&gt;&lt;br&gt;&lt;/a&gt;&lt;/div&gt;&lt;font color=&quot;#009966&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;font color=&quot;#009966&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;font color=&quot;#009966&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#008000&quot;&gt;듀라맵 엔진의 최신 버전&lt;/font&gt;&lt;font style=&quot;background-color: rgb(0, 0, 0);&quot; color=&quot;#ffffff&quot; size=&quot;1&quot; face=&quot;&#039;Courier New&#039;,&#039;courier&#039;,&#039;monospace&#039;&quot;&gt;(3.2.0.0)&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#008000&quot;&gt;을 사용&lt;/font&gt;&lt;/strong&gt;해야 합니다. 예전 버전은 국내 좌표계만을 대상으로 하였으나 최신 버전에서는 PROJ4 문자열 방식을 사용하여 전세계의 모든 좌표계를 지원할 수 있도록 하였습니다. 참고로 아래의 PROJ4 문자열은 이 좌표계 변환툴에서 사용하는 좌표계에 대한 내용입니다.&lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;br&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/attach/1/1122813491.png&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;573&quot; width=&quot;500&quot; /&gt;&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;소스코드와 실행 파일을 각각 별도로 다운로드 받을 수 있습니다. 개발이 가능하신 분이라면 PROJ4를 통해 좌표체계를 쉽게 추가하거나 변경할 수 있습니다. 소스코드와 실행 파일은 다음 URL을 통해 다운로드 받으실 수 있습니다.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://www.gisdeveloper.co.kr/attachment/1320170408.zip&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; XrProjection_bin.zip&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://www.gisdeveloper.co.kr/attachment/1308963100.zip&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; XrProjection_src.zip&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;div&gt;본 프로그램에 대한 사용에 있어 궁금한 점이나 개선에 대한 피드백은 언제든 환영입니다. 여러분의 피드백을 통해 다양한 상황에 대해 매우 편리하고 정확한 좌표계 변환툴로 발전하기를 기대합니다.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<category>GIS Tools</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/800</guid>
			<comments>http://www.gisdeveloper.co.kr/800#entry800comment</comments>
			<pubDate>Mon, 23 Jan 2012 16:43:30 +0900</pubDate>
		</item>
		<item>
			<title>[FingerEyes] 면적, 거리 측정하기</title>
			<link>http://www.gisdeveloper.co.kr/799</link>
			<description>핑거아이즈에서 마우스로 거리와 면적을 측정하는 방법에 대한 설명입니다. 펑거아이즈는 면적과 거리에 대해서도 스냅핑 기능을 적용할 수 있음으로 보다 정확하게 면적과 거리를 측정할 수 있습니다. 예를 들어 지적도를 대상으로 스냅핑을 적용할 경우 면적과 거리를 마우스를 이용해 측정할때 지적도의 도형의 정점이나 선분에 스냅핑되어 지적도를 정확히 참조하여 거리와 면적을 측정할 수 있습니다.&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;핑거아이즈의 거리와 면적의 측정은 매쉬업 레이어를 대상으로 작동합니다. 그러므로 거리와 면적을 측정하기 위해서는 지도 컴포넌트에 XrMashupLayer 클래스를 통해 매쉬업 레이어를 추가해야 합니다. 아래의 코드는 &quot;mashup&quot;이라는 레이어 고유 식별자를 지정하여 매쉬업 레이어를 추가하는 코드입니다. 레이어 고유 식별자는 임이의 문자열로 지정 가능하며 각 레이어 마다 고유해야 합니다.&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
var ml:XrMashupLayer = new XrMashupLayer(&quot;mashup&quot;);
map.layers.addLayer(ml);
map.edit.targetLayer = ml;
&lt;/textarea&gt;

보시면, 매쉬업 레이어를 추가한 후에 편집 대상 레이어로써 추가한 매쉬업 레이어를 지정해 줘야 합니다. 면적 측정이나 거리 측정은 마우스를 통한 새로운 폴리곤과 폴리라인을 만들어 내는 작업이므로 간단한 편집 기능으로 분류되기 때문입니다.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;이제 거리와 면적을 측정하는 코드에 대해 살펴보겠습니다. 먼저 면적을 측정하기 위한 버튼을 클릭하게 되면 발생하는 클릭 이벤트 처리 함수에 대해 다음처럼 코딩합니다.&lt;/div&gt;

&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
private function onAddPolygon(event:MouseEvent):void
{
    map.edit.editMode = true;
    var id:uint = fid++;
    var bOK:Boolean = map.edit.addPolygon(id, true);
    if(!bOK)
    {
        trace(&quot;폴리곤 매쉬업 실패&quot;);
    }
}&lt;/textarea&gt;먼저 3번 코드를 통해 맵의 상태를 편집 상태로 지정합니다. 편집 상태가 되면 마우스에 대한 조작은 모두 편집 행위로 간주됩니다. 다시 지도를 확대하고 축소하고 이동하려면 editMode를 false로 지정해 주면 됩니다. 그리고 4번 코드를 통해 고유한  id 값을 하나 만듭니다. fid 변수는 int 타입의 전역 변수로써 계속 1씩 증가해 중복되지 않은 값을 유지합니다. 물론 정말 중복되지 않도록 하려면 필요할 경우 다양한 방법이 적용되어야 할 것입니다. 5번 코드는 폴리곤을 그리라는 코드로써 앞서 만들어 놓은 중복되지 않는 정수값 인자 하나와 true 값 인자가 사용됩니다. 중요한 것이 바로 이 두번째 인자인 true입니다. true값이 지정되면 그래픽 요소를 그릴때 그래픽 요소에 관련된 측정값이 함께 표시됩니다. 여기서는 폴리곤이므로 폴리곤의 면적이 표시됩니다. 아래의 이미지는 면적 측정 버튼을 누른후 마우스 클릭을 통해 면적을 측정하는 화면입니다.&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/attach/1/1218673360.png&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;406&quot; width=&quot;510&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;다음은 거리를 측정하는 코드입니다. &lt;/div&gt;

&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
private function onAddPolyline(event:MouseEvent):void
{
    map.edit.editMode = true;
    var id:uint = fid++;
    var bOK:Boolean = map.edit.addPolyline(id, true);
    if(!bOK)
    {
        trace(&quot;폴리라인 매쉬업 실패&quot;);
    }
}&lt;/textarea&gt;면적 측정과 다른 부분은 5번 코드 뿐입니다. 즉, addPolygon 대신에 거리 측정에 대한 폴리라인인 addPolyline 매서드로 대체되었습니다. 아래의 그림은 거리 측정 버튼을 클릭하고 마우스로 거리를 측정하는 화면입니다.&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.gisdeveloper.co.kr/attach/1/1046734127.png&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;406&quot; width=&quot;510&quot; /&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;</description>
			<category>FingerEyes-Xr</category>
			<category>FingerEyes</category>
			<category>GIS</category>
			<category>Xr</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/799</guid>
			<comments>http://www.gisdeveloper.co.kr/799#entry799comment</comments>
			<pubDate>Fri, 20 Jan 2012 15:27:00 +0900</pubDate>
		</item>
		<item>
			<title>정규표현식(regex)를 이용한 WKT 파싱</title>
			<link>http://www.gisdeveloper.co.kr/797</link>
			<description>&lt;p&gt;또 다시 지오메트리에 대한 WKT 형식을 파싱해야할 상황이 생겼습니다. 예전엔 한땀.. 한땀.. -_-; 문자값 하나 하나를 파싱해서 좌표값을 뽑아 냈더랬습니다. 그런데.. 또 이짓을 해야한다고 생각하니.. 손과 뇌에 마비가 와 죽어도 못하겠더군요..&lt;br&gt;&lt;br&gt;해서.. 뭔가 그럴듯한.. 세련된 방법이 없나.. 궁리를 하다가.. 정규표현식(Regular Expressions)를 이용해 보자라는 생각이 들었습니다. 예전에 정규표현식에 대해 살펴봤던 적이 있었는데.. 이런게 있구나 싶을 정도로만 봐두었던지라.. 떠올랐나봅니다.&lt;br&gt;&lt;br&gt;실무에서 필요한 기술이라 생각되니.. 정규표현식을 사용하는 방법을 제법 집중해서 살펴보게 되었습니다.. 결국 원하는 결과를 얻어 냈습니다... 해서 정규표현식을 이용해 WKT 형식의 지오메트리의 좌표를 뽑아 내는 코드를 잠시 살펴보겠습니다.&lt;br&gt;&lt;br&gt;대상이 되는 WKT는 다음과 같다고 하겠습니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
POLYGON ((100 200, -200 300, -400 500), (10 20, -20 -30, 40 50), (1 2, 2 3, 4 5) )
&lt;/textarea&gt;예이므로 올바른 폴리곤은 아닙니다. 단지 WKT 형식이라는 점에만 유념해 주시면 됩니다. 이 WKT을 보면 폴리곤이 3개의 파트로 구성됩니다.&amp;nbsp; 정규표현식을 이용해 3개의 파트에 대해 각 파트를 구성하는 좌표를 쭉... 뽑아내 보는 코드는 아래와 같습니다.&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
var wkt:String = 
&amp;nbsp; &amp;nbsp; &quot;POLYGON ((100 200, -200 300, -400 500), &quot; + 
&amp;nbsp; &amp;nbsp; &quot;(10 20, -20 -30, 40 50), (1 2, 2 3, 4 5)) &quot;;

var removePrefix:String = wkt.replace(/\bpolygon\b\s*\(/i, &quot;&quot;);
var removePostfix:String = removePrefix.replace(/\s*\)\s*$/, &quot;&quot;);
var parts:Array = removePostfix.match(/\(.*?\)/g);

for each(var part:String in parts)
{
&amp;nbsp; &amp;nbsp; var vertices:Array = part.match(/[+-]?\d*(\.?\d+)/g);
&amp;nbsp; &amp;nbsp; var cntVertices:uint = vertices.length;
&amp;nbsp; &amp;nbsp; trace(&quot;\nPOLYGON VERTICES LIST&quot;);
&amp;nbsp; &amp;nbsp; for(var iVertex:uint=0; iVertex&amp;lt;cntVertices; iVertex+=2)
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var x:Number = vertices[iVertex];
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var y:Number = vertices[iVertex+1];
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; trace(&quot;\tVERTEX: (&quot; + x + &quot;,&quot; + y + &quot;)&quot;);
&amp;nbsp; &amp;nbsp; }
}
&lt;/textarea&gt;실제 결과는 다음과 같습니다.&lt;br&gt;&lt;br&gt;&lt;textarea name=&quot;CodeHighLighterCode&quot; class=&quot;Cpp&quot; cols=&quot;60&quot; rows=&quot;10&quot; readonly=&quot;readonly&quot;&gt;
POLYGON VERTICES LIST
&amp;nbsp; &amp;nbsp; VERTEX: (100,200)
&amp;nbsp; &amp;nbsp; VERTEX: (-200,300)
&amp;nbsp;&amp;nbsp; &amp;nbsp;VERTEX: (-400,500)

POLYGON VERTICES LIST
&amp;nbsp; &amp;nbsp; VERTEX: (10,20)
&amp;nbsp;&amp;nbsp; &amp;nbsp;VERTEX: (-20,-30)
&amp;nbsp;&amp;nbsp; &amp;nbsp;VERTEX: (40,50)

POLYGON VERTICES LIST
&amp;nbsp;&amp;nbsp; &amp;nbsp;VERTEX: (1,2)
&amp;nbsp;&amp;nbsp; &amp;nbsp;VERTEX: (2,3)
&amp;nbsp;&amp;nbsp; &amp;nbsp;VERTEX: (4,5)
&lt;/textarea&gt;정규표현식을 이제 막 익힌 제가 머리를 쥐어짜가며 구성한 코드입니다. 4개나 되는 정규표현식을 사용했습니다.. 정규표현식에 숙련된 자라면 휠씬 빠르고 적은 수의 표현식으로 동일한 결과를 얻어 낼 수 있을거라.. 생각해 봅니다.&lt;br&gt;&lt;br&gt;아! 위의 코드는 예는 ActionScript입니다. 물론.. 정규표현식은 C#, JavaScript, C, PHP 등등 매우 많은 언어에서 사용할 수 있는 기능입니다. 각 언어에 따라 정규표현식에 대한 API가 다르지만 정규표현식 자체는 거의 동일합니다.&lt;br&gt;&lt;/p&gt;</description>
			<category>GIS Working History</category>
			<category>GIS</category>
			<category>WKT</category>
			<category>정규표현식</category>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/797</guid>
			<comments>http://www.gisdeveloper.co.kr/797#entry797comment</comments>
			<pubDate>Mon, 16 Jan 2012 19:24:42 +0900</pubDate>
		</item>
		<item>
			<title>플래시 3D 테스트</title>
			<link>http://www.gisdeveloper.co.kr/796</link>
			<description>&lt;center&gt;&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0&quot; width=&quot;300&quot; height=&quot;300&quot;&gt;&lt;param name=&quot;wmode&quot; value=&quot;direct&quot;/&gt;&lt;param name=&quot;movie&quot; value=&quot;/attach/1/1043990065.swf&quot;/&gt;&lt;!--[if !IE]&gt; &lt;--&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; wmode=&quot;direct&quot; transparent=&quot;yes&quot; data=&quot;/attach/1/1043990065.swf&quot; width=&quot;300&quot; height=&quot;300&quot;&gt;&lt;p&gt;&lt;a href=&quot;/attach/1/1043990065.swf&quot;&gt;[Flash] /attach/1/1043990065.swf&lt;/a&gt;&lt;/p&gt;&lt;/object&gt;&lt;!--&gt; &lt;![endif]--&gt;&lt;/object&gt;&lt;/center&gt;
&lt;br&gt;플래시 11 설치 필요.. 플래시 11이 설치된 안드로이드에서는 보일까... 또한 얼마나 많은 사용자들의 PC에 플래시 11이 설치되어져 있을까..&lt;br&gt;&lt;br&gt;플래시 11이 설치된.. IE7, 8, 9 그리고 크롬, 사파리 웹 브라우져에서 정상적으로 실행됨.. 그런데 안드로이드에서는 않됨.. 인터넷으로 검색해 보면 된다고 나와 있는데... 뭐가 잘못된 걸까...... 애플의 iOS는 AIR 형태로 개발해 올리면 실행이 될까....?&lt;br&gt;</description>
			<author>(김형준(Dip2K))</author>
			<guid>http://www.gisdeveloper.co.kr/796</guid>
			<comments>http://www.gisdeveloper.co.kr/796#entry796comment</comments>
			<pubDate>Wed, 11 Jan 2012 22:40:01 +0900</pubDate>
		</item>
	</channel>
</rss>

