이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다. 저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나 토론을 할 수도 있습니다.
문자열 이야기 두 번째 입니다. 이번 글도 마찬가지로 딴지 스타일로 적어봤습니다. 머 완전한 딴지 스타일은 아니고... 세미 딴지 정도? 약간 얌전하게... 역시 기술 자료를 딱딱하지 않게 쓴다는 것이 힘들군요. 쫌더 딴지 스타일에 가깝게 쓰면 몰라도 세미 딴지 스타일은 좀 힘들다는...

Story about StringBuilder - (II)

앞서 문자열 이야기 포스트에서 StringBuilder에 대해 간략한 설명을 해보았다. 이번엔 좀더 꽁꼬 깊숙히 StringBuilder의 내부를 살펴보도록 하자.

Inside StringBuilder

StringBuilder가 생성되면 디폴트로 16문자를 담을 내부 문자열 버퍼를 생성한다. 요것이 오늘의 중요한 뽀인또가 되것다. 연속되는 Append 호출이 발생하여 문자열이 16문자를 초과하게 되면 2배인 32 문자를, 그 후에 또 버퍼가 초과되면 64, 128, 256, 512, ... 이런식으로 계속 새로운 버퍼를 할당한다. 새로운 버퍼를 할당하는 것 외에도 좆지(험험) 못한 것은 기존 버퍼의 내용을 새 버퍼로 복사해야 한다는 것이다. 그리고 나서 기존 문자열 버퍼는 어떻게 하냐고? 그걸 나한테 물으면 어떡하나? GC(Gargabe Collection)에게 물어봐야지.

오늘의 또 한가지 뽀인또는 StringBuilder.ToString() 메쏘드다. StringBuilder를 통해 기껏 문자열을 만들어 대면 뭐하나? 정작 필요한 것은 문자열, 즉 System.String 타입인걸... 그래서 항상 우린 StringBuilder.ToString()을 호출하여 문자열을 받아 낸다. StringBuilder.ToString 메쏘드는 새로운 문자열을 할당하고 내부 문자열 버퍼의 내용을 이 새로운 문자열에 복사하여 반환한다. StringBuilder.ToString이 새로운 문자열을 할당하는 것을 주목할 필요가 있겠다. 만약 새로운 문자열을 만들어 반환하지 않고 StringBuilder의 내부 문자열을 그대로 반환한다면, 하나의 문자열에 대해 2개 이상의 참조(reference)가 존재하게 된다. 만약 StringBuilder 가 재사용되어 변경이 가해지면 문제가 발생하게 될 것이다. ToString() 이 호출된 후, StringBuilder는 버퍼를 초기화 하여 StringBuilder가 재사용될 수 있도록 만드는 것 역시 알아두면 피가되고 살이되는 지식이다. 이쯤 되면 펜을 들고 메모할 필요를 느끼지 않는가?

StringBuilder의 내부를 까보면 생각보다 간단하지 않다는 것을 알 수 있다. 크기가 자동으로 증가되어야 하므로 StringBuilder는 내부 문자열 버퍼가 넘치는 것을 막기 위해 할당된 내부 문자열 버퍼의 크기를 유지하며 또한 이 내부 버퍼에 기록된 문자의 개수 역시 유지해야 하는 등의 오버헤드를 갖고 있다. StringBuilder는 빠르지 않다. StringBuilder에 대한 다양한 성능 테스트(난중에 성능 테스트 자료를 올리겠다. 지금 성능 테스트 자료까지 올리면 블로그 하나가 너무 빡세지기 때문에...)를 살펴보아도 StringBuilder의 오버헤드가 적지 않다는 것을 알 수 있다.

StringBuilder Usage

StringBuilder를 쓰지 말라고 ? 전혀 쓰지 말라는 얘기가 아니다. StringBuilder를 쓸때와 그렇지 않을 때를 명확히 구분하는 것이 좋다는 얘기이다. 이쯤 되면 독자제위들은 어떤 때 StringBuilder를 쓰지 말아야 하는가를 말할 것이라고 예상할 것이다. 반대로 StringBuilder를 사용해야 하는 때는 필자 생각에는 그다지 많지 않다. 대부분의 경우 String.Concat 이나 C#, VB.NET의 + 연산자를 쓰는 것이 더 효율적이며, 반복적으로 다수(수십 ~ 수백회) 문자열을 연결하는 경우에나 StringBuilder를 사용하는 것이 좋다. StringBuilder를 사용하지 않을 때 사용할 문자열 연산 방법은 쪼금 있다 설명하기로 하고 여기서는 StringBuilder의 올바른 용법에 대해서 살펴보자.

StringBuilder를 쓸 때는 가급적 버퍼 크기를 명시하는 것이 좋다. 즉 달랑 디폴트 생성자로 StringBuilder를 생성하지 말고 생성자에 버퍼 크기를 주라는 것이다. 버퍼 크기는 대략적으로 예상되는 크기를 적어주면 되겠다. 그렇다고 무조건 겐또로 찍는 것도 곤란하지만 대략적으로 크기를 알 수 있을 것이다. 전혀 모르겠으면 넉넉하게 크게 잡아줘라. 잘모르겠다고 ? 다음 코드를 보자.

// 좋지 못한 StringBuilder 사용법
StringBuilder sb = new StringBuilder();    // 16 문자 버퍼(문자열)를 생성
sb.Append("1234567890");
sb.Append("1234567890");    // 버퍼가 부족하므로 32 문자를 담을 새로운 버퍼를 생성하고 기존 버퍼 내용을 복사한다.
sb.Append("1234567890");
sb.Append("1234567890");    // 버퍼가 또 부족하므로 64 문자를 담을 새로운 버퍼를 생성하고 기존 버퍼 내용을 복사한다.
string s = sb.ToString();   // 새로운 문자열을 만들어서 내부 버퍼의 내용을 복사하고 반환한다.

위 코드는 4개의 문자열이 StringBuilder와 관련되어 생성되고 사용되며 이중 2개는 아주 짧은 시간 동안만 사용되고 버려진다. 반면 다음 코드는 2개의 문자열만이 사용된다.

// 그나마 나은 StringBuilder 사용법
StringBuilder sb = new StringBuilder(64);    // 64 문자 버퍼(문자열)를 생성
sb.Append("1234567890");
sb.Append("1234567890");
sb.Append("1234567890");
sb.Append("1234567890");    // 버퍼가 충분하므로 새로운 내부 버퍼를 요구하지 않는다.
string s = sb.ToString();   // 새로운 문자열을 만들어서 내부 버퍼의 내용을 복사하고 반환한다.

이 예제에서는 최종적인 문자열 크기를 알기 때문에 64라는 capacity 값을 줄 수 있었지만 최종적인 크기를 전혀 알 수 없다면 넉넉하게 capacity 값을 주는 것이 좋다. 항상 이런 말을 하면 걱정되는 것이 무식하게 딥따 큰 capacity를 주는 인간들이다. 이런 단순 무식은 명랑한 프로그래밍 문화에 아무런 도움이 못 된다. 적당히 넉넉히 주면 StringBuilder가 알아서 그 크기를 2배씩 키워 줄 것이다. 초기 값이 작으면 작을 수록 반복적으로 임시 문자열이 만들어졌다가 사라지므로 이것을 방지해 보자는 것이다.

잠시 후 알게 되겠지만 위의 두 예제 코드는 모두 삽질이 되겠다.... -_- 위와 같이 간단한 문자열 연결(concatenate)은 StringBuilder를 쓰는 것이 더 비효율적일 뿐더러, 위 예제와 같이 문자열 상수(유식하게는 문자열 리터럴 이라구도 한다)를 연결할 때는 더더욱 그렇다. StringBuilder는 커다란 문자열 버퍼에 반복적으로 수십, 수백 회의 문자열 연결하는 때가 아니라면 사용할 일이 별로 없다고 보문 되긋다. 특히 for, while, foreach 류의 반복문 안에서는 StringBuilder를 쓰는 것이 좋다. 그런 때가 언제냐고? ASP.NET에서 HTML을 말 그대로 '만들어'낼 때는 반복적으로 문자열은 연결해야 하는 경우가 마니 생긴다. 안 해봤다고? 그럼 지금이라도 메뉴 웹 컨트롤을 만들어 보라...

Comments (read-only)
#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 아 이해 할 수가 없다. / 2007-10-09 오전 4:59:00
StringBuilder sb = new StringBuilder(); 
StringBuilder sb2 = new StringBuilder(); 

sb2 = sb; 
sb.Append("1234567890"); 
Console.WriteLine("{0}", object.ReferenceEquals(sb, sb2)); 

sb.Append("1234567890"); 
Console.WriteLine("{0}", object.ReferenceEquals(sb, sb2)); 

sb.Append("1234567890"); 
Console.WriteLine("{0}", object.ReferenceEquals(sb, sb2)); 

위와 같이 코딩을 해봤습니다. 
두번째와 이후는 16글짜가 넘었기 때문에 새로운 메모리를 생성하여 서로 다른 주소가 나올것이라고 생각했습니다. 
헌데 True가 나옵니다... 
실행시 오브젝트의 주소를 알수 있는방법이 있나요? 그것을 몰라서 object.ReferenceEquals를 이용하여 object의 주소를 비교해 보았습니다.
#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 블로그쥔장 / 2007-10-09 오후 2:15:00
-_-; StringBuilder는 참조형 타입(reference type)으로써 객체 입니다. 
sb2 = sb; 
이 코드가 수행됨으로써 sb 와 sb2는 동일한 StringBuilder 객체를 참조하게 됩니다. 
따라서 sb에 벼라별 생 SHOW를 해도 sb와 sb2는 동일한 StringBuilder 객체를 가르키고 
항상 ReferenceEquals가 같다는 것이지요. 
참조형 변수에서 할당 연산자(assignment operator)는 참조값(객체 주소)을 복사하는 것이지 
객체 자체를 복사하는 것이 아님을 이해하셔야 합니다.
#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 크레이그진 / 2007-11-23 오후 10:38:00
좋은글 잘 읽었습니다. 그런데 내용중 다음 부분에서 잘 이해가 되지 않습니다. 

ToString() 이 호출된 후, StringBuilder는 버퍼를 초기화 하여 StringBuilder가 재사용될 수 있도록 만드는 것 역시 알아두면 피가되고 살이되는 지식이다. 이쯤 되면 펜을 들고 메모할 필요를 느끼지 않는가? 

ToString()가 최초 호출된후 StringBuilder 버퍼가 재사용될수있도록 만드는것 이것이 무슨말씀이신지 이해가 안됩니다. StringBuilder의 내부버퍼를 초기화한다는 말씀이신지요. 
#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 블로그쥔장 / 2007-11-25 오후 12:30:00
ToString() 호출 이후 내부적으로 Null 문자를 추가하고 쓰레드 관련 내부 필드를 초기화하는 등의 
작업을 수행합니다. 특별히 버퍼를 지워버린다거나 하는 작업은 아니므로 
그렇게 크게 신경써야할 부분은 아닙니다만... 
보다 중요한 것은 ToString() 호출이 새로운 문자열을 만들어 StringBuilder 내의 문자열을 
복사한다는 점입니다.
#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 크레이그진 / 2007-11-27 오후 2:18:00
아 감사합니다. 요즘 닷넷의 세계에 빠지려는 중생인데 많이 배우고갑니다. 
항상 Under Hood 한 곳을 알아갈때의 재미는 정말 쏠쏠하지요. 닷넷계의 Matt Pietrek 이 되시길~ ^^ 
그리고 닷넷에서 리버싱도 조회가 깊으신것 같은데 다 보여주진 못하셔도 약간의 흰트글들을 올려주시면 정말 감사하겠습니다. 
바라는것만 많아서 정말 죄송하구요. 좋은글들 적으시는데 다시한번 감사드립니다. ^^
#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 조승태 / 2008-02-22 오후 5:28:00
앞글에서 저는 그냥 string만 쓴다고 했는데,,, 
무식한게 덕이 되고 말았군요. ^^; 

#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 이시택 / 2008-06-11 오전 4:59:00
뉴욕에서 인턴쉽 하고 잇는 학생인데요 

비베 닷넷 개발 팀이거든요 ~ 호호호 많은 더욱 되었네용 ㅎ 

#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 이시택 / 2008-06-11 오전 4:59:00
뉴욕에서 인턴쉽 하고 잇는 학생인데요 

비베 닷넷 개발 팀이거든요 ~ 호호호 많은 더욱 되었네용 ㅎ 

#re: 문자열 이야기 (2) - StringBuilder에 대한 진실 혹은 거짓말 (II) / 강윤태 / 2009-07-05 오후 10:35:00
안녕하세요 자바를 공부하다가 코드에서 StringBuilder 부분이 나와서 찾아보던중 들렀는데요. 
ToString을 하면 StringBuilder의 버퍼에 있는 스트링을 복사해준다는 것이 맞나요? 

그런다음 초기화하라는 말씀은.. 버퍼를 지우는게 아니라 NULL문자만 추가한다는게.. 초기화란 말이랑 잘 이해가 안갑니다 ㅠㅠ


출처 - http://www.simpleisbest.net/archive/2005/05/17/149.aspx


===================================================================================


Q. 문자열을 합치는 방법인 StringBuffer, String + String, concat 의 성능을 비교한다.



※ 소스


String + String

for( int j = 0; j < 10; j++ )

{

String str = "";

start = System.nanoTime();

for( int i = 0; i < 10000; i++ )

str += String.valueOf( i );

end = System.nanoTime();

System.out.println( ( end - start ) + "(ns)" );

}

StringBuffer

for( int j = 0; j < 10; j++ )

{

StringBuffer strBuf = new StringBuffer();

start = System.nanoTime();

for( int i = 0; i < 10000; i++ )

strBuf.append( String.valueOf( i ) );

end = System.nanoTime();

System.out.println( ( end - start ) + "(ns)" );

}

concat

for( int j = 0; j < 10; j++ )

{

String str = "";

start = System.nanoTime();

for( int i = 0; i < 10000; i++ )

str = str.concat( String.valueOf( i ) );

end = System.nanoTime();

System.out.println( ( end - start ) + "(ns)" );

}




※ 결론


String + String

StringBuffer

concat 

219381486(ns)

211511302(ns)

207293854(ns)

210680966(ns)

208196763(ns)

208814199(ns)

208915404(ns)

203914398(ns) -> BAD

205495126(ns)

206599593(ns)

3971662(ns)

1469033(ns)

1302910(ns)

1094546(ns)

1116375(ns)

2104329(ns)

832036(ns) -> BEST

843092(ns)

840541(ns)

865488(ns)

110126748(ns)

103956922(ns)

102395471(ns)

103247069(ns)

102242388(ns)

101415170(ns) -> BAD

105201432(ns)

103828218(ns)

104164435(ns)

103972796(ns)



음.. 결과적으로는 StringBuffer, concat, String + String 순으로 빨랐다.


예상외로 StringBuffer 가 빠르다.



+ 추가(2012.05.08)


아래와 같은 String + String 의 경우 


System.out.println("x:"+x+" y:"+y);


컴파일러는 위 부분을 StringBuilder() 라는 객체 변환하여 실행한다.


System.out.println((new StringBuilder()).append("x:").append(x).append(" y:").append(y).toString());





String 은 Char[] 을 가지고 표현된다.


String 은 특성상 주소를 참조하지 않고 값을 복사하여 가지고 있는다.

(String 의 주소를 참조하여 값을 바꾸지 못하게 하기 위함)


String + String 을 하게 되면,


첫번째, 두번째 String 은 복사가 될 또다른 new String 으로 생성하여 복사하게 된다.


그러므로 String + String 복사시마다 새로운 String 객체가 생성된다고 보면 된다.





그에 비해 StringBuffer 는 최초 생성된 StringBuffer 에 계속되어 append 가 되기 때문에,


객체 생성이 줄어 속도와 리소스 면에서 우위에 있다.




참조 : http://ralf79.tistory.com/89

참조 : http://kaioa.com/node/59


출처 - http://blog.naver.com/PostView.nhn?blogId=kiho0530&logNo=150135830348


===================================================================================


String 은 Charecter Line을 나타낸다. Character Line 객체는 변형되지 않기 때문에 공통으로 사용할 수 있다.

그 값을 바꾸기 위해서는 필요에 따라 대입을 시켜줘야 한다.

StringBuffer는 Thread를 사용할 수 있는 변형이 가능한 캐릭터라인이다. 
예를 들어,
 StringBuffer z = "start";
라고 한 경우, 
z.append("le")라고 하면 z의 내용은 "startle"가 되며, z.insert(4,"le")라고 하면 z의 내용은 starlet가 된다.

두 클래스 다 직렬화(Serializable)를 지원하는구나. ㅡㅅ-);;

참고 : http://hongsgo.egloos.com/2033998 요 글을 보면, String < StringBuffer < StringBuilder 속도 차이가 있다. 흠... String은 적게 쓰는게 좋군요. ㅡㅅ-);;

참고 : http://cacky.tistory.com/36

  • String : 변경되지 않는 Character 문자열 객체
    문자열이 변경되지 않을 경우에는 String 사용
  • StringBuffer : 값이 변경 가능 // 동기화 가능 : 다중 스레드 일 경우에 사용
    문자열이 변경되고 다중 스레드에서 사용될 경우 사용
  • StringBuilder : 값이 변경 가능 // 동기화 되지 않음 : 단일 스레드일 경우에 사용
    문자열이 변경되고, 단일 스레드에서 사용될 경우 사용


출처 - http://java.ihoney.pe.kr/75


===================================================================================


자바 문자열 객체(String,StringBuffer,StringBuilder) 정규표현식..

내가 만든 코드를 튜닝(?)해 나가면서 가장 신경쓰이는 부분이
자주 쓰는 문자열과 관련된 객체의 자원이다.
문자열에 대해서 변경이 잦다면 String이 아니라 StringBuffer나 StringBuilder를 써야 할 것이다.
보통 StringBuffer는 알지만 StringBuilder는 .NET에만 있는 객체라고 잘못 알고 있는 사람이 많다.
하지만, 엄연히 자바에도 StringBuilder 객체가 있으며 문자열을 다루는 이 세가지 객체의 차이는 
크게 연산속도와 메모리 공간으로 볼 수 있다.
과연 어떤 특징이 있는지, 동일한 연산을 반복하고, 최종적으로 String 객체로 리턴 해서 비교해보자.

연산속도 : String 95초 , StringBuffer 0.24초 StringBuilder 0.17초
메모리 용량 : String 약 95GB , StringBuffer 약 28MB,9.5MB(String으로변환), StringBuilder 약 28MB,9.5MB(String으로변환)

정리 응답시간은 String보다 StringBuffer가 약 367배 빠르며, StringBuilder가 약 512배 빠르다. 메모리 용량은 StringBuffer와 StringBuilder보다 String이 약 3,390배 더 사용한다.

*여기서 잠깐.. 이글루스는 표만드는 기능도 없냐(내가 만들고 있는 사이트에는 있는데.. 음화화화)

여튼,

그럼 어떨때 String,StringBuffer,StringBuilder를 사용해야 할까?

 

  • String은 짧은 문자열을 더할 경우 사용한다.
  • StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다.
  • StringBuilder는 스레드에 안전한지 여부가 전혀 관계없는 프로그램을 개발 할 때 사용하면 좋다.

(와 문단 형식 다르게 잡았는데 실제론 안나타난다. 이글루스 개발 포기했나 이거뭥미 ㅜ.ㅜ)

* 버젼에 따라 다른 차이

개발자가 String객체를 사용하더라도 WAS가 JDK 5.0 이상의 버젼을 사용한다면 결과가 약간 달라진다.
왜냐하면 코드상에서 String객체를 사용하여 연산하였더라도 WAS에 탑재된 JDK가 컴파일시 StringBuilder로 변환하여 컴파일 하기 때문이다.

정규표현식과 문자열 객체,
퍼포먼스 측면이나 메모리 관리 측면에서 String 객체를 많이 안만들고 싶었으나
현실적으로 String객체에서 제공해주는 메서드가 막강하기 때문에 자주 쓰게 된다.
따라서, 어떻게하면 보다 더 적은 String객체를 사용할 수 있게 비즈니스 로직을 설계 하는것이 중요한 요소라고 생각한다.
그 해답 가운데 한가지가 정규표현식이라고 생각한다. 자바 String객체에 replaceAll이라는 메서드에 일반적인 문자열이 아닌
정규표현식을 사용하여 한번에 원하는 문자열을 탐색하거나 지우는것이 좋은 해답이라고 생각한다.


출처 - http://hongsgo.egloos.com/2033998


===================================================================================




















Posted by linuxism
,


WGS84와 GRS80의 차이

간단히 말씀을 드리면 동경좌표계는 우리나라가 일제강점기에 만들어진 좌표계로 현재 사용되고 있는 GPS용 세계지도좌표계가 만들어지기 이전에 것을 그대로 사용하는 것이고, WGS-84의 경우는 미국에서 군사용으로 GPS 시스템를 이용하면서 만든 좌표계입니다.

 

지도제작을 하기 위해서는 지구를 일정한 기준하에 두어야 하는데, 정확히 지구는 완벽한 원형이거나 완벽한 타원형이 아닙니다.  실제로는 아주 불규칙적으로 울퉁불퉁한 표면을 가지고 있는데 이를 수학적으로 완벽히 구현하기에는 많은 무리가 따릅니다. 따라서 수학적으로 쉽게 계산하기 위해서 여러학자들은 여러가지 방법에 의해 지구와 유사한 타원체(지오이드, Geoid)를 만들게 되었습니다.
하지만 지구가 일률적으로 요철을 가지고 있는 것이 아니라서 각각의 계산방법(중력에 기원하여) 타원체(지오이드, Geoid)를 채용하게 됩니다.
이 타원체를 지오이드(Geoid)라고 합니다.

통상 지도의 대부분의 좌표체계의 차이는 이 지오이드(Geoid)를 어떤 방법으로 정하는지에서부터 출발합니다.

 

예를 들면 현재 우리나라는 1841년에 만들어진 베셀(Bessel)타원체(동경좌표계, Tokyo Datum)을 사용하며 요즘 많이 사용되는 GPS는 미 국방성이 1984년에 채택한 GPS용 타원체(WGS84의 기준이 되는 타원체)를 사용하고 있습니다.

그리고 이 타원체는 삼차원 좌표나 경위도 좌표등으로 좌표를 나타내게 됩니다.
하지만 이는 타원체상에서 3차원 좌표(곡면)이므로 우리가 보는 2차원 지도상의 좌표(평면)과는 틀리게 됩니다.

그래서 평면과 곡면이므로, 이 타원체상의 좌표들을 평면으로 나타내기 위해 또다시 투영이라는 것을 거치게 됩니다. 이 투영에서 또다시 여러 지도체계가 세분화됩니다.


투영법(도법)이라고 불리는 이 방법들에도 각 나라와 사용용도에 따라 도법들이 매우 많습니다.

예를 들면 앞서말한 우리나라가 사용하는 베셀타원체의 투영법은 TM도법을 사용합니다.

따라서 베셀타원체를 TM좌표 또는 TM도법이라고 합니다.

그리고 WGS84타원체의 경우는 UTM도법을 사용하여 투영합니다.

UTM도 TM과 같은 방법으로 투영계산을 거치지만 그 상수가 다를 뿐입니다.

 

현재 우리나라는 TM(Bessel 타원체, Tokyo Datum)과 UTM(WGS84, GPS용 좌표계)를 모두 사용하고 있습니다. 그래서 TM과 UTM을 간략히 비교를 하면...

 

1. TM(Transverse Meractor) - 횡단원통등각투영법

우리나라의 경우 평면직각 좌표계인 TM(Transverse Meractor) 좌표계를 국가기본도의 기본체계로 하고 있으며, 군사지도의 경우 부분적으로 UTM(Universal Transverse Mercator) 좌표계를 사용하고 있습니다.
국가기본도의 경우 Bessel 1841 타원체를 기본타원체로 적용하고 있고, 좌표의 수평 기준원점은 경도 방향의 위치에 따라 124도, 126도, 128도 경도선을 기준으로 서부, 중부, 동부원점의 3가지를 혼용하고 있습니다.

고도 기준원점의 경우 검조장에서 다년간 조석 관측한 결과를 평균조정한 평균해수면(MSL, Mean sea level)을 사용하고 있는데, 이 평균해수면은 일종의 가상면으로 수준 측량에 직접 사용할 수 없으므로 그 위치를 지상에 연결하여 영구 표석을 설치한 후 수준원점(OBM, Original bench mark)으로 삼고 이것으로부터 전국의 주요 국도를 따라 수준망을 형성하였습니다. 현재 사용하고 있는 우리나라의 수준원점은 인하공업전문대학 교정 내에 설치되어 있으며, 인천만의 평균 해면상으로부터 26.6871m 위에 존재합니다.
아래표에서 우리나라 국가기본 좌표체계에 대한 구성요소들을 정리하여 나타내었습니다.

 

 


TM 좌표계는 지도상에 표시된 숫자와 숫자간격이 1,000 m 이며 좌표계에서 표현하는 숫자는 1단위가 1m 이므로 도분초 방식보다 훨씬 쉽게 이해하실 수 있습니다.
 
TM 좌표계의 측정 원점은 북위 38도 동경 125도 , 북위 38도 동경127도 , 38도 동경129도 세지점을 원점으로 계산을 하고 있습니다.
 
예를 들어, 천왕봉의 경우를 보면 중부원점으로 부터 동쪽으로 (266396m-200,000- 66,396m) , 북위 38도선으로 부터 남쪽으로 (500,000 - 204410 = 295,590m) 떨어져 있다고 이해하시면 됩니다.

 

2. UTM 좌표계 (Universal Transverse Mercator)

지리좌표는 넓은 지역의 좌표 체계로서 적합합니다. 

지리좌표는 거리와 방위를 도, 분, 초 단위로 측정하는 데 초 단위까지 측정하는 경우는 흔치 않으며 그 계산도 번거롭기 때문입니다. 따라서 아주 좁은 지역에서의 위치 표현 방법으로서는 적합하지 못하므로 이를 보완하기 위해 고안된 것이 직각 좌표계입니다.

직각 좌표는 평면 위에 임의의 점을 시발점으로 하여 그 점으로부터 XY 축으로 수직, 수평선을 긋고 각 축에 평행하게 격자망을 구성합니다. 선 간의 간격은 요구되는 정밀도에 따라 임의로 지정하며, 어떤 지점의 위치는 시발점으로 하여 XY축의 값으로 나타냅니다. 어떤 지점의 평면 좌표를 읽을 때에는 동으로 X, 북으로 Y와 같이 X값을 먼저 읽습니다.

이와 같은 직각 좌표계 중에서 전 지구적으로 사용할 수 있도록 정의된 것이 바로 UTM 좌표계입니다. UTM 좌표계는 횡단 Mercator 투영법을 사용하는 좌표계 중의 하나로서 전 세계를 경도 6° 간격의 영역으로 나누고, 이들 각각의 영역에 대해 별도의 원점과 축을 지정하여 좌표를 Meter 단위로 나타내는 것입니다. 이들 UTM Zone 번호는 서경 180°를 기준으로 경도 6°간격씩 동쪽으로 이동하며 순차적으로 증가합니다.

UTM 좌표계에서 기준 원점의 위치는 각 UTM Zone의 중심경도선과 적도가 만나는 위치이며, 이 점을 기준으로 경도 방향을 X축, 위도 방향을 Y축으로 설정합니다. 우리나라의 경우 52번째 Zone에 위치하며, 이 지역의 기준 원점인 경도 129°, 위도 0°를 UTM 좌표계의 원점으로 사용합니다.

UTM 좌표계와 같이 Meter 단위의 좌표를 사용하는 경우 기준원점의 위치에 따라 음의 부호를 갖는 좌표가 나타나게 되는데 일반적으로 이러한 현상을 없애기 위해 각 축의 방향으로 가상의 좌표를 더해 주게 됩니다. UTM 좌표계의 경우 X축으로 500,000m의 값을 더하여 실제 좌표를 나타내며, Y축 방향으로는 남반구의 경우에 한해 10,000,000m의 값을 더해 주게 됩니다.

이를 간략하게 정리하면...

 

- 서경 180°를 기준으로 동쪽으로 6° 간격으로 Zone을 지정한다.
- 각 Zone은 경우에 따라 위도 방향으로 8° 간격을 갖는 별도의 영역으로 세분화될 수  있으며, 가장 남쪽부터 C에서 X까지 I, J를 제외한 20개의 Index가 부여된다.
- 각 Zone은 중앙자오선을 가지고 있으며, 이 선과 적도와의 교차점을 각 Zone의 좌표 원점으로 사용한다.
-  Easting(E)은 중앙자오선으로부터 측정하며, "+"의 값을 갖기 위하여 500㎞를 가원점으로 사용한다. 
-  Northing(N)은 적도로부터 측정하며, 적도로부터 남쪽의 위치를 위하여 10,000㎞를 가원점으로 사용한다.
- 남위 80°와 북위 84° 사이에서만 지정되며, 이 이외의 지역에 대해서는 오차의 증가로 인해   UTM 좌표계를 사용하기 어렵다.

 


하지만, 이 모든 것을 이해하기 위해서는 세계측지계(세계에서 공통으로 통용되는 지도좌표계)에 대한 이해가 선행되어야 합니다.

 

아래의 글은 국토지리정보원(구 국립지리원)에서 발췌한 글입니다.

동경좌표계와  WGS-84에 대한 내용은 물론이거니와 ITRF 와 GRS-80에 대해서도 설명을 하고 있습니다.


1. 세계 측지계란 무엇인가?
세계 측지계란, 세계에서 공통에 이용할 수 있는 위치의 기준을 말합니다.
측량의 분야에서는, 지구상에서의 위치를 경위도에서 나타내기 위한 기준이 되는 좌표계 및 지구의 형상을 나타내는 타원체를 총칭해 측지 기준계라고 합니다. 즉, 세계 측지계는 세계 공통이 되는 측지 기준계를 말합니다.
세계 측지계라는 말이 「세계 공통인 것」에 중점을 둔 표기인데 대해, 지구 중심계라는 말은 「좌표계의 원점을 지구 중심점」으로 중점을 둔 표현입니다.
개정된 측량법에서는 세계 측지계를 다음과 같이 정의하고 있습니다.

세계 측지계란, 지구를 편평한 회전 타원체라고 상정해 실시하는 위치측정의 기준으로서 다음 각 호의 요건을 갖춘 것을 말한다.

 

① 회전타원체의 장반경 및 편평율은 다음과 같을 것
   가. 장반경 : 6,378,137미터
   나. 편평율 : 1/298.257222101
② 회전타원체의 중심이 지구의 질량중심과 일치할 것.
③ 단 축이, 지구의 자전축과 일치할 것.

 

지금까지, 각국의 측지 기준계가 측량 기술의 제약등으로부터 역사적으로 주로 자국만을 대상으로 해 구축된 것인데 비해, 세계 측지계는 세계 각국에서 공통으로 이용할 수 있는 것을 목적으로 구축된 것입니다. 세계 측지계에서는 지구를 가장 잘 나타내고 있는 타원체(준거 타원체)로 지구상의 위치(경도, 위도 및 평균 해면으로부터의 높이)를 나타냅니다. 또, 이 대신에 지구 중심을 원점으로 하는 3차원 직교좌표계를 이용해 나타낼 수도 있습니다.

 

세계 측지계인 ITRF2000 좌표계(International Terrestrial Reference Frame:국제 지구 기준 좌표계)와 GRS80(Geodetic Reference System 1980:측지 기준계 1980)의 타원체를 사용해 나타냅니다. 표고에 대해서는, 현재와 같게 인천만 평균 해면을 기준해서 나타냅니다.
세계측지계의 수평 위치의 산출은, 우주 측지 기술을 구사한 VLBI나 GPS를 이용한 GPS상시관측소의 관측치에 근거해, 전국의 삼각점을 새롭게 계산을 실시해 계산합니다.
 
1-2. 세계 측지계는 단일한 것인가?
개념적으로 볼때 세계 측지계는 세계 유일의 것이지만, 국가 마다 채용하는 시기(epoch)와 구축기법 및 구현정확도에 따라 다릅니다. 구축기법에 따라 대표적인 것은 ITRF계, WGS계, PZ계의 3 종류 있습니다.

ITRF계는 우리 나라를 비롯해 많은 국가가 육지부에 채용하고 있습니다. WGS계는 미국방성의 체계로서 주로 선박이 채용하고 있으며, PZ계는 러시아가 채용하고 있습니다.
 
1-3. ITRF계와 WGS84 계는?
ITRF계(International Terrestrial Reference Frame:국제 지구 기준 좌표계)란, IERS(국제 지구 회전 관측 사업)라고 하는 국제적인 학술 기관이 구축하고 있는 3 차원 직교좌표계입니다. 이 좌표계는 지구의 질량중심에 원점을 두고 X축을 그리니지 자오선과 적도와의 교점의 방향으로 Y축을 동경 90도의 방향에 Z축을 북극의 방향으로 공간상의 위치를 X, Y, Z의 숫자의 셋트로 표현합니다.
 
ITRF계는 국제협력으로 구축되고 있으며 고정밀도로서 민간분야에서 구축한 것이므로 개방적입니다. WGS84(World Geodetic System 1984)는 미국이 구축, 유지하고 있는 세계측지계입니다. GPS 는 원래 군사용으로 개발되었기 때문에 WGS 계로 운용되고 있습니다. WGS84는 지금까지 몇 번의 개정을 하여 ITRF계에 접근하고 있고 현재는 거의 동일한 것이라고 말할 수 있습니다. 따라서 ITRF계는 정밀한 WGS84(precise WGS)라고 할 수 있습니다.

개정된 측량법에서는, 위치의 표시에 지구중심 직교좌표를 이용할 수 있는 것이 새롭게 규정되었습니다. 이 지구중심 직교좌표계로서 구체적으로는 2000년에 있어서의 지구 상태에 근거해 규정된 ITRF계의 좌표계인 ITRF2000 좌표계를 사용해 위치를 표시하는 것으로 하고 있습니다. 

 

1-4. GRS80 이란?
GRS80(Geodetic Reference System 1980:측지기준계 1980)는, IAG(International Association of Geodesy:국제측지학협회) 및 IUGG(International Union of Geodesy and Geophysics:국제측지학 및 지구물리학연합)가 1979년에 채택한 것으로, 지구의 형상, 중력 정수, 각속도등 지구의 물리학적인 정수 및 계산식으로부터 됩니다.

GRS80 에서는, 타원체의 형상이나 축의 방향 및 지구 중심을 타원체의 원점으로 정해져 있습니다. 이 타원체를 GRS80 타원체라고 하고, 현재 지구를 가장 잘 나타내고 있는 타원체로서 넓게 이용되고 있습니다. 그러나 GRS80타원체는 좌표계에 관해서는 명확하게 결정되어 있지 않습니다.

WGS84 계에서는 물리정수, WGS84타원체와 좌표계가 모두 정의되어 있습니다. 또한 타원체로서의 GRS80과 WGS84와의 차이는 단반경이 약 0.1mm 다를 뿐이므로 실용적으로 동일한 것으로 취급하여 계산할 수 있습니다.

 

1-5. 한국측지계 2002는 무엇을 의미하는가?
개념적으로 볼때 세계 측지계는 세계 유일의 것이지만, 국가 마다 채용하는 시기(epoch)와 구축기법 및 구현정확도에 따라 다릅니다 따라서 장래 모든 국가에서 세계측지계를 채용할지라도 보다 높은 정확도의 측지기준계가 필요하거나 지각변동이 무시할 수 없을 정도로 누적된 경우에는 각국의 측지기준계를 비교하거나 또는 국가의 측지기준계를 재구축해야 합니다. 이 때문에 측지기준계에서는 구축된 지역과 기준시점마다 다른 명칭이 붙여져 있습니다.

한국측지계2002(Korea Geodetic Datum 2002 : KGD2002)란, 세계측지계 중 우리나라가 구축한 부분의 명칭을 말하며 우리 나라의 측지기준계라는 것과 기준시점을 2002년 1월1일(epoch 2002.0)로 하여 2천년대 초에 구축된 것을 의미합니다.
한국측지계2002에서 경도?위도는 세계측지계인 ITRF2000좌표계와 GRS80타원체를 사용해서 나타냅니다. 세계측지계에 근거한 우리나라의 측지기준점(위성측지기준점, 삼각점)의 성과를 한국측지계2002성과라고 하며 이는 종래의 동경측지계에 근거한 성과와 구별하기 위한 호칭입니다. 한국측지계2002성과의 수평위치는 VLBI나 GPS를 이용한 경위도원점 또는 위성측지기준점을 기준으로 전국의 삼각점에 대하여 새롭게 조정계산을 하여 구했습니다.
한국측지계2002에서 표고는 현재와 같이 인천만 평균해면을 기준으로 나타내므로 변경하지 않습니다.

 

1-6. 동경측지계란?
동경측지계는 우리나라에서 1910년대 토지조사사업에서 지형도와 지적도작성을 위해 채택된 측지계이며 당시 일본의 것을 그대로 연결하여 사용하였고 측량법에 세계측지계가 적용되기 이전까지 사용되고 있던 측지기준계를 말합니다.
동경측지계는 벳셀(BESSEL)타원체를 채택하고 천문관측에 의해 결정된 경위도원점의 값과 원 방위각을 기준으로 구축됐습니다. 그러나 당시의 기술적인 한계 때문에 세계측지계 기준과는 차이가 있습니다. 우리나라에서는 실제로 대삼각본점인 영도와 절영도 삼각점이 원점의 역할을 하였습니다.
 
1-7. 세계 측지계를 도입하는 이유는 무엇인가?

아래의 이유에 의합니다.

가. 가장 큰 장점은 GPS좌표와 지도좌표(측지성과)가 실시간으로 완전히 호환될 수 있다는 점입니다. 즉 GPS 에 의한 WGS84성과와 한국측지계2002 성과는 동일한 것이 됩니다.
나. 세계측지계가 도입되면 현재 GPS항법(1점측위)에서 동경측지계로의 좌표변환이 불필요하게 되어 변환에 따른 정확도 저하와 측지기준계 혼용의 우려가 없어집니다.
다. 최근 몇 년간의 세계측지계로의 변경이 국제적인 흐름입니다. 구체적으로는, 1996년에 미국이 GPS의 민생 이용을 위하여 계속적인 서비스를 표명한 이후 GPS가 본격적으로 보급되기 시작하였고 1998년에 국제수로기구(IHO : International Hydrographic Organization)에서 수로측량의 기준에 관해서는 세계측지계에 근거하는 것으로 정하였기 때문입니다.
라. 각국에서는 지도의 측지기준계를 세계측지계로 변경중에 있고 육지의 지도에서는 호주,영국,일본,뉴질랜드 등 약 50개국이 전환을 시작하거나 했고 최근 그 움직임이 현저합니다.
마. 우리 나라에서도 이러한 국제적인 흐름에 맞추어, 세계 측지계로 이행하는 것입니다. 해도(국립해양조사원)와 군사지도(육군지도창)에서는 이미 세계측지계로 변경한 바 있습니다.
 
1-8. 세계측지계가 도입되면 무엇이 변하는가 ?
국내의 모든 위치에서 현행의 좌표값(경도,위도 등)이 변경됩니다. 따라서 측량분야는 물론이고 그 밖의 분야에서도 지금까지의 방식을 변경 또는 기존의 자료의 정정을 필요로 하는 경우가 생깁니다.
동경측지계가 채용하고 있는 벳셀타원체와 세계측지계에서 채용하고 있는 GRS80타원체는 크기?형상 및 중심의 위치가 다르기 때문에 두 측지계에서 기준점성과의 경도?위도의 변화가 위치에 따라 다르게 발생됩니다. 다른 나라의 경우도 경도?위도의 표시가 변경되었습니다.
 
1-9. 세계측지계가 지도상에 미치는 영향은?
지도상의 물체는 지도종횡선(map grid)을 기준으로 이동량이 발생하며 지도축척에 따라 다르게 나타납니다. 우리나라의 경우에 이동량이 300m 발생한다고 보면 축척 1/500,000에서 0.6mm 축척 1/50,000에서 6mm의 도상이동이 발생됩니다.
경위도의 기준이 나라마다 다른 경우에 측지기준계의 차이에 의한 경도?위도의 차이는 나라에 따라 다소 차이는 있지만 세계지도에 사용된 지도의 축척은 일반적으로 1/1,000만 이하이므로 지도상으로는 경도?위도의 차이는 0.1mm이하로 되어 지도상에 차이가 나타나지 않습니다.

 

1-10. 평면직각좌표는 어떻게 되는가?
경위도에서 직각좌표로의 계산식은 변화가 없고 달라지는 부분은 타원체의 제원이 벳셀타원체에서 GRS80타원체로 바뀌는 것 뿐입니다. 투영(TM투영)을 할 때 동경측지계에서는 4개의 투영원점(동부?중부?서부?동해 원점)이 사용되었고 위도는 북위 38도, 경도는 동경125도, 127도, 129도, 131도가 투영기준이었으며, 세계측지계도 동경125 127 129 131도와 북위 38도를 쓰면 됩니다.

 

1-11. 지오이드고란 무엇인가?
지오이드고란, 지구의 형태를 가장 잘 나타내고 있는 타원체(준거 타원체)로부터 지오이드까지의 높이를 말합니다.
지오이드란, 지구를 물로 덮었다고 가정했을 때의 지구의 형태를 나타내고 있는 측지학, 지구물리학의 용어입니다. 지구를 구성하고 있는 암석의 밀도가 균일하지 않기 때문에, 지오이드는 타원체로보다 다소 울퉁불퉁 합니다 또, 지오이드는, 지구상으로 할 수 있는 몇개의 수준면 가운데, 높이 0 m를 통과하는 수준면이기도 합니다.
우리 나라에서는 인천만의 평균 해수면을 0 m로 해, 표고를 구하고 있습니다.
즉, 지오이드로부터의 높이가 표고가 되는 것입니다.
한국측지계2002에서 표고는 현재와 같이 인천만 평균해면(mean sea level : MSL)을 기준으로 나타내므로 변경이 필요하지 않습니다 그러나 지반침하 등의 경년 변화를 고려한 성과를 재 계산하여 개정하며, 중력보정의 방법이 변경됨에 따라 차이가 발생합니다.

 

1-12. ITRF계는, 향후 변함없는가?
ITRF계는, 항상 최신의 우주 측지 데이터를 사용해 갱신되어 가기 때문에 향후도 정밀도를 상향하는것 같은 변경이 이루어집니다. 그러나, 그 변화량은 매우 작고, 또, 이미 측량에는 충분한 정밀도를 얻을 수 있고 있으므로 실용상은 우리 나라의 측지 기준계를 변경할 필요는 없습니다.
 
1-13. 각 타원체의 크기는 어느 정도 다른 것인가?

 
벳셀(동경측지계)
GRS 80(세계 측지계)
장반경
6377397.155m
6378137.00m
-739.84m
단반경
6356078.963m
6356752.31m
-673.35m

 

덧붙여 타원체로서의 GRS80와 WGS84와의 차이는, 단반경이 약 0.1 mm 다를 뿐입니다.

 

1-14. 동경 측지계의 경도·위도는 잘못되어 있었는가?
동경 측지계와 세계 측지계의 사이의 경도?위도의 차이는, 경도?위도를 결정하기 위한 기준이 옛날과 지금이 다르기 때문에 생긴 것입니다. 이 차이는, 동경 측지계를 구축한 당시의 측량이 나빴기때문에 생긴 것은 아닙니다.

당시의 기술에서는, 지구 전체를 통일적으로 측량하는 것은 기술적으로 불가능하므로 천문 관측을 기본으로 나라 마다 원점의 경도?위도를 정해 그것을 기준으로서 나라 마다 측량을 실시했습니다. 인공위성등을 이용해 지구 전체를 통일적으로 측량할 수가 있게 된 현재는, 세계적으로 통일한 기준, 즉, 세계 측지계에 근거해 경도?위도를 결정할 수가 있게 되었습니다.
 
1-15. GPS의 위치 정밀도는 수m인데, 정확한 측량을 할 수 있는 것인가?
GPS에는, 단독 측위법과 상대 측위법이 있습니다. 카 네비게이션등에 사용하고 있는 것은 단독 측위법으로 정밀도는 수m입니다. 그러나, 측량에서는 상대 측위법을 사용하고 있기 때문에, 오차가 측정 거리의 100만 분의 1 정도가 되는 것 같은 고정밀도를 확보할 수 있습니다.


출처 - http://blog.daum.net/jang387/15888378




Posted by linuxism
,



보 도 자 료

배포 일시

2012. 7. 24(화)

총 12매(본문 4, 붙임 8)

담당

부서

국토지리정보원

공간영상과

담 당 자

과장 강인구, 사무관 백동현, 주무관 김창우

☎ (031)210-2604, 2670, 2671

보 도 일 시

2012년 7월 25일(수) 석간부터 보도하여 주시기 바랍니다.

※ 통신․방송․인터넷은 7. 25(수) 06:00 이후 보도 가능


 

최신 항공사진 제공시기, 최대 2년 빨라져...

 

- 국토지리정보원, 최신 항공사진 분기별 공개 및 Open API 서비스 실시 -


□ 국가에서 제작한 최신 항공사진과 영상지도의 서비스 시기가 최대 2년앞당겨질 뿐 아니라, 비용부담 없이 누구나 쉽게 활용할 수 있는 길이 열린다.


   * 항공사진 : 항공기 등에 카메라를 장착하고 지표면 등을 촬영한 사진


  ** 영상지도 : 각각의 항공사진을 접합하고 왜곡을 보정하여, 지도와 같이 공중에서 수직으로 내려다 본 모습으로 변환한 지도


구 분

항공사진

영상지도

형태

 

- 사진의 중심에서 멀어질수록 건물 등이 기울어져 보임

 

- 기울어짐을 보정하여 모든 건물이 수직으로 보임

목적

지도제작 및 각종 소송의 근거자료로 활용

행정정보 등 다양한 정보와 융․복합 활용

특징

지상의 모습을

항공촬영 당시 그대로 재현

항공사진의 왜곡을 보정하여 지도처럼 활용

□ 국토해양부 국토지리정보원(원장 : 임주빈)은 연중에 제작하여 차기년도 초에 일괄 제공하던 항공사진과 영상지도를 제작이 완료되는 대로 분기별로 신속히 제공하도록 개선하고,


 ㅇ 개인 사용자도 인터넷을 통해 무료로 이용, 다양한 용도로 활용할 수 있도록 Open API* 서비스를 실시(7.25, 수)한다고 밝혔다.


   * Open API(Application Programming Interface) : 이용자가 웹을 통해 정보를 제공받는데 그치지 않고, 응용프로그램과 서비스 등 다양한 컨텐츠를 직접 개발할 수 있도록 정보를 공개하는 것


분 석

변 환

융‧복합(Mash-up)

 

 

 

거리‧면적 측정 등

사용자 설정 좌표체계 전환

사용자 제작 레이어 추가


□ 그간, 항공사진과 영상지도는 국토의 모습과 변천과정을 보여주는 국가 인프라로서 국토개발, 도시계획 등 공공행정 분야에 널리 활용되어 왔다.


 ㅇ 그러나 최근, 인터넷 포털, 모바일 지도 등 IT 기술과 접목한 공간정보 서비스의 확대로 연 1회 공개(업데이트)로는 민‧관의 최신정보 수요를 충족하기에 한계가 있었다.


 ㅇ 특히, 영상지도는 전년도 항공사진을 이용하여 제작, 차기에 제공함으로써 2년 전에 촬영한 성과가 서비스되는 문제점이 지적되어 왔다.


 ㅇ 또한, 개인 사용자 입장에서는 자료취득(직접방문)과 활용(전문 소프트웨어)에 불편이 많았던 것도 사실이었다.


□ 이에 국토지리정보원은 당해연도에 계획한 항공사진 촬영이 모두 완료되지 않더라도, 먼저 촬영된 지역은 월별로 품질을 검사하여 신속하게 공개하도록 하고,


 ㅇ 영상지도는 공개된 항공사진 중 변화지역만 부분적으로 수정하는 방식으로 업무 프로세스를 개선함으로써, 분기별 서비스가 가능하도록 하였다.


 ㅇ 또한, 개인(또는 기관) 사용자도 인터넷* 통해 영상지도에 쉽게 접근하고, 원하는 형태로 다양하게 편집하여 활용할 수 있도록 Open API 서비스 방식을 추가하였다.


   * Open API를 통해 제공되는 서비스는 국토공간영상정보 시스템(http://air.ngii.go.kr)에서 소정의 회원가입 절차를 통해 신청 후, 사용자 인증을 받아 사용할 수 있다.


□ 국토지리정보원의 이러한 일련의 조치는 최신 공간정보에 대한 공공과 민간분야의 요구를 충족함은 물론, 개인의 창의성을 기반으로 한 공간정보 산업의 확대와 새로운 부가가치 창출의 초석이 될 것으로 기대되고 있다.



 ㅇ국토지리정보원 관계자는 “이번 계기로 사용자의 만족도를 향상시킴은 물론 국가․지자체․민간의 개별적 시스템 중복구축 방지와 공간정보의 활용성이 크게 증가될 것”이라면서,


 ㅇ“현재 서비스되는 항공사진, 영상지도 외에도 국토의 변천과정을 한 눈에 볼 수 있는 국토변화정보* 등 다방면으로 서비스를 확대할 계획”이라고 밝혔다.


   * 국토변화정보 서비스 : 전년도 항공사진과 당해연도 항공사진을 비교하여 건물, 도로 등 변화지역만 추출, DB로 구축‧제공





 

이 보도자료와 관련하여 보다 자세한 내용이나 취재를 원하시면

국토지리정보원 공간영상과 김창우 주무관(☎031-210-2671)에게 연락주시기 바랍니다.

 

 

붙임 1

 

 국토공간영상정보(영상지도 등) Open API 소개


□ 서비스 개요


 ㅇ 국토공간영상정보 Open API 서비스는 국토지리정보원에서 서비스하고 있는 전국 기반의 영상지도 및 벡터지도를 사용자(개인 또는 기관)의 웹페이지에 적용하여 손쉽게 활용할 수 있도록 하기 위한 서비스


 ㅇ 현재, 전국의 영상지도 및 벡터지도를 서비스하고 있으며, 다양한 사용자 컨텐츠를 수용할 수 있도록 구성되어 있음


 ㅇ 이를 활용하여 기본지도 위에 사용자들이 개발하고자 하는 지도 데이터 및 컨텐츠를 적용할 수도 있고, 사용자의 웹페이지를 더욱 풍성한 컨텐츠로 업그레이드 할 수 있는 장점이 있음


□ 사용자 이용 절차



 

붙임 2

 

Open API 제공 데이터 및 주요기능


□ 일반지도 - 1:5,000 기반의 수치지도를 가공한 연속 수치지도


 

디지털 지도 서비스

□ 영상지도 - 전국 연속 정사영상

 

각각의 항공사진의 접합, 왜곡을 보정하여 지도처럼 활용

□ 하이브리드 지도 - 영상지도와 연속수치지도 중첩


 

영상과 벡터의 중첩


□ 지도 - 1/50,000 종이지도를 스캐닝한 지도서비스

 

1:50,000 종이지도의 기본지도 활용

□ 심볼삽입 - 다양한 심볼을 활용하여 사용자 Map생성


 

사용자가 정의하는 심볼 및 기본 제공 심볼을 원하는 위치에 다양한 크기로 삽입


□ 모드변경 - 면적 및 거리측정 활용

 

거리 및 면적 측정 등 지도이벤트 활용

□ 지도이동 - 사용자 지정 좌표로의 이동


 

사용자가 설정한 좌표로의 이동 및 축척과 좌표를 함께 설정한 이동


□ 좌표변환 - Java Script 기반의 좌표변환 모듈 활용

 

WGS84 및 Bessel, GRS80 좌표계 등 다양한 좌표계 간 상호 변환

□ 레이어 제어 - 사용자 레이어와 기본지도 간 Mash-up 제공


 

사용자 정의 레이어와 Mash-up 서비스 제공




붙임 3

 

 Open API 제공기능

구분

Open-API 종류

기능설명

1. 기본지도변경

일반지도로 변경

국토공간영상정보 서비스에서 제공하는 4종의 지도서비스를 사용자의 선택에 따라 설정할 수 있음

영상지도로 변경

겹쳐보기로 변경

지형도로 변경

지도없음으로 변경

2. 기본지도확인

현재 기본지도 ID

현재 Active된 지도레이어 ID를 반환

3. 레이어 추가/삭제

레이어 추가

OpenAPI Map영역에 사용자 레이어를 추가/삭제 할 수 있음

레이어 삭제

모든 레이어 삭제

4. 레이어반환

총 레이어 수

OpenAPI Map영역에 적용된 사용자 레이어의 수와 레이어 ID를 확인

레이어 반환

5. 지도확대/축소

지정된 축척으로 이동

OpenAPI Map영역의 축척을 제어할 수 있음

한 단계 확대

한 단계 축소

전체보기

현재 축척 반환

6. 심볼삽입

심볼 삽입

OpenAPI에서 제공하는 심볼 및 사용자 정의 심볼을 Map영역에 표시

심볼 삽입(크기확대)

모든 심볼 삭제

7. 픽셀-지리좌표 변환

픽셀->경위도

OpenAPI Map영역의 화면픽셀 좌표와 지리적인 경위도좌표를 상호 변환

경위도->픽셀

8. 사용자이벤트

클릭 이벤트 삽입

Map영역의 마우스 이벤트에 대한 사용자 정의 이벤트를 추가 할 수 있음

moveend 이벤트 삽입

클릭 이벤트 삭제

moveend 이벤트 삭제

클릭 이벤트 목록

moveend 이벤트 목록

9. 컨트롤

ChangeMap 보이기

OpenAPI 지도 컨트롤의 보이기/감추기를 선택할 수 있음

IndexMap 보이기

Zoombar 보이기

Scalebar 보이기

ChangeMap 감추기

IndexMap 감추기

Zoombar 감추기

Scalebar 감추기

구분

Open-API 종류

기능설명

10. 모드변경

이동모드

OpenAPI Map영역의 마우스컨트롤 모드를 설정할 수 있음

확대모드

면적측정모드

거리측정모드

모드상태 확인

11. 레이어생성

기본레이어 생성

OpenLayers 기반의 사용자 정의 레이어를 생성 할 수 있음

옵션레이어 생성

12. 레이어속성

레이어 이름

OpenLayers 기반의 사용자 정의 레이어에 속성필드를 설정 하고 속성정보를 확인

속성 추가

속성 확인

13. 레이어 상태변경

레이어 보이기

OpenLayers 기반의 사용자 정의 레이어를 On/Off, 상태확인, 투명도설정 및 확인

레이어 숨기기

보이기 상태

투명도 증가

투명도 감소

투명도 확인

다시 그리기

14. 공통객체

좌표변환 객체

Java Script 기반의 좌표변환 모듈을 활용하여 좌표값을 각각의 제공되는 좌표계로 상호 변환할 수 있음

경위도 객체

픽셀 객체

 



Posted by linuxism
,