Windows Mobile2009.05.06 14:27
GPS 좌표를 이용한 두 점 간의 거리 및 방향을 구하는 코드 공개

거리 구하는 수식은 국토지리원에서 제공하는 엑셀 파일을 코드로 옮긴것이고
진행 방위각(bearing) 은 민돌님이 공개한 코드를 참조 했습니다.

두 지점간의 거리 구하는 공식은 GPS 좌표를 GRS80 타원체로 계산하는 공식 이며, 가장 믿을만 한것 같아서 사용 했습니다.
(국토 지리원 게시판에 적혀 있기도 하지만, 정확성에 대한 책임은 없다고 합니다 ㅡ,.ㅡ)

진행 방향은 북극점을 기준으로 시계방향으로 방위 각도 입니다. 
0도 : 북, 90도 : 서, 180도 : 남, 270도 : 동


소스코드
c#으로 되어 있고.. 제가 만드는 프로그램에 포함 된 것이라서.. 
namespace 정도만 수정하시면 사용상 문제 없으실 겁니다.

사용 방법은 이렇게... (테스트 좌표는 일부러 극 지방에 가까운 것으로.. )
// 지점1 : -47.264221, 167.378767

//지점2 : -46.841269, 168.046208


 private void button3_Click(object sender, EventArgs e)
        {
            GpsCalc gc = new GpsCalc();
            MessageBox.Show("거리:" + gc.distance(-47.264221, 167.378767, -46.841269, 168.046208) + "미터 \n"+
                            "방위각:" + gc.bearingP1toP2(-47.264221, 167.378767, -46.841269, 168.046208));
        }


실행결과


구글 어스에서 보면... 



References
1. 국토지리원 공개 자료실,

2. 민돌님 블로그
http://mindol.egloos.com/2090382

3. 곰돌아빠의 블로그
http://avionics.tistory.com/tag/%EA%B1%B0%EB%A6%AC%EA%B5%AC%ED%95%98%EA%B8%B0
Posted by Dr.Kein

댓글을 달아 주세요

  1. 비밀댓글입니다

    2009.08.23 16:53 [ ADDR : EDIT/ DEL : REPLY ]
    • 공식 상으론 1m 의 거리도 구분이 가능 합니다.
      그리고 수식은 국토지리원에 올라와 있는 엑셀의 수식을 그대로 옮긴 것이어서.. 이 수식이 어떻게 만들어 진것 인지는 저도 모르고 있어서 설명을 못 드리겠네요 ^^

      2009.08.27 00:48 신고 [ ADDR : EDIT/ DEL ]
  2. Hiro

    댓글 달아 주셔사 감사합니다. ^^ 좋은 하루 되세요

    2009.08.27 15:44 신고 [ ADDR : EDIT/ DEL : REPLY ]
  3. 비밀댓글입니다

    2010.02.08 12:19 [ ADDR : EDIT/ DEL : REPLY ]
  4. 궁금해요

    제가 자세히 안 읽어서 그런지 ...

    지점 : -46.841269, 168.046208 여기서 어느것이 경도고 위도 인지 모르겠네요

    그리고 님처럼 구글 어스에서 확인을 어떻게 하는거죠?? ㅠㅠ

    제발 알려주세요

    2010.03.03 01:16 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 앞에 오는 숫자가 위도, 뒤따라오는 숫자가 경도 입니다.
      독도의 위,경도는 37.239824 , 131.868013 입니다.
      이 숫자를 구글 어스의 검색창에 복사해서 붙여넣고 검색버튼을 눌러 보세요/

      2010.03.04 10:54 신고 [ ADDR : EDIT/ DEL ]
  5. 궁금해요

    그럼 gps 프로토콜은 nmea0183 인가요?

    2010.03.05 00:36 신고 [ ADDR : EDIT/ DEL : REPLY ]
  6. ^^

    gps 좌표를 이용하여 거리를 구하는 공식을 찾고 있었는데,
    소스코드까지 공개를 해주시다니 +_+
    많은 도움이 되었네요 ^^ 유용하게 사용하겠습니다 ^^

    2010.03.06 20:22 신고 [ ADDR : EDIT/ DEL : REPLY ]
  7. 필요한 정보였는데 감사합니다ㅡ^ ^

    2010.03.12 14:37 신고 [ ADDR : EDIT/ DEL : REPLY ]
  8. 강욱

    GPS 이용해서 위치 추적하는 프로그램 만들고 있습니다... 공개해 주신 소스코드 감사합니다~~
    잘 사용할게요~^^

    2010.04.23 00:53 신고 [ ADDR : EDIT/ DEL : REPLY ]
  9. 본즈야

    거리구하는 소스가 필요했는데...소스 공개 해 주셔서..너무나도 감사합니다!
    잘쓰겠습니다!

    2010.10.10 15:18 신고 [ ADDR : EDIT/ DEL : REPLY ]
  10. 이번에 4학년 졸업 프로젝트를 이런 내용으로 할려고 하는데....조언좀 얻고 싶은데...
    괜찮을까요..ㅠㅠ???

    2011.02.23 21:46 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 얼마나 도와드릴 수 있을지 모르겠지만
      kein.you 지메일로 메일 주시면 확인해 보겠습니다 ^^

      2011.02.25 11:50 신고 [ ADDR : EDIT/ DEL ]
  11. 한줄기 빛과 소금같은 소스네요
    정말 감사합니다.

    2011.04.30 00:52 신고 [ ADDR : EDIT/ DEL : REPLY ]
  12. Fods

    좋은 정보 감사합니다!!!

    2011.05.25 19:39 신고 [ ADDR : EDIT/ DEL : REPLY ]
  13. 많은 도움이

    되었습니다 감사합니다.

    2012.03.07 21:44 신고 [ ADDR : EDIT/ DEL : REPLY ]

하루하루2009.04.30 15:42
사진에 GPS의 좌표를 입력해 놓아서, 언제(시간) 어디서(장소) 찍은 사진인지를 기록하는 방법.
카메라 자체에 GPS 모듈을 장착한 모델들도 있기는 하지만 소수에 불과하기 때문에,

별도의 GPS 로깅 장치를 이용하여 gps log를 누적하고,
촬영한 사진 파일에 기록되어 있는 시간 정보를 이용하여, gps log 정보중 일치하는(가까운) 시간의 gps 좌표를 사진에 집어 넣는 방식이 주로 사용되고 있다. 


그래도 제일 괜찮은 프로그램과 방법을 소개한 블로그가 있어서 링크 걸어 둠..

출처 ; 신나무실님 블로그


Posted by Dr.Kein

댓글을 달아 주세요

Windows Mobile2009.03.20 11:22

GPS 수신기의 정보를 받아서 위치, 이동경로, 속도 등을 뽑아내야 하는데, 일단 GPS 가 보내주는 정보를 분석해야 한다.
구글링중 찾은 블로그가 있어서 참조..


출처 : 초심자용 에린 입문서 블로그 (http://erine.egloos.com/2233135)

아래부터는 본문의 내용


$ELEXTECH, Inc  G1800s
$HW Version 1.6
$SW Version 231.000.100
$Startup    4
$TOW: 0
$WK:  1192
$POS: 6378137  0        0
$Baud rate: 9600  System clock: 24.553MHz



$GPGGA,215235.670,3735.0064,N,12701.6746,E,1,03,50.0,0.0,M,19.6,M,0.0,0000*4F
$GPGSA,A,2,10,08,02,,,,,,,,,,50.0,50.0,20.0*0A
$GPGSV,3,1,10,26,78,314,00,29,71,017,00,24,48,156,00,10,44,079,46*79
$GPGSV,3,2,10,21,39,309,32,08,21,046,36,09,16,187,00,02,14,151,35*73
$GPGSV,3,3,10,06,14,296,00,15,06,319,00*7F
$GPRMC,215235.670,A,3735.0064,N,12701.6746,E,0.000000,,060905,,*12
$GPGGA,215236.670,3735.0066,N,12701.6748,E,1,03,50.0,0.0,M,19.6,M,0.0,0000*40
$GPGSA,A,2,10,08,02,,,,,,,,,,50.0,50.0,20.0*0A

..
..
..
$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48
$GPGSA,A,2,19,25,15,,,,,,,,,,21.5,7.9,20.0*32
$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77
$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A





1. NMEA Code

GPS에서는 신호가 대략 위와 같은 형식으로 오는데 이걸 NMEA 라고 한다.

NMEA는 The National Marine Elecrtronics Association이라고 하는데,
원래 이 신호가 해양에서의 배의 정확한 위치 확인에 가장 먼저 이용되었나 보다.


그냥 위와 같이 보면 복잡한데,
데이터의 형식은
$로 시작해서 GP로시작하는 NMEA코드이름, 그리고 데이터와 맨 마지막에 *??의
Check Sum그리고 혹은
로 끝난다.
(,
은 개행(줄바꿈)을 뜻한다)

/* Modified in 2008-12-09 */
NMEA 0183의 Sentence는 $로 시작해서 *로 끝나며,
그 사이의 모든 글을 XOR 연산하여 *뒤에 체크섬으로 나타낸다.
또한 Sentece뒤에는 <CR><LF>를 붙여서 한 줄로 나타낸다.



Elextech에서 만든 G1800sLP+라는 GPS 모듈에서 나온 GPS정보이며,
UART로 데이터를 전송하고, baud rate는 9600bps (bit per second)라는 것을 알 수 있다.


이 GPS는 총 네가지 종류의 NMEA코드를 출력하는데
$GPGGA,  $GPGSA, $GPGSV, $GPRMC이다.

그리고 뒤의 데이터는 모두 comma ( , )로 구분되어 있다.


2. GPGGA
(Global Positioning System Fix Data)


$GPGGA는 Fix Data라고 하는데, 여기에서 주로 알 수 있는 것은
시간, 위도, 경도, 고도 등이다.

예제 => $GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

$GPGGA 114455.532 3735.0079,N 12701.6446,E 1 03 7.9 48.8,M 19.6,M 0.0,0000 *48
시간 위도 경도 계산종류 위성수 노이즈 고도 고도2 dgps 체크섬


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

114455.532는 시간으로서
Zulu time (그리니치 표준시) 기준으로 11시 44분 55.532초를 뜻한다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

3735.0079는 위도로서
37도 35.0079분을 뜻한다. 60분이 1도니까, 대략 37.5도가 된다. -> 서울
뒤의 N은 북위라는 것을 뜻한다. S라면 남위가 되는 것.
(37˚ 35.0079' = 37.583465˚ = 37˚ 35' 0.474")/* Modified in 2009-03-03 */


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

12701.6446은 경도로서
127도 1.6446분을 뜻한다. 그러니까, 대략 127도가 된다 -> 서울
뒤에 E는 동경을 뜻하므로, W가 되면 서경이 된다.
(127˚ 1.6446' = 127.02741˚ =  127˚ 1' 38.676")/* Modified in 2009-03-03 */


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

1은 fix종류를 뜻하는데

GPS는 미국에서 쏘아올린 GPS 위성에서 동시에 쏘아준 신호의 시간차를 이용하여
거리를 계산하는 방법을 쓴다(삼각측량, 불확정성의 원리)
지구의 어디에 있든지 최소한 3개 이상의 GPS신호를 받을 수 있다.

그런데, 이 경우에 상업용 GPS는 오차가 15m정도 생기는데, 이를 보정하는게
dgps라는 것이다. 지상의 특정하고 정확한 곳에 GPS기지국을 설치하고
여기에서도 신호를 쏘아보내는 것이다.

그러면 오차가 5m이내로 줄어들게 된다.

0 이면 invalid한 데이터(못쓰는 데이터) 라는 의미
1 이면 gps 위성신호만으로 계산
2 라면 dgps도 사용하여 계산 등등이다.

/* Modified in 2008-12-09 */
DGPS 기지국을 지상의 특정한 곳에 설치할 수도 있지만,
따로 GPS기기 회사에서 위성을 발사하여 보정하는 경우도 있다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

계산에 사용한 위성의 갯수인데,
최소한 3개 이상의 신호를 받아야 한다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

horizontal dillusion of position이래는데.
무슨 말인지 ~_~)

/* Modified in 2009-01-13 */
위성과의 노이즈에 관련된 자료 라고 하네요


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

고도 정보인데
M법으로 환산했을때 48.8M라는 것이다. (해수면 기준)

$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

지구를 모델링할때에, 구형으로 모델링할 수도 있고
타원체로 모델링할 수 도 있다.

타원체로 모델링할 경우에, 지표면상에서 정확한 위치를 구하기 위해서
(위도 경도 고도를 x,y,z로 고친다는 뜻)
구형과 타원체가 얼마나 차이가 나는지, 지표면에서 얼마나 높게 있는지
그 정보를 알 필요가 있다 이것은, 위도, 경도에 따라 다른데, 이 높이이다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

dgps를 사용했을 경우 마지막으로 update한 시간과, dgps 기지국의 ID이다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*
48

check sum이다.



3. GPGSA

사용을 안한다.


4. GPGSV

GPS Satellites in View
계산에 사용한 위성이 아니라, 현재 위치에서 보이는 모든 위성정보이다.


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

줄이 몇 줄인지 나타낸다.
GPGSV가 총 3줄이 나온다./* Modified in 2009-03-03 */


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

몇번째 줄인지 나타낸다.
총 3줄의 GPGSV 중 1번째 줄 이다/* Modified in 2009-03-03 */


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

보이는 위성의 갯수를 나타낸다.
10개의 위성이 보이고 있고 한줄당 4개의 위성정보가 출력된다/* Modified in 2009-03-03 */


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

03,86,244,00

3번 위성이고,
현재 자신의 위치에서 86도 (degree) elevation
244도 (degree)의 Azimuth
그리고 신호대잡음비 (SNR)은 0 이다.


그렇게 위성 3개가 적히고
*77은 checksum이다.


5. GPRMC
Recommended Minimmum data라고 하는데
추천되는 가장 최소한의 데이터 들이다.

$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A



$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

역시 시간을 의미한다. zulutime 기준으로 11시 44분 55.532초


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

지금 현재 출력되는 값이
쓸 수 있는 값인지 (valid) 아니면 쓰면 안되는 이상한 값인지를 나타내는데
A라면 valid하고 V라면 valid하지 않다.


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A


뒤의 위도와 경도는 GPGGA와 동일하다.


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A


Speed over ground라고 하는데
knots 단위의 속도이다.

비행기에서는 보통 KIAS라는 속도단위를 쓰고,
배에서는 knots라는 속도단위를 사용한다.
KIAS는 대략 km/h 단위의 1/3이라고 보면된다.

만약 900km/h라면 300KIAS정도 된다.
KIAS는 knots indicator air speed의 약자이다.

/* Modified in 2007-12-19 */
Knot단위계와 km/h단위계의 변환은 대략 1.8을 곱하면 된다.



$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

Track Angle in degree true라고 하는데 잘 모르겠다. ~_~)

/* Modified in 2007-12-19 */
진행방향을 정북으로부터 0도부터 359도까지로 표현한 것이다.
121.61 이니까. 동남쪽으로 이동하고 있다.



$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

Date이다.
11th, July, 2006. 2006년 7월 11일을 뜻한다.


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A


안나오는데 (이 장치가 지원을 안해서..)
원래 북쪽을 0으로 한, magnetic variation,
즉 나침반이다.
/* Modified in 2012-8-14 */
이전 측정한 위치와 이번 측정된 위치를 이용하여, 이동한 방향의 방위각 이 정확한 표현이다..

*0A

체크섬이다.


- 참조자료 - reference

http://www.nmea.org/ - National Marine Electronics Association
http://www.gpsinformation.org/dale/nmea.htm - GPS Information
http://home.pacific.net.au/~gnb/gps/nmea.html - GPS NMEA reference


Posted by Dr.Kein

댓글을 달아 주세요

Context Awareness2009.02.19 15:00

[출처]
2008년 가을 한국정보과학회 학술발표논문집

[저자]
오세원(Se-Won Oh) · 노현용(Hyun-Yong Noh) · 이진형(Jin-Hyung Lee) · 황금성(Keum-Sung Hwang) · 조성배(Sung-Bae Cho)

[요약]
모바일 장치의 하드웨어와 소프트웨어의 발달로 인해 모바일은 초기 단순한 통신장치에서 벗어나 모바일 장치를 이용하여 사용자는 장소, 시간에 구애 받지 않고 컴퓨팅 환경을 이용할 수 있게 되었다. 특히 스마트폰과 같은 모바일 장치의 보급은 GPS를 이용한 사용자 위치의 파악 및 모바일 기기의 사용 내역 등을 로그형태로 저장할 수 있고, 무선 네트워크 망을 통해 기존 네트워크와 통신이 가능해졌다. 이러한 모바일 장치의 발달로 인하여 모바일 사용자의 상태를 추론하여 사용자에게 알맞은 서비스를 서비스 공급자들이 직접 제공하는 것이 가능해졌다. 모바일 장치의 제한된 정보를 가지고 사용자의 행동과 상태를 정확하고 효율적으로 분석할 수 있다면 사용자에게 보다 알맞은 서비스를 제공하여 여러 가지 편의성을 제공할 수 있다. 하지만 GPS 신호는 실외에서만 수신이 가능하며 특유의 오차를 가지고 있다. 또한 정확한 추론모델의 설계를 위해서는 추론 모델의 복잡도가 증가하여 효과적인 설계가 이루어지기 힘들다. 본 논문에서는 이러한 모바일 장치와 GPS의 제약 내에서 보다 정확성 있고 효과적인 사용자 상황을 인지하기 위한 방법으로 베이지안 네트워크를 이용한 확률 모델을 제안한다. 추론모델의 복잡도를 줄이고, 정확도의 향상과 GPS의 오차와 실내에서 수신이 불가능 한 GPS의 한계성 극복하기 위한 모델을 제안한다.
Posted by Dr.Kein

댓글을 달아 주세요

  1. 니꺼 pda폰 gps심어져 있는건가?
    gps있으면 구글네비게이터 설치해서 한번 사용해봐 잼나. ^^

    2009.02.21 04:11 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 사무실에 블루투스 gps 가 있길래 연동해 보긴 했다.
      구글 네비게이터로 trail 이 나오길래
      파일 저장을 했다만... 집에 와서 확인해 보니 저장한 파일을 찾을 수가 없더군 -_-

      2009.02.21 08:33 신고 [ ADDR : EDIT/ DEL ]
  2. ㅋㅋ 저장은 유료만 된다.
    $80 다. 나도 하나만 사다오...

    2009.02.21 18:10 신고 [ ADDR : EDIT/ DEL : REPLY ]