본문 바로가기
C++ 200제/코딩 IT 정보

C# Google Earth 연동, 윈폼 지도 예제 7개, 구글어스 COM API 사용법

by vicddory 2017. 2. 24.

C# Google Earth 연동, 윈폼 지도 예제 7개, 구글어스 COM API 사용법


C# 구글어스 + 윈폼 응용 예제, GoogleEarth COM API 제어 소스[c# 구글 맵, 구글 지도 연동]


예전에 Google earth 를 HTML로 불러온 뒤 해당 HTML을 C#의 WebBrowser에서 실행하는 형태로 구글어스를 제어했었는데 이젠 그럴 필요가 없네요. C# 윈폼으로도 충분히 제어할 수 있습니다.


일단, 구글에서 검색해 봐도 많은 자료가 있진 않습니다. 그래서 제가 어제 온종일 구현해 본 부분만 소개할까 합니다. 앞으로 다른 분들이 더 많은 기능을 실행하시고 GoogleEarth 관련 소스를 공유했으면 좋겠습니다.


그럼, C# 윈폼에 구글어스(구글지도) 띄우기~ 이제 시작해 보자고요.



먼저, 구글어스를 자신의 PC에 설치해야 합니다.


링크 - 구글 검색, 구글어스 [링크]


Google Earth Download(Windows, MAC)[구글맵스] COM API 제어 사용법과 KML



그리고 설치 이후에 Google earth 잘 동작하는지 확인해 봅니다.


아래 그림이 초기 실행 화면입니다.



Google Earth 초기 실행 화면[c# 구글 맵, 구글 지도 연동]



정상적으로 설치가 되었다면 위와 같은 초기 화면이 나타날 것입니다.


이제부터 C# 언어로 실제 응용을 해보겠습니다. 저는 Visual Studio 2005를 사용했습니다. C# 윈폼을 이용할 수 있는 프로젝트를 만드세요.


그리고 아래 경로의 파일을 참조에 추가합니다.


1
C:\Program Files\Google\Google Earth\plugin\geplugin.exe
cs



Visual Studio - 참조 추가[구글맵스] COM API 제어 사용법과 KML



참조 추가 - geplugin exe[구글맵스] COM API 제어 사용법과 KML



참조를 우클릭해서 구글어스 geplugin.exe를 추가합니다.


때에 따라서, C:\Program Files\Google\Google Earth\client\googleearth.exe 파일을 추가해도 됩니다. 저는 둘 다 참조 추가를 해봤는데 소스 코드상 차이점을 발견하진 못했습니다.


다음으로 아래의 소스 코드는 제 C# 윈폼 프로젝트 소스 코드입니다.


파일 다운로드example.cs



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
 
using EARTHLib;
 
namespace map
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        private static extern int SetParent(int hWndChild, int hWndParent);
 
        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(int hWnd, int nCmdShow);
 
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);
 
        [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
        private static extern bool SetWindowPos(int hWnd, int hWndInsertAfter,
                                                       int X, int Y, int cx, int cy, uint uFlags);
 
        [DllImport("user32.dll")]
        private static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
 
        private const int HWND_TOP = 0x0;
        private const int WM_COMMAND = 0x0112;
        private const int WM_QT_PAINT = 0xC2DC;
        private const int WM_PAINT = 0x000F;
        private const int WM_SIZE = 0x0015;
        private const int SWP_FRAMECHANGED = 0x0020;
 
        EARTHLib.ApplicationGE ge = new ApplicationGEClass();
 
        public Form1()
        {
            InitializeComponent();
 
            ShowWindowAsync(ge.GetMainHwnd(), 0);
            SetParent(ge.GetRenderHwnd(), this.Handle.ToInt32());
            ResizeGoogleControl();
 
            ge.OpenKmlFile(@"C:\map\test.kml"0);
        }
 
        private void Form1_Resize(object sender, EventArgs e)
        {
            ResizeGoogleControl();
        }
 
        private void ResizeGoogleControl()
        {
            SendMessage(ge.GetMainHwnd(), WM_COMMAND, WM_PAINT, 0);
            PostMessage(ge.GetMainHwnd(), WM_QT_PAINT, 00);
 
            SetWindowPos(ge.GetMainHwnd(), HWND_TOP, 00,
                           (int)this.Width, (int)this.Height, SWP_FRAMECHANGED);
            SendMessage(ge.GetRenderHwnd(), WM_COMMAND, WM_SIZE, 0);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            foreach (Process process in Process.GetProcesses())
            {
                if (process.ProcessName.StartsWith("googleearth"))
                {
                    process.Kill();
                }
            }
        }
    }
}
cs



구글어스 연동 C#[c# 구글 맵, 구글 지도 연동]



위와 같이 윈도우 폼으로 구글어스 띄우기에 성공할 수 있습니다.


위와 같이 실행이 된다면, 오른쪽 아래에 버튼을 만들어 구글어스 주요 기능 몇 개를 실행해 봐요. Google Earth 화면을 윈폼으로 구현합니다.



1. 화면 캡쳐 (스크린샷)


1
2
3
4
private void button1_Click(object sender, EventArgs e)
{
    ge.SaveScreenShot(@"C:\ad.jpg"1);
}
cs



구글어스 예제 - 화면 캡처[구글맵스] COM API 제어 사용법과 KML




2. C# 윈폼에서 카메라 이동


1
2
3
4
EARTHLib.CameraInfoGE camera = new CameraInfoGE();
camera.FocusPointLongitude = 133.345345;
camera.FocusPointLatitude = 27.3453;
ge.SetCamera(camera, 4.4); // 설정된 곳으로 카메라 이동
cs




3. GoogleEarth KML 파일 열기


1
ge.OpenKmlFile(@"C:\map\test.kml"1);
cs




4. 풍선말 보기


1
2
FeatureGE ife = ge.GetFeatureByName("ICON 테스트"); // KML의 placemark 밑에 name으로 구분
ge.ShowDescriptionBalloon(ife);
cs


이 기

능은 구글어스 KML 파일을 열은 뒤에 사용할 수 있습니다.


KML을 에디트 플러스로 열어보시면, 아래와 비슷하게 구성된 태그들을 보실 수 있습니다.



1
2
3
4
5
6
7
8
9
10
11
12
<Placemark><name>ICON TEST</name>
<description>Testing</description>
<LookAt><longitude>127.4523387583758</longitude>
<latitude>36.27131629497579</latitude>
<altitude>0</altitude>
<range>233.8010173781275</range>
<tilt>8.619936793288954e-011</tilt>
<heading>0.00785936657082211</heading>
<altitudeMode>relativeToGround</altitudeMode>
</LookAt>
<styleUrl>#msn_icon616</styleUrl>
<Point><coordinates>127.4518072325372,36.27165281168828,0</coordinates></Point></Placemark>
cs



바로 <Placemark> 태그 하단의 <name> 태그를 이용해 GoogleEarth를 사용하는 것입니다.


C# 윈폼 스샷은 아래와 같습니다.



구글어스 연동 - name 태그와 Placemark 태그[구글맵스] COM API 제어 사용법과 KML



이 경우 풍선만 뜨지, 카메라 이동은 안됩니다. 그러나 미리 코드를 만들어 놓으면 카메라 이동도 아주 쉽게 가능하겠죠?



5. 프로그레스바 띄우기


1
TextBox1.Text += ge.StreamingProgressPercentage.ToString();
cs


저는 퍼센티지를 텍스트 박스를 하나 만들어 찍어봤습니다. 아주 잘 찍히더군요. 아마도 도구 상자의 프로그레스바와 1:1로 매칭시켜서 이용하기엔 딱 적당하다고 생각이 됩니다.




6. 구글어스 GetCamera 메소드 이용하기


구글어스 - GetCamera 메소드 이용[구글맵스] COM API 제어 사용법과 KML



GetCamera 메소드를 통해선 해당 지점의 위경도를 뽑아올 수 있습니다. Tilt 값도 가져올 수 있는데, 이런 데이터들의 활용 방안은 아직 모르겠습니다.




7. SetCameraParms 메소드 이용하기


1
2
ge.SetCameraParams(1.3338139103.7762915.00
EARTHLib.AltitudeModeGE.RelativeToGroundAltitudeGE, 9.0010.0020.001);
cs


위의 C# 윈폼 코드는 실행이 됩니다만, 각 값들의 허용 범위를 아직은 잘 모르겠습니다. 위의 코드는 실행이 되면, 동남아로 GoogleEarth 카메라가 이동합니다.




C# Google Earth 연동, 윈폼 예제 7개, 구글어스 COM API 소스[c# 구글 맵, 구글 지도 연동]



학교 프로젝트 관련되어 이런저런 기능 구현을 위해서 노력 중인데, 구글어스를 C#의 폼에서 직접 제어하는 건 전 세계적으로 아직은 초기 단계인 듯싶습니다. c# 구글 맵, 구글 지도 연동 예제는 앞으로 늘어날 전망입니다.


관련 코드가 많질 않아 기능을 실행해 보는데 시간이 너무 오래 걸리네요. 많은 분이 이런저런 시도를 해서 우리나라에 양질의 공개 코드가 많이 생산되길 바랍니다.



마지막 링크(4번)는 유명한 코드 프로젝트에 올라온 코드입니다. 코드 프로젝트에선 더 많은 코드 검색이 가능합니다.


C# Google Earth 연동, 윈폼 지도 예제 7개, 구글어스 COM API 사용법

written by vicddory

댓글