[GIS] DuraMap-Xr, 선택된 도형 하이라이팅 시키기

2011년 새해.. 첫번째 1월입니다! 뭔가 새로운 마음 가짐으로.. 일에 전념하려는 의지와는 다르게 여러가지로 집중하지 못했던 시간이 새해까지 계속 이어져왔는데요. 이런 문제를 극복하기 위한 방법을 여러가지로 고민하다가.. 문득 다음과 같은 아이디어가 떠올랐답니다.

“Be Activated For Yourself”

이 아이디어의 약빨이 조금 먹히는 거 같습니다. 다행이도 말입니다. 해서….. 오랜만에 듀라맵에 대해 그간 질문으로 올라왔던 내용 중에 하나에 대해서 예제를 만들어 글로 올려봅니다.

그 질문이란게 뭔고 하니… SHP 파일로 추가된 지도를 구성하고 있는 도형 중에 하나를 마우스로 클릭했을때 클릭된 도형의 ID 값을 얻어오는 것은 알겠는데.. 방금 선택된 도형을 다른 색상으로 그려 하이라이팅 하고 싶다라나 어쩐데나… 라는 질문입니다. 제 답변은 언제나.. “그래픽 레이어를 이용하세요.” 였습니다. 네, 다른 방법이 더 몇가지 있겠지만.. 바로 이 방법에 대해서 실제로 구현해 보도록 하겠습니다. 먼저 다음과 같이 폼을 디~~~ 자인합니다!

사용자 삽입 이미지
듀라맵과 버튼 그리고 텍스트박스 컨트롤이 조신하게… 자리를 잡고 있습니다. 먼저 Add Layer 버튼은 다음과 같이 코딩합니다.

xr.Layers.AddShapeMapLayer("shp", "D:/__Data__/seoul.shp");
xr.Layers.AddGraphicLayer("gl", "");
xr.WaitForAllConnections();

xr.ZoomFullExtent();
          
xr.MouseMode = XrMapLib.XrMapViewModeEnum.XrNormalMode;

네, shp 파일을 통한 레이어와 그래픽 레이어를 추가하는 코드로 구성되어져 있습니다. 실행하고 버튼을 누르면 짜잔~ 하게 지도가 나타나겠지요. 이제 나타난 지도를 구성하는 도형을 마우스로 눌렀을때 어떤 도형이 눌러졌는지.. ID를 텍스트박스 컨트롤에 표시하고 듀라맵에는 선택된 도형을 다른 심벌로 표시하도록 하겠습니다. 듀라맵의 마우스 업! 이벤트에 대한 코드를 다음과 같이 쭈욱~~ 코딩해 봅니다.

private void xr_OnLButtonUp(object sender, 
    AxXrMapLib._IXrMapControlEvents_OnLButtonUpEvent e)
{
    // 레이어가 존재한다면..
    XrMapLib.ShapeMapLayer lyr = xr.Layers.GetLayerAsShapeMap("shp");
    if(lyr != null)
    {
        // 마우스로 클릭된 (x,y)좌표에 존재하는 shp 레이어의 도형 ID를 구함
        XrMapLib.ValueList FIDs = xr.GetFIDFromMousePoint("shp", e.x, e.y, true);
        // 선택된 도형이 있다면...
        if (FIDs.Count != 0)
        {
            int FID = FIDs.GetValueAsInteger(0);
            // 선택된 도형을 텍스트박스에 표시
            txtFID.Text = FID.ToString();

            // 선택된 도형의 좌표를 얻기 위해 ShapeRow를 구함
            XrMapLib.ShapeRow row = lyr.ShapeTable.GetRow(FID);

            // 그래픽 레이어에 추가할 폴리곤 그래픽 요소를 생성
            XrMapLib.PolygonGraphicElement polygon 
                = new XrMapLib.PolygonGraphicElement();
            XrMapLib.CoordinateListCollection clc 
                = new XrMapLib.CoordinateListCollection();
            
            // 폴리곤 그래픽 요소의 정점을 구성
            int cntParts = row.PartCount;
            for (int iPart = 0; iPart < cntParts; ++iPart)
            {
                XrMapLib.CoordinateList cl = new XrMapLib.CoordinateList();
                int cntVertex = row.GetVertexCountFromPart(iPart);
                for (int iVertex = 0; iVertex < cntVertex; ++iVertex)
                {
                    XrMapLib.Coordinate coord 
                        = row.GetVertexFromPart(iPart, iVertex);
                    cl.Add(coord.X, coord.Y);
                }
                
                clc.Add(cl);
            }

            polygon.SetPolygonList(clc);
 
            // 폴리곤 그래픽 요소의 그리기 심벌을 지정
            polygon.LineSymbol.Width = 3;
            polygon.LineSymbol.Color = RGB(255, 128, 0);
            polygon.FillSymbol.Color = RGB(255, 128, 0);
            polygon.FillSymbol.Alpha = 100;
            
            XrMapLib.GraphicLayer gl = xr.Layers.GetLayerAsGraphic("gl");
            // 예전에 추가한 그래픽 요소는 모두 제거하고 새로운 그래픽 요소를 추가
            gl.RemoveAllElements();
            gl.AddElement(0, polygon as XrMapLib.GraphicElement);

            // 다시 그림!
            xr.Update();
            return;
        }
    }

    txtFID.Text = "NA";
}

먼저 텍스트 박스 컨트롤의 이름은 txtFID입니다. 이 코드의 핵심은 선택된 도형의 ID를 통해 도형의 좌표를 얻어오고.. 이 좌표를 이용해 그래픽 레이어의 요소를 생성해서 그래픽 레이어에 추가한다는 내용입니다. 쉽죠? 물론 여기서는 폴리곤 도형만을 대상으로 하고 있습니다. 포인트, 폴리라인에 대해서는 알아서.. 잘~ 응용을 해보시기 바랍니다! 실행 결과를 하나 살펴보면 아래와 같습니다.

사용자 삽입 이미지

[GIS] DuraMap-Xr, 그림 아이콘을 지도 위에 표시하기

포인트 SHP 파일을 듀라맵에서 표현할때 그리기 심벌로 이미지를 적용하고자 할때가 있습니다. 듀라맵에서 포인트 심벌로 제공하는 이미지 파일의 종류는 bmp, jpg, 투명 배경을 지원하는 gif, 알파값을 지원하는 png입니다.

다음 코드는 포인트 타입의 SHP 파일을 레이어로 추가하고 심벌로 png 파일을 지정하는 코드 예입니다.

axXr1.Layers.AddShapeMapLayer("lyr", "D:/__Data__/주기.shp");
axXr1.WaitForAllConnections();

if (axXr1.Resources.AddImageResource("img", "d:/__data__/redmark.png"))
{
    axXr1.Layers.GetLayerAsShapeMap("lyr").
        PointSymbol.SetImage("img", axXr1.Resources);
}

axXr1.Update();

1번 코드는 주기.shp 파일을 lyr이라는 이름의 레이어로써 추가하는 것이고, 2번 코드는 추가할 레이어의 준비가 완료될때까지 기다리는 코드이며.. 4번 코드에서 readmark.png를 심벌로 사용하기 위해서 img라는 id로 리소스로 추가해 주는 코드입니다. 그리고 6번 코드가 바로.. 가장 핵심적인 코드로 포인트 심벌을 지정해 주는 코드입니다.

사용자 삽입 이미지

위의 그림은 위에서 제시한 코드에 대한 실행 결과로.. 코드는 “SHP Layer” 버튼의 클릭 이벤트에 존재합니다.

경우에 따라서는 SHP 파일처럼 이미 준비된 포인트 데이터가 아닌.. 그때 그때마다 위치가 가변적인 곳에 이미지 심벌을 표시해야하는 경우도 있습니다. 이때는 그래픽 레이어를 사용하며.. 이때의 경우 다음의 예제 코드를 응용하여 기능을 개발할 수 있습니다.

axXr1.Layers.AddGraphicLayer("gl", "");
axXr1.WaitForAllConnections();

IPointGraphicElement gr = new PointGraphicElement();
CoordinateList cl = new CoordinateList();
cl.Add(350, 20);

gr.SetPointList(cl);

axXr1.Resources.AddImageResource("img", "d:/a.png");
gr.PointSymbol.SetImage("img", axXr1.Resources);

axXr1.Layers.GetLayerAsGraphic("gl").AddElement(0, gr as GraphicElement);

axXr1.Update();

그래픽 레이어는 레이어를 구성하는 요소마다 심벌을 지정할 수 있습니다. SHP 파일을 통해서 이미지 심벌을 지정하는 코드처럼 먼저 Resouces의 AddImageResource 매서드를 통해 이미지 리소스를 먼저 추가하고 심벌을 지정해 주면 됩니다. 이미 짐작할 수 있겠지만.. 이미지 리소스는 한번만 추가해주고 재활용할 수 있습니다.

[GIS] DuraMap-Xr 3.0 릴리즈

듀라맵 3.0이 릴리즈되었습니다. 이전 버전을 사용하고 계시는 분들은 최신 버전을 받아 사용하시기 바랍니다. 소소한 버그에서부터 좀더 크고 복잡한 SHP 파일을 읽고 표시할 수 있도록 개선되었습니다. 듀라맵 3.0은 크게 3가지 기능이 추가되었습니다. 3가지 추가된 기능은 다음과 같습니다.

1. 데이터 용량에 제한없이 항공 및 위성 영상 표현

50cm, 25cm급 항공영상에 대해서 전국 범위의 테라급 용량의 항공 및 위성 영상을 듀라맵에서 빠르게 표현할 수 있게 되었습니다.  geotiff 파일로부터 피라미드 시스템을 구축하여 듀라맵에서 사용할 수 있는 포맷(XrR)으로 변경하여 사용할 수 있으며 이렇게 변경된 XrR 파일을 이용해 항공 및 위성영상을 듀라맵에서 읽을 경우 리소스를 거의 사용하지 않으면서 빠르게 화면상에 영상을 표시할 수 있습니다.

사용자 삽입 이미지
듀라맵을 이용하여 대용량의 항공영상을 표시하여 듀라맵의 도형 편집 기능을 이용하여 항공영상을 기반으로 수치지도를 편집할 수 있습니다. 듀라맵에서 사용할 수 있는 항공 및 위성영상에 대한 XrR 포맷으로 변환은 지오서비스로 문의하시기 바랍니다.

2. 공간데이터 서버를 통한 공간 데이터 표현

서버로부터 수치지도와 속성 데이터를 받아 지도를 표시할 수 있는 기능이 추가되었습니다. 기존의 SHP 파일을 통해 레이어를 추가하는 방식과 동일한 매서드인, Layers 객체의 AddShapeMapLayer를 사용하며 서버로부터 레이어를 추가하는 코드 예는 다음과 같습니다.

Xr1.Layers.AddShapeMapLayer("layerName", "XrVtp://abld@geoservice.co.kr:8080/Xr")

위의 코드는 geoservice.co.kr이라는 URL에 존재하는 서버의 8080 포트를 통해 서버가 가지고 있는 레이어중 abld라는 이름의 레이어 리소스를 추가하는 예입니다. 서버를 통해 수치지도를 서비스 받음으로써 수치지도를 네트워크를 통해 여러 사람과 쉽게 공유할 수 있으며 64비트 기반의 서버를 통해 대용량의 수치지도를 관리하고 서비스할 수 있는 기반이 제공됩니다. 듀라맵에 수치지도 및 속성 데이터를 제공하는 서버에 대한 문의는 지오서비스로 하시기 바랍니다.

3. 입체 건물 렌더링 품질 개선

끝으로.. 듀라맵의 장점 중에 하나인 건물의 2.5D 입체 표현에 대해서 그 표현의 품질이 개선되었습니다. 기존에는 건물의 옆면이 모두 동일한 색상으로 표시되어 입체감이 다소 떨어졌으나 3.0 버전에서부터는 태양광의 방향에 따라 옆면의 색상을 다르게 표현하도록 하여 입체감이 향상되었습니다.

사용자 삽입 이미지

[펌] 스타트업 기업의 탑룰 10

 스타트업 기업의 TopRule 10
by Bob Norton

스타트업 기업은 의사결정이 좀더 신속하게 이루어져야 하며, 감수해야 하는 위험은 훨씬 커야 하며, 개발 되는 솔루션은 아직 미완의 완성도(70~80%)를 갖고 있으며, 타겟시장은 좀더 좁게 설정되어져야만 한다. 또한 스타트업기업은 신속하게 디자인되고 출발되어야 하며, 그리고 높은 수준이면서 매우 다양한 범위의 고객 피드백을 받아야 하며, 이에 따라 끊임없이 수정하고 변화시켜야 한다. 이는 마치 가장 최신의 열추적 레이다 정보를 기반으로 하여 끊임없이 목표타겟의 위치를 재조정하는 “열추적 미사일”과 유사하다. 일반적으로 대기업은 이렇게 할 수 없지만 스타트업기업은 대기업과 상대하기 위해서는 자신의 최고의 장점을 극대화시킬 수 있는 극점의 방법을 반드시 선택해야만 한다.

1. 합리적이지만 굉장히 도전적인 목표를 정하고, 이를 달성하기 위한 도전적인 타임스케줄을 정하고, 이를 달성하기 위해서 최고의 노력을 다하라. 이러한 도전이 불가능하다고 의심하는 구성원은 탈락시켜라. 대부분의 프로젝트는 팀이 셋업되고 나서부터 6개월이내에는 완수되어야 한다. 타임스케줄은 당신회사의 생명줄이다.

2. 매일, 일주일, 한달 계속 조그만 변화를 예측하고, 실제로 변화를 실행하라. 최고의 작품이 나오기까지 고객중심의 최고의 솔루션 개발에 집중, 집중, 또 집중하라. (이는 당신이 개발한 것을 잠재적인 고객들에게 계속 보여주고 체크를 하란 의미이다. 보안이 걱정된다면, 보안서약서를 쓰더라도 고객들로부터 계속 계속 체크하라. 스타트업 기업은 ‘열추적 미사일’과 같아야 함을 한시도 잊어선 안된다)

3. 고도의 계산된 위험들을 기꺼이 안을 준비가 되어 있어야 하며, 동시에 그 위험들을 관리할 수 있는 방법을 적극적으로 모색하라. 주요 위험요소들은 모두 Listup한 후, 각각의 위험요소들을 항상 관리하고 생각하고 책임질 수 있는 위험 List별 경영진을 배정하라.

4. 스타트업기업은 장기적으로 가치를 지니고 있는 펀드멘탈적 핵심역량 요소에 모든 기업자원 (시간, 돈)을 쏟아부어야 한다. 소수 고객의 요구에 의해 절대로 이 원칙을 무너 뜨려서는 안된다.

5. 당신이 과거에 했던 모든 경험과 자산들을 이번 사업에 적극 활용하라. 과거에 실패했다고 모든 것을 새롭게 개발할 필요가 없다. 주위에 비슷한 사업에서 실패한 사업가들의 경험과 지식, 노하우를 적극 수용하라. 나에게 적합한 한 사람과의 단 한번의 식사가 당신회사의 10억원 가까이의 실수를 방지해줄 수 있으며, 훌륭한 대부분의 경영자는 그러한 자신의 경험들을 기꺼이 나누고자 할 것이다.

6. 모든 직원들은 매일 실제적인 사업결과물을 만드는데 직접적으로 연관된 일을 해야만 한다. 스타트업 기업에선 오직 CEO 혼자만이 관리자 역할을 해야만 한다. 그리고 CEO는 동시에 직원처럼 3~5가지 사업결과물을 만드는데 직접적으로 연관된 일을 해야만 한다. 그리고 임직원 모두가 자유롭게 얘기할 수 있는 “장벽없는 조직”을 반드시 만들어라. 왜냐면 모든 부서의 일들은 서로 깊이 연결되어 있기 때문이다.

7. 가능한 빨리 경영진부터 직원에 이르기까지 최고의 사람들을 고용하는데 집중하라. 절대로 평균적 사람을 뽑아선 안된다. 그들은 스타트업 기업을 죽이는데 일등공신이 될 것이다.

8. 홀로서기는 당신이 아무리 많은 돈을 갖고 있어도 반드시 거쳐야할 필수과정이다. 이 과정은 현금을 보존시켜줄 뿐만 아니라 “최소투입 – 최대결과란 진정한 비즈니스 수익모델”을 최적화시켜줄 수 있기 때문이다. 당신이 훌륭하게 사업을 하고 있다는 유일한 증거는 ‘수입 – 지출 > 0’이 되게 만드는 것이다. 벤처투자가들이 말한 “Show me the money”는 매우 중요한 말이다.

9. 비즈니스 플랜과 비전을 개발하라. 이는 당신의 시간과 비용을 절감시켜 줄 것이다. (비록 쓰고 난 후 버려진다 해도) 좋은 비즈니스 플랜은 살아있는 문서여서 매일 업데이트되어야 한다. 또한 비즈니스 플랜은 아래에 열거한 리스트들을 반드시 행하는 것을 강요하고 점검할 수 있도록 작성되어야만 한다.

9-1. 당신의 타겟시장을 세분화시켜 고객을 명확하게 정의하라. 즉 이는 실질적인 고객 명단을 갖고 있거나, 매우 세부적인 기준에 의해 고객이 정의되어야 함을 의미한다. 그리고 이들 타겟고객들을 대상으로 경쟁사가 줄 수 없는 “명확한 경쟁적 요소” 또한 명시되어야 한다. 당신이 그들에게 “어떻게 판매”할지를 명확하게문서로 규정하라.

9-2. 당신 회사의 상품/서비스는 가능한 한 좀 더 많은 방법으로 대기업과 압도 적으로 차별화될 수 있도록 포지셔닝해야만 한다. (Unique Selling Point /Position을 명확히 하라) 즉 이는 타겟고객들이 판매자를 변경하거나, 새로운 판매자를 선택하는 모험을 감수할 만큼 더 나은, 더 빠른, 더 저렴한 무언가가 제공되어야 함을 의미한다. 벤처캐피탈은 기존 경쟁사들에 비해 “1/2 가격”에 “2배이상의 혜택”이 고객에게 주어져야 한다고 강조한다. 이는 경쟁사들과 비교하여 최소한 4배 이상의 혜택을 고객에게 줄 수 있어야 함을 의미한다. 만약 이것이 이루어진다면 어떤 경쟁사도 그 시장에서만큼은 당신을 이길수가 없을 것이다. 왜냐하면 고객이 진정으로 원하는 것을 갖고 있기 때문이다.

9-3. 당신의 시장과 경쟁사들을 정확하게 이해하라. 그들 경쟁사들에 대한 정보를 매일 업데이트할 수 있는 시스템과 환경을 갖추어라. 반드시 누군가 한 사람은 그러한 일을 책임지고 있어야 하며, 책임소재가 명확해야 한다.

9-4. 당신 비즈니스의 재무적 민감도를 이해해야만 한다. 성공을 위해서는 어떤 부서, 어떤 영역에 얼마를 투자해야만 하는지를 명확히 알고있어야 한다.

9-5. 당신사업의 적절한 수익성을 위해 프리미엄 가격을 붙일 수 있도록 지속 적인 경쟁우위를 어떻게 유지할 수 있는지를 정의하라. 이는 상품(라인)의 진화가 가능한 세분화된 타겟시장에 진입해야 함을 의미한다. 일단 당신 회사가 초기시장 진입에 성공하고 수익이 발생하기 시작하면 더 큰 시장으로 확대할 수 있어야 한다. 시장 및 기술 선도기업들의 경우, 시장 우위 유지기간이 길지않은 경우가 많으므로, 당신 고객을 유지시키기 위해서는 몇 년뒤에는 새로운 USP가 반드시 필요하다.

9-6. 당신회사의 경영팀은 자원배분, 부서간 상호연결성, 재무적 제약요소와 같은 모든 중요한 문제에 있어서 반드시 동일한 자료와 정보를 갖고 판단할 수 있게 만들어야 한다.

10. 절대로 절대로 포기하지 말라! 향후 닥칠지도 모르는 여러가지 위험요소들을 충분히 멀리(스타트업단계에선 3~6개월 앞) 바라보면서 철저하게 준비하고 대비하면서 사업을 이끈다면 어떤 문제든 반드시 해결할 수 있는 대안이 존재하기 때문이다.

만약 당신이 이러한 조건들을 충족시키지 못한다면, 당신회사의 성공가능성은 급격히 줄어 들 것이다. 따라서 당신회사를 스타트업기업 모드에 적합한 경영으로 전환시킬 수 있도록 외부 경영자로부터 조언을 얻어라. CEO중 50%이상이 스타트업 경험을 가지고 있으며, 실제적으로는 그러한 경험을 가지지 않은 CEO는 한 사람도 없다.