KML은 구글어스, 구글맵, 모바일 구글맵 등 어스브라우저에서 지리정보를 표시하는데 사용되는 파일 포맷입니다. KML은 중첩 요소와 속성으로 이루어진 태그 기반의 구조로서 XML 표준을 따르고 있습니다. 모든 태그는 소문자-대문자를 구별하며, 반드시 KML 2.1 설명서(ML 2.1 Reference)에 나열된 것과 똑같은 형태로 사용해야 합니다. 설명서를 보시면 일부 태그는 선택사항이라는 것을 아실 수 있습니다. 어떤 요소 내에 태그를 사용하려면 설명서에 있는 순서대로 입력해야 합니다.

KML에 익숙하지 않으시다면 이 문서 그리고 샘플파일(SamplesInEarthSamplesInMaps)을 둘러보시면 KML파일의 기본구조를 파악하실 수 있을 것입니다. 첫번째 부분은 구글어스 유저인터페이스에서 생성할 수 있는 기능에 대한 설명이 있습니다. 즉, 위치표지(placemark), 설명문(description), 지상중첩(ground overlay), 선(path), 면(polygon)등에 대해서 설명을 드립니다. 두 번째 부분은 텍스트 에디터로서만 편집할 수 있는 KML 기능에 대해 설명합니다. 그 텍스트 파일을 .kml 혹은 .kmz 로 저장하시면 어스브라우저가 그 파일을 이용해 화면에 표시하게 됩니다.

TIP: 구글어스에서 지형지물에 대한 KML 코드를 보시려면 해당 지형지물을 마우스 우측버튼으로 누르신 후 복사(copy)를 선택하시고, 텍스트 에디터에 붙이기(paste)를 하시면 됩니다. 구글어스에 표시된 지형지물이 KML 텍스트로 변환됩니다. 이 기능을 꼭 실험해 보세요.

여기에서 설명하는 모든 예제는 KML Samples에 들어 있습니다. 먼저 이 파일을 다운로드 받은 후 구글어스에서 확인해 보시기 바랍니다.

부가 정보

KML 2.1 설명서(KML 2.1 Reference)를 보시면 상세한 KML 파일 포맷에 대한 해설이 있습니다. KML에 익숙하시다면 KML 2.1 스키마(KML 2.1 Schema)를 보시면 많은 도움이 되실 것입니다.

KML 2.1 버전에 새로 추가된 기능에 대한 소개는 KML 2.1 투토리얼(KML 2.1 Tutorial)을 참고하세요.

1 KML 기초(Basic KML Documents)

간단한 KML 문서는 구글어스에서 직접 생성할 수 있습니다. 즉, 텍스트 에디터로 KML을 만들 필요가 없습니다. 위치표지(Placemarks), 영상지상중첩(ground overlays), 선(paths), 면(polygons) 등은 구글어스에서 직접 생성할 수 있습니다.

위치표지(Placemarks)

구글어스에서 가장 널리 사용되는 기능이 위치표지(Placemarks)입니다. 위치표지는 지구상의 어떤 지점을 아이콘(일반적으로 노란색 핀)으로 사용하여 표시합니다. 가장 간단한 위치표지에는 <Point> 요소만 들어가는데, 이 경우 해당 표지의 위치만 지정하게 됩니다. 위치표지에 이름이나, 원하는 아이콘, 혹은 다른 도형 요소도 첨가할 수 있습니다.

구글어스에서 KML Samples 를 열고 Placemarks라고 되어 있는 폴더를 확장시켜보세요. 이 폴더에는 단순 위치표지(simple), 떠있는 위치표지(floating), 떠있으면서 연결된 위치표지(extruded) 등 3가지 형태의 위치표지가 있습니다. 단순위치표지의 KML 코드는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Placemark>
<name>Simple placemark</name>
<description>Attached to the ground. Intelligently places itself
at the height of the underlying terrain.</description>
<Point>
<coordinates>-122.0822035425683,37.42228990140251,0</coordinates>
</Point>
</Placemark>
</kml>

이 파일의 구조는 다음과 같습니다.

  • XML 헤더. 모든 KML파일의 첫번째 줄로서 앞에 공백이나 다른 문자가 있어서는 안됩니다.
  • KML 이름공간(namespace) 선언문. 모든 KML 2.1 버전 파일에는 이 줄이 들어가야 합니다.
  • 위치표지(Placemark) 객체는 다음과 같은 요소로 구성되어 있습니다:
    • - name(이름) - 해당 위치표지의 레이블로 사용됨
    • - description(설명문) - 위치표지의 풍선에 나타나는 내용
    • Point(점) - 해당 위치표지의 지구상의 위치를 지정(경도, 위도, 높이는 옵션)

이 위치표지가 가리키는 위치는 바로 구글어스를 개발한 구글의 41번 빌딩입니다!

사용자들이 구글어스에서 "위치표지(Placemark)"로 알고 있는 것은 실재로는 KML에서 <Point>를 child로 가지고 있는 <Placemark>요소입니다. 점 위치표지는 구글어스 3차원 뷰어에서 아이콘과 레이블(제목)을 그릴 수 있는 유일한 방법입니다. 아이콘 형태를 별도로 지정하지 않으면 노란색 핀으로 표시됩니다. KML에서 <Placemark>요소는 여러 가지 도형요소를 가질 수 있습니다. 예를 들어 LineString, Polygon, 혹은 Model을 포함할 수 있습니다. 그러나, Point를 가진 <Placemark>만이 아이콘과 레이블이 표시됩니다. 점(Point)는 아이콘을 위치시키는데 사용되며, 점 그 자체를 표현하는 방법은 없습니다.

위치표지내의 설명문 HTML(Descriptive HTML in Placemarks)

KML Samples 에는 위치표지의 텍스트를 처리할 수 있는 거의 모든 방법이 들어 있습니다. 링크를 추가할 수도 있고, 폰트 크기나 스타일, 색, 좌우정렬이나 표도 추가할 수 있습니다. 전체 리스트를 확인하고 싶으시다면 구글어스에서 "Descriptive HTML" 위치표지를 복사하여 텍스트 에디터에 붙여보시면 됩니다.

구글어스에서의 자동마크업(Auto-Markup in Google Earth) (Release 4.0 and later)

구글어스 4.0에는 자동마크업 기능이 있습니다.  www.google.com 과 같은 텍스트를 사용자들이 클릭할 수 있는 하이퍼링크로 자동 변환해주는 기능입니다.  <description>, <Snippet> 혹은 <BalloonStyle> 속에 들어 있는 <text> 요소 등에 포함된 텍스트는 자동적으로 표준 HTTP 하이퍼링크로 변환됩니다. 따라서 <a href= ...> 태그를 직접 입력하실 필요가 없습니다.

CDATA 요소 사용법(Using the CDATA Element)

<description> 태그 속에 표준 HTML을 입력할 경우 CDATA 태그내에 넣는 것이 좋습니다. CDATA를 이용하지 않으실 경우 '<' 또는 '>' 등을 구글어스가 잘못 해석하지 않도록 entity reference(특수문자 표현)로서 입력해야 합니다. (예를 들어 '>' 는 &gt;, <는 &lt; 등으로 대치해야 합니다.) 이 것은 XML의 표준으로서 구글어스에만 해당되는 것은 아닙니다.

CDATA 태그를 사용할 때와 아닐 때의 HTML 차이를 살펴보겠습니다. 먼저 CDATA를 사용한 경우입니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<Placemark>
<name>CDATA example</name>
<description>
<![CDATA[
<h1>CDATA Tags are useful!</h1>
<p><font color="red">Text is <i>more readable</i> and
<b>easier to write</b> when you can avoid using entity
references.</font></p>
]]>
</description>
<Point>
<coordinates>102.595626,14.996729</coordinates>
</Point>
</Placemark>
</Document>
</kml>

아래는 CDATA 태그를 사용하지 않고 <description>을 삽입한 경우로, 특수문자를 entity reference로 대치해야 함을 알 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<Placemark>
<name>Entity references example</name>
<description>
&lt;h1&gt;Entity references are hard to type!&lt;/h1&gt;
&lt;p&gt;&lt;font color="green"&gt;Text is
&lt;i&gt;more readable&lt;/i&gt;
and &lt;b&gt;easier to write&lt;/b&gt;
when you can avoid using entity references.&lt;/font&gt;&lt;/p&gt;
</description>
<Point>
<coordinates>102.594411,14.998518</coordinates>
</Point>
</Placemark>
</Document>
</kml>

영상의 지상중첩(Ground Overlays)

지상중첩은 임의의 영상을 지표면에 덧씌우는 것을 말합니다. 이때 <Icon>요소에 덧씌울 영상(.jpg)의 링크를 지정해야 합니다. 아래는 KML Samples 에 들어 있는 지상중첩의 예로서, 2001년 분화한 에트나 화산 영상입니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Folder>
<name>Ground Overlays</name>
<description>Examples of ground overlays</description>
<GroundOverlay>
<name>Large-scale overlay on terrain</name>
<description>Overlay shows Mount Etna erupting
on July 13th, 2001.</description>
<Icon>
<href>http://code.google.com/apis/kml/documentation/etna.jpg</href>
</Icon>
<LatLonBox>
<north>37.91904192681665</north>
<south>37.46543388598137</south>
<east>15.35832653742206</east>
<west>14.60128369746704</west>
<rotation>-0.1556640799496235</rotation>
</LatLonBox>
</GroundOverlay>
</Folder>
</kml>

첫 두줄(XML 헤더와 KML 이름공간 선언문)은 위에 있는 예제와 동일하다는 것을 아실 수 있습니다.

이 예제에서는 폴더(타이틀은 "Ground Overlays"를 사용하고 있습니다. 폴더는 여러가지 콘텐츠를 하나로 묶고 제목을 부여할 때 사용합니다. 구글어스에 KML Samples을 불러들인 후, "Places" 패널에 어떻게 나타나는지 확인해 보시기 바랍니다.

지상중첩("Ground Overlay")에서 중첩되는 위치 <LatLonBox> 태그를 사용하여 지정합니다. 남북쪽 위도와 동서쪽 경도를 입력하여 경계를 지정합니다. 또한, Y축이 북쪽과 일치하지 않는 경우, 회전값(rotation)을 지정할 수 있습니다. 이 예제에서는 JPEG 영상을 중첩하고 있지만, 기타 BMP, GIF, TIFF, TGA, PNG 등의 포맷도 지원됩니다. 

선(Paths)

구글어스에서는 여러가지 형태의 선을 생성할 수 있으며, 사용자 데이터를 사용해 매우 쉽게 창조적으로 작업할 수 있습니다. KML에서에서 선(Path)은 <LineString> 요소를 사용하여 생성합니다. "Paths" 폴더 속에 있는 "Absolute Extruded" 예제를 살펴보시면 선의 형태를 어떻게 지정할 수 있는지 파악하실 수 있을 것입니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Paths</name>
<description>Examples of paths. Note that the tessellate tag is by default
set to 0. If you want to create tessellated lines, they must be authored
(or edited) directly in KML.</description>
<Style id="yellowLineGreenPoly">
<LineStyle>
<color>7f00ffff</color>
<width>4</width>
</LineStyle>
<PolyStyle>
<color>7f00ff00</color>
</PolyStyle>
</Style>
<Placemark>
<name>Absolute Extruded</name>
<description>Transparent green wall with yellow outlines.</description>
<styleUrl>#yellowLineGreenPoly</styleUrl>
<LineString>
<extrude>1</extrude>
<tessellate>1</tessellate>

<altitudeMode>absolute</altitudeMode>
<coordinates> -112.2550785337791,36.07954952145647,2357
-112.2549277039738,36.08117083492122,2357
-112.2552505069063,36.08260761307279,2357
-112.2564540158376,36.08395660588506,2357
-112.2580238976449,36.08511401044813,2357
-112.2595218489022,36.08584355239394,2357
-112.2608216347552,36.08612634548589,2357
-112.262073428656,36.08626019085147,2357
-112.2633204928495,36.08621519860091,2357
-112.2644963846444,36.08627897945274,2357
-112.2656969554589,36.08649599090644,2357
</coordinates>
</LineString>
</Placemark>
</Document>
</kml>

** 역자 주) 좌표에 높이가 지정되어 있기 때문에 <tessellate>를 1로 해도 표시가 나지 않습니다. <altitudeMode>를 relativeToGround로 설정하고 높이를 0으로 둔 후 <tessellate>를 1로 하면 선이 지면을 따라 잘게 잘라진 형태로 표시됩니다. 물론 이때는 <extrude>는 효과가 없습니다. 위 예제에서 <extrude>만 0으로 바꾸면 장벽이 사라집니다.

면(Polygons)

면(Polygons)을 사용하여 간단한 건물이나 도형을 생성할 수 있습니다. 예를 들어 KML Samples 파일에 들어 있는 "Polygons" 폴더를 살펴보시기 바랍니다.

펜타곤(미국방성) 예제는 안쪽과 바깥쪽 껍데기만을 그린 후, 땅까지 장벽을 만들도록(extrude)하여 생성한 것입니다. 아래는 코드입니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Placemark>
<name>The Pentagon</name>
<Polygon>
<extrude>1</extrude>
<altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-77.05788457660967,38.87253259892824,100
-77.05465973756702,38.87291016281703,100
-77.05315536854791,38.87053267794386,100
-77.05552622493516,38.868757801256,100
-77.05844056290393,38.86996206506943,100
-77.05788457660967,38.87253259892824,100
</coordinates>
</LinearRing>
</outerBoundaryIs>
<innerBoundaryIs>

<LinearRing>
<coordinates>
-77.05668055019126,38.87154239798456,100
-77.05542625960818,38.87167890344077,100
-77.05485125901024,38.87076535397792,100
-77.05577677433152,38.87008686581446,100
-77.05691162017543,38.87054446963351,100
-77.05668055019126,38.87154239798456,100
</coordinates>
</LinearRing>
</innerBoundaryIs>
</Polygon>
</Placemark>
</kml>

 

2 KML 상급(Advanced KML Documents)

이번 섹션에서는 도형 스타일을 공유하거나, 위치표지(Placemarks)에 강조 아이콘(highlighted icon)을 달거나, 영상을 화면에 중첩시키는 등, 텍스트 에디터를 사용하여 직접 편집해야 하는 KML 요소에 대해 설명합니다. KML을 "직접" 편집하는 것은 구글어스 인터페이스를 사용해서 도형을 삽입하거나 편집하는 것 보다는 약간 어렵지만, 약간만 연습하면 대부분의 사용자들이 이러한 효과를 쉽게 KML파일에 넣을 수 있습니다.

도형 스타일(Styles for Geometry)

일단 구글어스에서 도형들을 만들고, 구글 어스가 생성해주는 KML 코드를 읽어보면, 여러분의 자료를 화면에 표시하는데 스타일이 중요하다는 것을 아실 수 있을 것입니다. 숙련된 분들이라면 스스로의 스타일을 정의하는 방법을 배우고 싶겠죠.

KML 문서 시작부분에 스타일(Style)을 정의하고 ID를 정의하면, 이 스타일을 해당 문서에서 도형(Geometry)이나, 위치표지(Placemarks), 중첩(Overlays) 등을 정의할 때 사용할 수 있습니다. 여러가지 요소가 동일한 스타일을 사용할 수 있으므로, 이러한 방법으로 정의하고 사용하는 스타일을 공유스타일(shared styles)이라고 합니다. 스타일(Style)을 일단 정의하고 나면, <stleUrl>요소를 사용하여 참조할 수 있습니다. 스타일 정의가 같은 파일내에 있을 경우 <styleUrl>뒤에 #을 쓰고 해당 스타일의 ID를 쓰면 됩니다. 스타일 정의가 외부파일에 존재할 경우에는 <styleUrl>에 완전한 URL을 써 주어야 합니다.

KML Samples 파일에는 첫부분에 여러가지 공유스타일(shared style)이 있으며, 각각 ID가 정의되어 있습니다. ID를 붙일 때에는 어떠한 효과가 있는지 쉽게 알수 있도록 설명식 문자열을 사용하는 것이 편리합니다. 아래는 "transBluePoly"라는 스타일의 예로서, 면(Polygon)의 표면은 투명한 파랑색이고 면의 경계선의 두께는 1.5 (색은 디폴트로 하얀색)로 정의하고 있습니다. 이 스타일은 구글 캠퍼스 41번 빌딩("Polygon" 폴더 내에 있음) 에 사용됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<Style id="transBluePoly">
<LineStyle>
<width>1.5</width>
</LineStyle>
<PolyStyle>
<color>7dff0000</color>
</PolyStyle>
</Style>
<Placemark>
<name>Building 41</name>
<styleUrl>#transBluePoly</styleUrl>
<Polygon>
<extrude>1</extrude>
<altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates> -122.0857412771483,37.42227033155257,17
-122.0858169768481,37.42231408832346,17
-122.085852582875,37.42230337469744,17
-122.0858799945639,37.42225686138789,17
-122.0858860101409,37.4222311076138,17
-122.0858069157288,37.42220250173855,17
-122.0858379542653,37.42214027058678,17
-122.0856732640519,37.42208690214408,17
-122.0856022926407,37.42214885429042,17
-122.0855902778436,37.422128290487,17
-122.0855841672237,37.42208171967246,17
-122.0854852065741,37.42210455874995,17
-122.0855067264352,37.42214267949824,17
-122.0854430712915,37.42212783846172,17
-122.0850990714904,37.42251282407603,17
-122.0856769818632,37.42281815323651,17
-122.0860162273783,37.42244918858722,17
-122.0857260327004,37.42229239604253,17
-122.0857412771483,37.42227033155257,17
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>

참고로, 여기에서 <Style> 요소는 <Placemark>의 차일드입니다. (스타일이 직접적으로 영향을 미치는 도형의 차일드가 아니라는 것을 주의하시기 바랍니다.)

강조 아이콘 스타일(Styles for Highlighted Icons)

"Styles and Markup" 폴더에 들어 있는 "Highlighted Icon "을 잘 살펴보시면 KML에서 롤오버(roll-over)효과를 어떻게 적용할 수 있는지 아시게 될 것입니다. 이 문서에서는 먼저 "normalPlacemark"와 "highlightPlacemark"라는 두개의 스타일을 정의합니다. 이중에서 "highlightPlacemark"는 마우스를 아이콘위에 올릴 때만 나타나는 것입니다. <StyleMap>요소에는 아이콘 스타일과 상태를 연결해 주는 키/값 쌍이 2개가 들어 있습니다. 아이콘 상태는 normal과 highlight 등 2가지가 있습니다.

기본적인 단계는 다음과 같습니다:

  1. 위치표지(Placemark)에 대한 일반 아이콘 스타일을 <Style>로 정의하고 ID를 지정합니다. ("normalPlacemark") <Style>속에, 아래에 볼 수 있는 것처럼 실제로 사용하는 아이콘 영상을 <Icon>태그와 <href> 태그로 지정합니다.
  2. 위치표지(Placemark)에 대한 강조 아이콘 <Style>과 ID를 지정합니다. ("highlightPlacemark")
  3. <StyleMap>요소를 생성하여 ID를 지정해 줍니다. ("exampleStyleMap"). 위치표지는 바로 이 ID를 참조하게 됩니다. 
  4. <StyleMap> 요소에 일반(normal) 상태를 "#normalPlacemark"라고 지정합니다.
  5. <StyleMap> 요소에 강조(highlight)) 상태를 "#highlightPlacemark"라고 지정합니다.
  6. 위치표지(Placemark)속에서 <styleUrl>요소를 넣고 "#exampleStyleMap"을 지정해 줍니다.
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Highlighted Icon</name>
<description>Place your mouse over the icon to see it display the new icon</description>
<Style id="highlightPlacemark">
<IconStyle>
<Icon>
<href>http://maps.google.com/mapfiles/kml/paddle/red-stars.png</href>
</Icon>
</IconStyle>
</Style>
<Style id="normalPlacemark">
<IconStyle>
<Icon>
<href>http://maps.google.com/mapfiles/kml/paddle/wht-blank.png</href>
</Icon>
</IconStyle>
</Style>
<StyleMap id="exampleStyleMap">
<Pair>
<key>normal</key>
<styleUrl>#normalPlacemark</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
<styleUrl>#highlightPlacemark</styleUrl>
</Pair>
</StyleMap>
<Placemark>
<name>Roll over this icon</name>
<styleUrl>#exampleStyleMap</styleUrl>
<Point>
<coordinates>-122.0856545755255,37.42243077405461,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>

영상의 화면중첩(Screen Overlays)

구글어스에서는 영상을 화면에 중첩할 수 없습니다.(지표면에 중첩하는 방법은 영상의 지상중첩(Ground Overlays)참조) 따라서 지상중첩보다 생성하기 힘듧니다. KML Samples 파일에서 "Screen Overlays" 폴더를 살펴보시면 여러가지 정교한 샘플이 들어 있습니다.

예를 들어  KML Samples에서 "Absolute Positioning: Top left" 폴더를 실행시키면 View 윈도의 좌상단에 화면 중첩이 나타나는 것을 보실 수 있습니다. 이것은 다음의 KML 코드를 사용한 것입니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<ScreenOverlay>
<name>Absolute Positioning: Top left</name>
<Icon>
<href>http://code.google.com/apis/kml/documentation/top_left.jpg</href>
</Icon>
<overlayXY x="0" y="1" xunits="fraction" yunits="fraction"/>
<screenXY x="0" y="1" xunits="fraction" yunits="fraction"/>
<rotationXY x="0" y="0" xunits="fraction" yunits="fraction"/>
<size x="0" y="0" xunits="fraction" yunits="fraction"/>
</ScreenOverlay>
</kml>

중첩되는 위치는 <overlayXY>로 지정하는 영상의 한점과, <screenXY>로 지정하는 화면상의 한점을 사용하여 지정합니다. 이 예에서는 영상의 좌상단(0,1)을 화면상의 좌상단에 일치하도록 설정하였습니다.

"Screen Overlays"폴더에 들어 있는 다른 예제를 살펴보면, 다른 지점에 일치시키는 방법이나, 화면의 크기에 따라 영상의 크기를 동적으로 일치시켜주는 방법을 아실 수 있을 것입니다. (참고로, xunitsyunits  를 "pixels"로 지정하면 보다 정확한 위치를 지정할 수 있습니다. 보다 자세한 내용은 KML 2.1 Reference을 참고하시기 바랍니다.

Network Links

네트워크 링크를 만들기 위해서는 파일을 불러들이는 <href>(하이퍼텍스트 참조)와 함께 <Link>요소를 사용해야 합니다. <href>는 자신의 컴퓨터에 있는 파일을 지정해도 되고, 절대 URL을 지정할 수도 있습니다. 이름은 네트워크 링크지만, 반드시 네트워크로부터 파일을 불러들어야하는 것은 아닙니다.

링크에서 <href>는 다음과 같은 위치를 지정할 수 있습니다.

  • 아이콘 스타일, 지상중첩, 화면중첩 등에 사용되는 영상파일(An image file used by icons in icon styles, ground overlays, and screen overlays)
  • <Model>요소에 사용되는 모델 파일(A model file used in the <Model> element)
  • 네트워크 링크로 불어들이는 KML또는 KMZ파일(A KML or KMZ file loaded by a Network Link)

지정하는 파일은 자신의 컴퓨터에 있어도 되고, 원격 서버에 존재해도 됩니다. 네트워크 링크는 어떤 컴퓨터안에 있는 큰 KML파일을 여러개의 작은 파일로 분리하여 사용할 때 유용할 수 있습니다.

현재까지의 모든 예제는 자신의 컴퓨터에 존재하는 KML 파일을 구글어스에게 전달하는 구조였습니다. 네트워크 링크는 멀리 떨어진 곳에서 콘텐츠를 보내고 많은 사람에게 자료를 배포하는 용도로 잘 활용할 수 있습니다. 이러한 방법을 사용하면 자료를 수정해야할 경우에도, 원본이 있는 곳 하나만 수정하면 다른 사람들에겐 자동적으로 갱신된 자료가 전달되게 됩니다.

KML 파일에서 CGI 스크립트 사용(CGI Scripting for KM)

In addition to pointing to files containing static data, a network link's <href> can point to data that is dynamically generated—for example, by a CGI script located on a network server. With some knowledge of a scripting language such as PHP, Python, or Perl, you can create a script that delivers a stream (or file) of KML data to each network link.

네트워크 링크의 <href>는 일반적인(정적인) 자료가 들어 있는 파일을 가리키는 방식외에도, 동적으로 생성되는 자료를 가리키는 방식도 사용할 수 있습니다. 예를 들어, 네트워크 서버에 들어 있는 CGI 스크립트를 참조할 수 있습니다. PHP, Python, 혹은 Perl과 같은 스크립트 언어를 어느 정도 알고 있다면 각각의 네트워크링크에 KML 데이터 스트림(혹은 파일)을 전달해주는 스크립트를 짤 수 있습니다.

Two things are necessary for delivering KML through a network CGI:

네트워크 CGI를 통해 KML을 전달하려면 두가지 사항이 필요합니다.

When a call is made from the client (Google Earth) to the server, the server must (1) return a response code of HTTP 200 and (2) set the response's content type to text/plain or application/vnd.google-earth.kml+xml.

클라이언트(구글)에서 서버를 호출할 때, 서버는 (1) HTTP 200 이라는 응답코드를 보내고, (2) 응답의 콘텐츠 형식을 text/plain 또는 application/vnd.google-earth.kml+xml로 설정해야 합니다.

The response must be valid KML. For complex applications, proper error handling is very important.

응답은 정확한 KML 문법을 따라야 합니다. 복잡한 응용프로그램일 경우 적절한 오류처리 절차가 매우 중요합니다.

TIP: A simple way to handle errors is to parse the server's error as the text for a folder name. For example, you could have the server return <Folder><name>database inaccessible</name></Folder> as a string. This is more informative (and more user-friendly) than letting the connection drop.

TIP: 오류를 처리하는 가장 간단한 방법은 서버 오류를 폴더 이름 형태의 텍스트로서 처리하는 것입니다. 예를 들어 서버에서 "<Folder><name>database inaccessible</name></Folder>"라는스트링으로 반환하도록 하면 됩니다. 이렇게 하면 단순히 연결을 끊어버리는 것보다 훨씬 좋습니다.

The following examples use Python, but they are equally valid in any other scripting language.

다음은 Python 을 사용한 예이지만, 다른 스크립트 언어를 사용해도 무방합니다.

임의로 위치표지를 생성(Generating a Random Placemark)

The following Python script generates random integer values for latitude and longitude and then inserts those values into the <coordinates> element of a <Point>. Whenever the network link is refreshed, the Python script runs again and generates KML with new latitude and longitude values.

다음은 임의의 경위도 정수값을 생성하고 그 값을 <Point>의 <coordiantes> 요소에 삽입하는  Python 스크립트입니다. 네트워크 링크가 새롭게 갱신될 때마다 이 Python 스크립트가 다시 동작하여 새로운 경위도 값을 가지는 KML이 생성됩니다.

#!/usr/bin/python

import random

latitude = random.randrange(-90, 90)
longitude = random.randrange(-180, 180)
kml = (
'<?xml version="1.0" encoding="UTF-8"?>\n'
'<kml xmlns="http://earth.google.com/kml/2.1">\n'
'<Placemark>\n'
'<name>Random Placemark</name>\n'
'<Point>\n'
'<coordinates>%d,%d</coordinates>\n'
'</Point>\n'
'</Placemark>\n'
'</kml>'
) %(longitude, latitude)
print 'Content-Type: application/vnd.google-earth.kml+xml\n'
print kml

Here is an example of a KML file containing a Network Link that loads this Python script:

다음 예는 이 Python 스크립트를 불러오는 네트워크 링크가 포함된 KML 파일입니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Folder>
<name>Network Links</name>
<visibility>0</visibility>
<open>0</open>
<description>Network link example 1</description>
<NetworkLink>
<name>Random Placemark</name>
<visibility>0</visibility>
<open>0</open>
<description>A simple server-side script that generates a new random
placemark on each call</description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>http://yourserver.com/cgi-bin/randomPlacemark.py</href>
</Link>
</NetworkLink>
</Folder>
</kml>

뷰기반 재갱신 검색(View-Based Refresh Queries)

A standard network link is a uni-directional link: data flows only from the server to Google Earth. The view-based refresh enables bi-directional communication. When the view-based refresh is active, Google Earth returns the view coordinates to the server at a specified time. This may be every n seconds, minutes, or hours, or once a certain amount of time has elapsed since the view stopped moving. See <viewRefreshMode> in the KML 2.1 Reference.

표준 네트워크 링크는 단방향 링크입니다. 즉, 데이터가 서버에서 구글어스로 전해질 뿐입니다. 뷰기반 재갱신의 경우 양방향 통신이 가능합니다. 뷰기반 갱신이 활성화되면, 구글어스에서 서버로 뷰 좌표가 정해진 시간에 전달됩니다. 몇초, 몇분 혹은 몇시간마다 전달될 수도 있고, 뷰가 정지된 때로부터 일정한 시간이 지났을 때 전달될 수도 있습니다. 자세한 사항은 KML 2.1 설명서에서 <viewRefreshMode>를 참조하시기 바랍니다.

The coordinates are returned to the server by means of an HTTP GET that appends the coordinates as follows (this is the default bounding box information):

서버로 반환되는 좌표는  HTTP GET 에 다음과 같은 형태로 첨부되어 전달됩니다. (이 예제에서는 현재 화면에 표시된 좌표입니다.)

GET /path/to/sever/script/query?BBOX=[longitude_west, latitude_south, longitude_east, latitude_north] HTTP/1.1

If the request were made while the user was looking down on San Francisco, the coordinates might look as follows:

사용자가 샌프랜시스코를 내려다보고 있을 때 요청이 가는 경우, 다음과 같은 좌표가 전달될 것입니다.

GET /path/to/server/script/query?BBOX=-122.497790,37.730385,-122.380087,37.812331 HTTP/1.1

This feature can be used for some very creative applications, but to get you started, a simple example is presented below.

이러한 기능은 매우 독창적인 어플리케이션에 사용될 수 있을 것입니다. 하지만, 아래의 간단한 예를 먼저 살펴보시기 바랍니다.

뷰 바로 아래에 있는 점의 추적(Tracking a Point Directly Under Your View)

The following server-side Python script parses the return message sent by Google Earth and responds with a Placemark at the center of the screen. Each time the Network Link is refreshed, a new Placemark is generated.

다음의 서버측 Python 스크립트는 구글어스가 보내온 반환 메시지를 해독하고, 화면 중심부에 있는 위치표지(Placemark)와 반응을 합니다.  네트워크 링크가 새롭게 갱신될 때마다 새로운 위치표지가 생성됩니다.

#!/usr/bin/python

import cgi

url = cgi.FieldStorage()
bbox = url['BBOX'].value
bbox = bbox.split(',')
west = float(bbox[0])
south = float(bbox[1])
east = float(bbox[2])
north = float(bbox[3])

center_lng = ((east - west) / 2) + west
center_lat = ((north - south) / 2) + south

kml = (
'<?xml version="1.0" encoding="UTF-8"?>\n'
'<kml xmlns="http://earth.google.com/kml/2.1">\n'
'<Placemark>\n'
'<name>View-centered placemark</name>\n'
'<Point>\n'
'<coordinates>%.6f,%.6f</coordinates>\n'
'</Point>\n'
'</Placemark>\n'
'</kml>'
) %(center_lng, center_lat)

print 'Content-Type: application/vnd.google-earth.kml+xml\n'
print kml

And here is the KML for the Network Link that loads the Python script:

다음은 Python script를 불러오는 네트워크 링크에 대한 KML입니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Folder>
<name>Network Links</name>
<visibility>0</visibility>
<open>0</open>
<description>Network link example 2</description>
<NetworkLink>
<name>View Centered Placemark</name>
<visibility>0</visibility>
<open>0</open>
<description>The view-based refresh allows the remote server to calculate
the center of your screen and return a placemark.</description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>http://yourserver.com/cgi-bin/viewCenteredPlacemark.py</href>

<refreshInterval>2</refreshInterval>
<viewRefreshMode>onStop</viewRefreshMode>
<viewRefreshTime>1</viewRefreshTime>
</Link>
</NetworkLink>
</Folder>
</kml>

The principle illustrated in this example can be used for some very complex applications. For example, if you have a database of geographic information, you can extract the coordinates of the viewer, make a call to the database for the data specific to the view, and return it to Google Earth as KML.

이 예제가 제시하는 원리는 복잡한 어플리케이션에서도 사용할 수 있습니다. 예를 들어 여러분에게 지리정보 데이터베이스가 있을 경우, 사용자가 현재 보는 좌표를 추출하고, 해당 좌표내에 속한 데이터를 대상으로 자료를 처리한 후, 구글어스에 KML로 반환할 수 있습니다.

3. KML MIME 형태(KML MIME Types)

When responding to a request from Google Earth (or any Earth browser), a KML server must follow a certain set of rules so that Google Earth can correctly interpret its responses.

구글어스 등의 어스 브라우저로부터 요구가 전달되어 KML 서버가 이에 반응을 할 때, KML 서버는 구글어스가 올바로 해석할 수 있도록 몇가지 규칙을 반드시 준수해야 합니다.

Upon success, the server must return a response code of HTTP 200 and set the response's content-type to a suitable MIME type, as described here.

성공적인 결과를 반환할 때에는 반드시 HTTP 200 반응 코드를 반환해야 하고, 반응 콘텐츠 type을 여기에서 설명하는 것처럼 적절한 MIME type으로 지정해야 합니다.

Google Earth reads KML and KMZ files. The MIME type for KML files is

구글어스는 KML과 KMZ 파일을 읽을 수 있습니다. KML파일의 MIME type은 다음과 같습니다.

  • application/vnd.google-earth.kml+xml

The MIME type for KMZ files is

KMZ 파일의 MIME type는 다음과 같습니다.

  • application/vnd.google-earth.kmz

For Apache, add these lines to the httpd.conf file:

Apache의 경우 httpd.conf 파일에 다음과 같은 내용을 넣어야 합니다.

  • AddType application/vnd.google-earth.kml+xml .kml
  • AddType application/vnd.google-earth.kmz .kmz

See the Microsoft documentation for details on setting up MIME types on Microsoft's IIS.

Microsoft IIS의 MIME type을 설정하려면 Microsoft documentation를 참조하시기 바랍니다.

The body of the response must contain valid KML data, including the XML declaration (<?xml version="1.0" encoding="UTF-8"?>). If the server returns invalid KML, the Network Link will stop, deactivate, and output an error message.

반응의 body에는 반드시 XML 선언문(<?xml version="1.0" encoding="UTF-8"?>)을 포함하여 정확한 KML 자료가 들어 있어야 합니다. 서버에서 부정확한 KML을 반환할 경우, 네트워크 링크가 끊어지고 비활성화된 후 에러메시지가 나오게 됩니다.

다음 과제(What's Next?)

Ready for more? Check out the KML 2.1 Tutorial, which describes the cool new features included in KML 2.1.

더 읽어 보고 싶으세요? KML 2.1 투토리얼(KML 2.1 Tutorial)을 읽어보세요. KML 2.1에 포함된 멋지고 새로운 기능을 아실 수 있을 것입니다.