김형준 GIS 연구소 (for Developers)  
Front Page
Notice | E-Mail | Admin | Write Article   
 
2011/09/15 18:01 2011/09/15 18:01
[Java] 타원체간의 경위도 좌표계 변환 오픈소스 라이브러리

얼마전에 가벼운 좌표변환 오픈소스 라이브러리를 소개한 글(http://www.gisdeveloper.co.kr/738)을 올렸습니다. 상당히 가볍고 매우 다양한 좌표계 투영이 가능한 라이브러리이지만 서로 다른 타원체 간의 좌표 변환에 있어서 제약이 있는 라이브러리였습니다.

이 글은 그에 대한 해결책으로 서로 다른 타원체 간의 경위도 좌표계 간의 변환을 지원합니다. 먼저 소개해 드린 라이브러리와 이 글에서 소개해 드릴 라이브러리를 조합하면 상당한 정확한 좌표 변환 성과를 얻으실 수 있으리라 확신합니다.

먼저 이 라이브러리를 구성하고 있는 클래스(총 4개)들의 관계도를 살펴보면 다음과 같습니다.

사용자 삽입 이미지

보시면.. Ellip2Ellipsoid라는 클래스만이 나머지 클래스와 관계를 맺고 있고 나머지는 독립적입니다. 관계를 맺고 있지 않은 클래스를 먼저 살펴보는 것이 순서이므로.. 순서대로 하나 하나 살펴보면.. 먼저 Ellipsoid는 타원체를 나타냅니다. 장반경과 편평도로 타원체 하나를 정의할 수 있습니다. 그리고 Parameters7은 타원체간의 경위도 좌표 변환을 위한 변환 계수로써 7 Parameters를 의미합니다. Vaues3는 단순히 3개의 값을 담고 있는 클래스로써 경위도값과 높이값을 담는데 사용합니다. 이 클래스는 타원체간의 경위도 좌표 변환의 입력값고 결과값의 타입으로 사용합니다. 끝으로 이 세 클래스와 유일하게 관계를 맺고 있는 Ellip2Ellipsoid는 2개의 상이한 타원체 간의 경위도 좌표를 7개의 변환 계수를 사용해 변환해 주는 주요 클래스입니다.

이제 이 클래스들을 이용하여 실제로 Bessel1841 타원체와 WGS84 타원체 간의 경위도 좌표 변환의 코드를 예로 살펴보겠습니다.

1번와 2번 코드에 앞서 언급했던 2개의 타원체를 정의하고 있습니다. 타원체 정의는 장반경과 편평도값을 통해 가능합니다. 3번 코드는 타원체 간의 변환을 위한 변환계수로써 X, Y, Z의 3개 축에 대한 이동량 그리고 또 3개의 축에 대한 회전량 끝으로 축척차값입니다. 타원체 간의 경위도 좌표 변환은 단번에 이루어지는 것이 아니라 중간 단계로 지심좌표계라는 X, Y, Z축 좌표계로 변환하게 되는데 다시 지심좌표계를 또 다른 타원체로 변환하기 위해 지심좌표계 자체를 3축에 대해 이동하고 회전하며 크기를 조절하는 과정에서 이 7개의 변환 매개변수가 사용됩니다. 9번 코드를 통해 이렇게 생성한 2개의 타원체와 변환 매개변수로써 Ellip2Ellipsoid를 생성합니다. 그리고 11번 코드부터는 실제 각 타원체간의 경위도 좌표계의 변환입니다. 결과는 아래와 같습니다.

사용자 삽입 이미지

만약 다른 프로그램 등을 통해 좌표변환을 수행했을때 위의 결과와 차이를 보인다면 변환 매개변수값으로 다른 값을 사용했기 때문입니다. 즉 위의 코드에서 3번 코드의 Parameters7 클래스의 생성시 사용한 인자값들에 해당합니다. 위의 3번 코드에서 사용한 변환 매개변수를 현재 한국에서 사용하도록 권장하고 있는 매개변수로써 대다수의 좌표변환 툴에서 사용하고 있는 매개변수입니다. 끝으로 본 오픈소스에 대한 다운로드는 아래의 링크를 통해 받으시기 바랍니다.

끝으로 궁금하신 점은 댓글을 통해 남기시면 최대한 답변해 드리겠습니다. 또한 이 오픈소스 라이브러리는 지오서비스에서 개발했으며 LGPL 라이센스를 따릅니다.
Tag :
Track this back : http://www.gisdeveloper.co.kr/trackback/740
Commented by 인현환 at 2012/02/07 11:15  r x
안녕하세요. 포스트 잘 보았습니다.
링크된 소스와 예제로 보여주신대로 해보았는데
(38.0, 128.0, 0.0) -> (38.060053625305628, 127.997803003652360, 0.000000000000000)
이런식으로 결과가 나오네요.
소스를 아무리 뒤져보고, 그대로 써보아도 결과는 마찬가지 입니다.
혹시 링크된 소스가 맞는 소스인지 궁금합니다.
Replied by 김형준 at 2012/02/07 12:57 x
글의 예제 코드의 숫자들이 모두 정확한지 확인해보시기 바랍니다.. 아니면 Copy & Paste로 소스코드를 복사해서 해보시구요..
Commented by 인현환 at 2012/02/07 13:50  r x
소스코드 그대로 써보아도 결과가 똑같네요. ㅠㅠ
혹시 아래 함수 코드가 맞는건가요? X값은 거의 비슷하게 나오는데 Y, Z값은 많이 다르게 나오는게 Geocentric2LatLong 함수에 뭔가 잘못된게 있지 않을까 싶네요.

// 지심좌표(dst)를 경위도(src:위도, 경도, 높이)로 변환
void Geocentric2LatLong(Values3 src, Values3& dst, Ellipsoid ellipse)
{
double degrad, sphiold, sphinew, slam, recf, b, es, n, p, t1, f;
int icount;

f = ellipse.f;
degrad = atan(1.0) / 45.0;
recf = 1.0 / f;
b = ellipse.a * (recf - 1.0) / recf;
es = (ellipse.a*ellipse.a - b*b) / (ellipse.a*ellipse.a);

slam = atan(src.V2 / src.V1);
p = sqrt(src.V1*src.V1 + src.V2*src.V2);

n = ellipse.a;
dst.V3 = 0.0;
sphiold = 0.0;
icount = 0;
do
{
icount++;
t1 = pow(((b*b) / (ellipse.a*ellipse.a) * n + dst.V3), 2.0) - (src.V3*src.V3);
t1 = src.V3 / sqrt(t1);
sphinew = atan(t1);

if(abs(sphinew - sphiold) < 1E-18)
break;

n = ellipse.a / sqrt(1.0 - es * pow(sin(sphinew), 2.0));
dst.V3 = p / cos(sphinew) - n;
sphiold = sphinew;
} while(icount < 300);

dst.V1 = sphinew / degrad;
dst.V2 = slam / degrad;

if(src.V1 < 0.0) dst.V2 = 180.0 + dst.V2;
if(dst.V2 < 0.0) dst.V2 = 360.0 + dst.V2;
}
Replied by 김형준(Dip2K) at 2012/02/08 09:24 x
답장 메일 드렸습니다..
확인해 보고 다시 알려드리도록 하겠습니다..
Replied by 김형준(Dip2K) at 2012/02/09 15:59 x
제가 가지고 있는 ellip2ellipsoid로 해보니.. 제대로된 결과가 나왔습니다. 다시 묶어서 소스 코드 올려드렸습니다. 새로 받으셔서 해보시기 바랍니다..
Commented by 인현환 at 2012/02/13 08:21  r x
덕분에 큰 도움이 되었습니다. 감사합니다. ^^*
Replied by 김형준 at 2012/02/13 19:42 x
도움이 되셨다니 좋습니다..

name    password    homepage
 hidden
BLOG main image
 Notice
DuraMap-Xr 소개 및 다운로드
[오픈소스] SimpleSHP v0.1
FingerEyes-Xr 소개 및 다운로드
OpenGL Tutorials
 Category
전체 (552)
GIS 개발 (155)
프로그래밍 (240)
스치는 생각들 (128)
번역 또는 집필 (3)
영작학습 (6)
 TAGS
GIS Xr OpenGL Shader BlackPoint FingerEyes Algorithm Java Map Engine WPF
 Calendar
«   2012/05   »
    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 30 31    
 Recent Entries
English Writing Study
English Writing Study
English Writing Study 4
English Writing Study 3
English Writing Study 2
 Recent Comments
안녕하세요~ 코봉히님....
김형준 - 05/15
동부->중부 좌표변환할 일...
코봉히 - 05/14
잘봤습니다.
지나가다 - 05/11
지금 사용하고 있는 dem...
김형준 - 05/04
단면도 측정 결과를 보고....
아무개 - 05/02
출처를 밝히시면 마음껏...
김형준(Dip2K) - 05/02
하나더 말씀을 안드렸네요...
Begginer - 05/02
고맙습니다. OpenGL으로...
Begginer - 05/02
네, 기존 버전에 대해 불...
김형준(Dip2K) - 05/01
정말 감사합니다..새로운...
조성각 - 05/01
 Archive
2012/05
2012/04
2012/03
2012/02
2012/01
2011/12
2011/11
2011/10
2011/09
2011/08
2011/07
2011/06
 Link Site
Adobe Flex 3 Help
Cartograph 2.0
GADM
GIS 위키디피아
GIS 프로그래밍 연구소
MapTools.org
OGC
OGRE3D
OSGeo 한국 지부
Paul Bourke Site
Wikipedia
국가수자원관리 정보시스템
국립지리원
국토연구원
국토해양부
네이버 과학
대한측량협회
류광님의 블로그
이민파님의 공간분석과 리...
지오서비스(GeoService)
 Visitor Statistics
Total : 982092
Today : 114
Yesterday : 582
태터툴즈 배너
rss