[GIS] FingerEyes-Xr, ShapeMapLayer의 포인트에 이미지 심벌 설정

수치지도 데이터를 서비스 받아 화면에 표시하는 레이어인 XrShapeMapLayer는 도형 데이터를 표현하는 다양한 방법을 제공합니다. 단순히는 일괄적인 색상 심벌에서부터, 속성값에 따라 달라지는 다양한 심벌에까지.. 이 포스트는 포인트 타입의 수치지도 데이터에 대해서 이미지 심벌을 지정하는 코드 예입니다.

layer = new XrShapeMapLayer("LAYER_NAME", "http://www.gisdeveloper.co.kr/Xr?layerName=SPTBL");
shpTheme = layer.theme as XrSingleColorTheme;
 
var ImgSym:XrImageMarkerSymbol = new XrImageMarkerSymbol(   
    {borderEnable:false, markerUrl:"http://www.gisdeveloper.co.kr/images/0.png"});

shpTheme.markerSymbol = ImgSym;

map.layers.addLayer(layer);

포인트 타입의 수치지도의 경우 원, 사각형 등과 같은 단순 도형에서부터 위의 글에서처럼 이미지 뿐만 아니라 특수 기호 표시를 위한 텍스트 심벌을 지원합니다.

[ActionScript] GroupingCollection2 클래스를 이용한 그룹핑(Grouping)

플래시빌더 4.7은 언제 정식 출시되나.. 지금 사용하고 있는 4.6의 차트 컴포넌트에 약간의 버그가 있고 4.7에서는 해결되기를 기대해 봅니다. 특히 4.7은 스레드 개념을 지원함으로써 더욱 유연한 개발이 가능할 것으로 기대됩니다. 이 스레드 개념은 HTML5의 Worker 기능에서 많은 힌트를 얻어 이번에 추가한 기능이 아닌가 싶습니다. 여튼………

어떤 데이터가 있다면.. 동일한 값을 가지는 녀석들을 묶는데.. 이렇게 1차적으로 묶인 녀석들에 대해서 또 한번 다른 필드의 동일한 값으로 또 묶어 그룹핑하는데 요긴하게 사용한 클래스입니다. 이 클래스의 존재를 모른체 직접 코드를 한땀.. 한땀.. 땀 한방울.. 땀 두방울 흘리며 코딩했답니다. 물론 지금은 이 클래스를 이용해 기능 개발을 했구요.

var grouping:GroupingCollection2 = new GroupingCollection2();
grouping.source = new ArrayCollection(rows);
grouping.grouping = new Grouping();
grouping.grouping.fields = 
    [ new GroupingField("FIELD1"), new GroupingField("FIELD2") ];
grouping.refresh();

성의없이.. 막 코드로 시작합니다. rows가 그룹핑할 배열(Array)입니다. 이 배열의 요소는 FIELD1과 FIELD2라는 이름의 속성값이 있습니다. 일단 FIELD1에 대해 동일한 요소들을 한번 묶고.. 다시 이렇게 묶인 그룹들을 대상으로 FIELD2로 또 한번 묶습니다.

결과적으로 그룹핑된 컬렉션은 grouping 객체(위의 코드 참조)의 getRoot 매서드를 통해 얻습니다. getRoot()의 결과에 대한 클래스 타입은, 배열을 대상으로 그룹핑 했으므로 ArrayCollection 타입입니다.

그룹핑되기 이전에는 단순한 1차원 배열이였던 것이 GroupingCollection2 클래스를 통해 그룹핑되면 3차원 배열이 됩니다. 이 3차원으로 재가공된 배열(실제로는 ArrayCollection 클래스 타입)의 원소들을 하나 하나 참조해야할 때가 있습니다. 설명하기엔 무척….. 염병같고……………. 걍 코드.. 예제 코드 나갑니다. ;-|

var groupingRows:ArrayCollection = grouping.getRoot() as ArrayCollection;
var driverNameAndCarNumber:Object = new Object();
for(i=0; i{
    var D1:Object = groupingRows.getItemAt(i);
    D1["iconIndex"] = 0;
     
    var carName:String = D1.GroupLabel;
    var D2:ArrayCollection = D1.children as ArrayCollection; 

    for(var j:int=0; j    {
        var item:Object = D2.getItemAt(j);
        var driverName:String = item.GroupLabel;
        item["iconIndex"] = 1;
      
        var D3:ArrayCollection = item.children as ArrayCollection;
        for(var k:int=0; k        {
            var lastItem:Object = D3.getItemAt(k);
            lastItem["iconIndex"] = 2;
        }
      
        var sortField:SortField = new SortField();
        sortField.name = "GroupLabel";
        var sort:Sort = new Sort();
        sort.fields = [sortField];
        D3.sort = sort;
        D3.refresh();
    }
}

이 코드는 그룹핑된 내부의 요소드를 또 다시 정렬해줌과 동시에 아이콘 적용을 위해 아이콘 인덱스 번호를 넣어주는 코드입니다. 시간이 지난후에 이 코드를 보고 제 스스로 이해할 수 있다면… 과연 그럴 수 있을까.. 싶습니다.,

[ActionScript] 날짜로 요일 계산하기

아래의 getDay 함수는 액션스크립트로 구성된 요일을 계산해 반환하는 함수입니다. 이 getDay 함수의 파라메터는 날짜로써 년(예:2012), 월(1 ~ 12), 일(1 ~ 31)입니다.

private function getDay(year:int, month:int, day:int):String
{
    const dayStrings:Object = {
        0:"일요일",
        1:"월요일",
        2:"화요일",
        3:"수요일",
        4:"목요일",
        5:"금요일",
        6:"토요일"
    };
    
    if (month == 1 || month == 2) year--;
    month = (month + 9) % 12 + 1;
    var y:int = year % 100;
    var century:int = year / 100;
    var week:int = ((13 * month - 1) / 5 
        + day + y + y / 4 + century / 4 - 2 * century) % 7;
    if (week < 0) week = (week + 7) % 7;

    return dayStrings[week];
}

이처럼 날짜로부터 요일을 계산하는 함수를 직접 작성해 사용할 수 있지만 다음처럼 액션스크립트에서 이미 제공하고 있는 Date 클래스를 사용해 보다 간단히 요일을 계산할 수 있습니다.

 const dayStrings:Object = {
        0:"일요일",
        1:"월요일",
        2:"화요일",
        3:"수요일",
        4:"목요일",
        5:"금요일",
        6:"토요일"
    };
     
    var d:Date = new Date(2012, 10-1, 4);
    Alert.show(dayStrings[d.day]);

여기서 주의해야할 점은 월(Month)은 1부터 시작하지 않고 0부터 시작한다는 것입니다. 그래서 11번 코드에서 지정한 (10-1)은 9월이 아니라 10월을 의미합니다.

좌표계 변환 OpenAPI

좌표계 변환을 위한 OpenAPI입니다. 변환하고자 하는 좌표에 대해 WKT 형태의 포인트, 폴리라인, 폴리곤 형식으로 지정할 수 있고 변환된 좌표 결과도 WKT로 받을 수 있음으로 매우 다양한 형태로 활용될 수 있습니다. 간단하게 하나의 WGS84 경위도 좌표계 (127, 37)을 카텍(Katech) 좌표계로 변환하기 위한 OpenAPI 호출 형태는 다음과 같습니다.

사용자 삽입 이미지

간단한 URL 호출형태의 OpenAPI로써 사용된 인자값들은 다음과 같습니다.

사용자 삽입 이미지
변환될 좌표계를 지정하는 방식이 WKT라는 형식입니다. WKT에 대한 설명을 위해 폴리곤, 폴리라인, 포인트 들에 대한 간단한 예를 통해 설명하면 다음과 같습니다.

먼저 하나의 좌표를 지정할 수 있는 WKT 형태의 포인트의 예입니다. 하나의 좌표로 표현되는 포인트에 대한 WKT는 POINT 문자열로 시작합니다.

사용자 삽입 이미지
다음은 여러 개의 좌표들로 구성된 폴리라인에 대한 WKT 형태의 예입니다. 폴리라인에 대한 WKT는 선분(LINE)의 연속(STRING)이라는 의미로 LINESTRING 문자열 값으로 시작합니다.

사용자 삽입 이미지
그리고 여러 개의 좌표들로 구성된 폴리곤에 대한 WKT 형태의 예입니다. 폴리곤의 WKT는 POLYGON 문자열 값으로 시작합니다.

사용자 삽입 이미지
그리고 다음은 구멍(Hole)이 있는 폴리곤에 대한 WKT 형태의 예입니다. 위의 경우처럼 POLYGON 문자열로 시작합니다. 구멍(Hole)을 나타내는 폴리곤은 여러개가 올 수 있지만 구멍이 아닌 외곽을 나타내는 폴리곤은 하나만 올 수 있습니다.

사용자 삽입 이미지
이 좌표 변환 OpenAPI 서비스는 지오서비스 사에서 제공하고 있습니다. 학술/연구 그리고 상업적인 용도에 대해서 자유롭게 사용할 수 있습니다. 향후 더욱 다양한 좌표계를 지원할 예정입니다. 사용상의 개선점과 문제점에 대해서는 연락 또는 메일 주시면 검토 후 적극 반영토록 하겠습니다.

시간을 측정하는 ‘시계’, 나의 유일한 악세사리

나의 유일한 악세사리는 시계다. 핸드폰을 늘 손에 가지고 다니므로 실용성면에서 굳이 시계가 필요치 않지만.. 중요한 의미의 심벌(Symbol)로써 시계는 나에게 중요한 의미를 부여한다.

사용자 삽입 이미지
얼마전만 하더라도, 나는 하고자 하는 일에 대해서 정해진 기간안에 마무리하는 것에 대한 강박증이라는 매우 좋은 “습관”을 가지고 있었다. 그러다가 명확하지 않은 요구사항을 가진, 지지부진하게 진행되는 프로젝트를 진행하면서 이 습관에서 나는 서서히 멀어지고 있다.

이제는 다시, 하고자 하는 일에 대해서 정해진 기간안에 마무리하려는 내 의지를 다시 다져 잡고자 한다. 처음 이 시계를 손목에 차며 가졌던 초심의 마음을 다시 세긴다.

바로 이것만이 내가 원하는 바를 이룰 수 있는 가장 처음 채워야할, “첫단추”이다.