소개
KML은
XML 데이터
형식을 확장한 것으로,
지도에서 지리 데이터를 나타냅니다. 이 유틸리티를
사용하면 KML 객체를 지리적 도형으로 변환하고 지도 위의 레이어로
렌더링할 수 있습니다. 지도에서 KML 데이터를 추가/삭제하려면
각각 addLayerToMap()
및 removeLayerFromMap()
을
호출합니다. KML 객체의 속성에 액세스하려면 Placemark, GroundOverlay, Document 또는 Folder에서 getProperties()
를 호출합니다.
지도에 KML 레이어 추가
지도에 데이터 레이어를 추가하려면
먼저 KmlLayer
클래스의 인스턴스를 생성합니다. KmlLayer
를 인스턴스화하는 방법은 두 가지가
있습니다.
로컬 리소스에서 KML 데이터 세트를 가져와서 렌더링하려면 다음 항목이 필요합니다.
- 레이어를 렌더링할
GoogleMap
객체 - KML 데이터가 포함된 로컬 리소스 파일
- 로컬 리소스 파일을 여는 데 필요한
Context
객체
Kotlin
val layer = KmlLayer(map, R.raw.geojson_file, context)
Java
KmlLayer layer = new KmlLayer(map, R.raw.geojson_file, context);
로컬 스트림에서 KML 데이터 세트를 가져와서 렌더링하려면 다음 항목이 필요합니다.
- 레이어를 렌더링할
GoogleMap
객체 - KML 데이터가 포함된
InputStream
- 로컬 리소스를 여는 데 필요한
Context
객체
Kotlin
val inputStream: InputStream? = // InputStream containing KML data val layer = KmlLayer(map, inputStream, context)
Java
InputStream inputStream = // InputStream containing KML data KmlLayer layer = new KmlLayer(map, inputStream, context);
KmlLayer
를 만든 후 addLayerToMap()()
을
호출하여 가져온 데이터를 지도에 추가합니다.
Kotlin
layer.addLayerToMap()
Java
layer.addLayerToMap();
KML 레이어 삭제
다음 KmlLayer
를 만들었다고 가정해 보겠습니다.
Kotlin
val inputStream: InputStream? = // InputStream containing KML data val layer = KmlLayer(map, inputStream, context)
Java
InputStream inputStream = // InputStream containing KML data KmlLayer layer = new KmlLayer(map, inputStream, context);
지도에서 레이어를 삭제하려면 removeLayerFromMap()
을 호출합니다.
Kotlin
layer.removeLayerFromMap()
Java
layer.removeLayerFromMap();
KML 컨테이너 액세스
레이어에 추가된 컨테이너에 액세스하려는 경우
생성된 레이어에서 getContainers()
를 호출하면 됩니다.
컨테이너에 중첩된 컨테이너가 있는지
확인하려면 hasContainers()
를 호출합니다. 이러한 중첩 컨테이너에 액세스하려면
레이어에서와 마찬가지로
getContainers()
를 호출하세요.
KmlLayer
또는 KmlContainer:
에서 중첩되지 않은 컨테이너에 액세스하려면 다음을 실행합니다.
Kotlin
for (containers in layer.containers) { // Do something to container }
Java
for (KmlContainer containers : layer.getContainers()) { // Do something to container }
KmlLayer
또는 KmlContainer
에서 중첩된 컨테이너에
액세스하려면 다음을 실행합니다.
Kotlin
fun accessContainers(containers: Iterable<KmlContainer>) { for (container in containers) { if (container.hasContainers()) { accessContainers(container.containers) } }
Java
public void accessContainers(Iterable<KmlContainer> containers) { for (KmlContainer container : containers) { if (container.hasContainers()) { accessContainers(container.getContainers()); } } }
KML 위치표시 및 KML 지면 오버레이 액세스
레이어에 추가된 위치표시 또는 지면
오버레이에 액세스하려면 레이어 또는
컨테이너에서 getPlacemarks()
또는 getGroundOverlays()
를 호출합니다. 호출하면
각각 KmlPlacemarks
또는 KmlGroundOverlays
의
반복 가능 항목을 반환합니다.
예를 들어 레이어에서 KmlPlacemark
객체에 액세스하려면 다음을 실행합니다.
Kotlin
for (placemark in layer.placemarks) { // Do something to Placemark }
Java
for (KmlPlacemark placemark : layer.getPlacemarks()) { // Do something to Placemark }
KML 속성 액세스
컨테이너 또는 위치표시의 속성에 액세스하려면
getProperty()
를 호출하고 속성 키를 제공합니다. 또한 hasProperty()
를 호출하여
속성이 존재하는지 확인할 수도 있습니다. 이 샘플은 컨테이너에서
속성 값 'name'(존재하는 경우)을 가져오는 방법을 보여줍니다.
Kotlin
for (container in layer.containers) { if (container.hasProperty("name")) { Log.i("KML", container.getProperty("name")) } }
Java
for (KmlContainer container : layer.getContainers()) { if (container.hasProperty("name")) { Log.i("KML", container.getProperty("name")); } }
KML 도형 클릭 이벤트
KmlLayer.OnFeatureClickListener()
를 사용하여 지도의 도형 지형지물에서 클릭 이벤트를 수신 대기할 수 있습니다. 다음 예시에서는 사용자가 하나의 지형지물을
클릭할 때 그 지형지물의 ID를 기록합니다.
Kotlin
// Set a listener for geometry clicked events. layer.setOnFeatureClickListener { feature -> Log.i( "KML", "Feature clicked: " + feature.id ) }
Java
// Set a listener for geometry clicked events. layer.setOnFeatureClickListener(new KmlLayer.OnFeatureClickListener() { @Override public void onFeatureClick(Feature feature) { Log.i("KML", "Feature clicked: " + feature.getId()); } });
데모 앱 보기
KML 파일을 가져오고 이 파일로 레이어를 만드는 예시를 보려면 유틸리티 라이브러리와 함께 제공되는 데모 앱의 KmlDemoActivity
를 확인하세요. 설정 가이드는 데모 앱을 실행하는 방법을
보여줍니다.
KML 지원 기능
KML 요소 | 지원 여부 | 설명 |
---|---|---|
<address> | 일부 지원 | 속성 값으로 저장 |
<AddressDetails> | 아니요 | |
<Alias> | 아니요 | |
<altitude> | 아니요 | |
<altitudeMode> | 아니요 | |
<atom:author> | 아니요 | |
<atom:link> | 아니요 | |
<atom:name> | 아니요 | |
<BalloonStyle> | 일부 지원 | <text>만 지원됨 |
<begin> | 해당 없음 | <TimeSpan>만 지원됨 |
<bgColor> | 아니요 | |
<bottomFov> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<Camera> | 아니요 | |
<Change> | 일부 지원 | 스타일 변경만 지원됨 |
<color> | 일부 지원 | #AABBGGRR 및 #BBGGRR을 포함하며 <ScreenOverlay> 및 <GroundOverlay>에서는 지원되지 않음 |
<colorMode> | 예 | |
<cookie> | 아니요 | <NetworkLinkControl>은 지원되지 않음 |
<coordinates> | 예 | |
<Create> | 아니요 | |
<Data> | 아니요 | |
<Delete> | 아니요 | |
<description> | 예 | 일반 텍스트만 지원, HTML 콘텐츠는 지원되지 않음 |
<displayMode> | 아니요 | |
<displayName> | 아니요 | |
<Document> | 예 | |
<drawOrder> | 예 | |
<east> | 예 | |
<end> | 해당 없음 | <TimeSpan>만 지원됨 |
<expires> | 아니요 | <NetworkLinkControl>은 지원되지 않음 |
<ExtendedData> | 일부 지원 | 유형이 지정되지 않은 <Data>만 지원, <SimpleData> 또는 <Schema>는 지원되지 않음, form$[dataName]의 항목 교체는 지원되지 않음 |
<extrude> | 아니요 | |
<fill> | 예 | |
<flyToView> | 아니요 | <NetworkLinkControl>은 지원되지 않음 |
<Folder> | 예 | |
<gridOrigin> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<GroundOverlay> | 예 | |
<heading> | 예 | |
<hotSpot> | 예 | |
<href> | 예 | |
<httpQuery> | 아니요 | |
<Icon> | 예 | |
<IconStyle> | 예 | |
<ImagePyramid> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<innerBoundaryIs> | 예 | <LinearRing> 명령에 포함 |
<ItemIcon>ㅁㅈㅇㅁㅈ | 해당 없음 | <ListStyle>은 지원되지 않음 |
<key> | 예 | |
<kml> | 예 | |
<LabelStyle> | 아니요 | |
<latitude> | 예 | |
<LatLonAltBox> | 아니요 | |
<LatLonBox> | 예 | |
<leftFov> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<LinearRing> | 예 | |
<LineString> | 예 | |
<LineStyle> | 예 | |
<Link> | 아니요 | |
<linkDescription> | 해당 없음 | <NetworkLinkControl>은 지원되지 않음 |
<linkName> | 해당 없음 | <NetworkLinkControl>은 지원되지 않음 |
<linkSnippet> | 해당 없음 | <NetworkLinkControl>은 지원되지 않음 |
<listItemType> | 해당 없음 | <ListStyle>은 지원되지 않음 |
<ListStyle> | 아니요 | |
<Location> | 해당 없음 | <Model>은 지원되지 않음 |
<Lod> | 예 | |
<longitude> | 예 | |
<LookAt> | 아니요 | |
<maxAltitude> | 아니요 | |
<maxFadeExtent> | 아니요 | |
<maxHeight> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<maxLodPixels> | 아니요 | |
<maxSessionLength> | 아니요 | |
<maxWidth> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<message> | 아니요 | |
<minAltitude> | 아니요 | |
<minFadeExtent> | 아니요 | |
<minLodPixels> | 아니요 | |
<minRefreshPeriod> | 아니요 | <NetworkLink> |
<Model> | 아니요 | |
<MultiGeometry> | 예 | |
<name> | 예 | |
<near> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<NetworkLink> | 아니요 | |
<NetworkLinkControl> | 아니요 | |
<north> | 예 | |
<open> | 예 | 속성 값으로 저장 |
<Orientation> | 해당 없음 | <Model>은 지원되지 않음 |
<outerBoundaryIs> | 예 | <LinearRing> 명령에 포함 |
<outline> | 예 | |
<overlayXY> | 아니요 | |
<Pair> | 예 | |
<phoneNumber> | 일부 지원 | 속성 값으로 저장 |
<PhotoOverlay> | 아니요 | |
<Placemark> | 예 | |
<Point> | 예 | |
<Polygon> | 예 | |
<PolyStyle> | 예 | |
<range> | 예 | |
<refreshInterval> | 아니요 | |
<refreshMode> | 아니요 | |
<refreshVisibility> | 아니요 | |
<Region> | 예 | |
<ResourceMap> | 해당 없음 | <Model>은 지원되지 않음 |
<rightFov> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<roll> | 해당 없음 | <Camera> 및 <Model>은 지원되지 않음 |
<rotation> | 예 | |
<rotationXY> | 아니요 | |
<Scale> | 해당 없음 | <Model>은 지원되지 않음 |
<scale> | 예 | |
<Schema> | 아니요 | |
<SchemaData> | 아니요 | |
<ScreenOverlay> | 아니요 | |
<screenXY> | 해당 없음 | <ScreenOverlay>는 지원되지 않음 |
<shape> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<SimpleData> | 해당 없음 | <SchemaData>는 지원되지 않음 |
<SimpleField> | 해당 없음 | <Schema>는 지원되지 않음 |
<size> | 예 | |
<Snippet> | 아니요 | |
<south> | 예 | |
<state> | 해당 없음 | <ListStyle>은 지원되지 않음 |
<Style> | 예 | |
<StyleMap> | 일부 지원 | 강조표시된 스타일은 지원되지 않음. 인라인 StyleMaps는 지원되지 않음 |
<styleUrl> | 예 | |
<targetHref> | 아니요 | <Alias>는 지원되지 않음 |
<tessellate> | 아니요 | |
<text> | 예 | |
<textColor> | 아니요 | |
<tileSize> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<tilt> | 아니요 | |
<TimeSpan> | 아니요 | |
<TimeStamp> | 아니요 | |
<topFov> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<Update> | 해당 없음 | <NetworkLinkControl>은 지원되지 않음 |
<value> | 예 | |
<viewBoundScale> | 아니요 | |
<viewFormat> | 아니요 | |
<viewRefreshMode> | 아니요 | |
<viewRefreshTime> | 아니요 | |
<ViewVolume> | 해당 없음 | <PhotoOverlay>는 지원되지 않음 |
<visibility> | 예 | |
<west> | 예 | |
<when> | 해당 없음 | <TimeStamp>는 지원되지 않음 |
<width> | 예 |