Google Maps KML 가져오기 유틸리티

  1. 소개
  2. KML 레이어 추가
  3. KML 레이어 삭제
  4. KML 컨테이너 액세스
  5. KML 위치표시 및 KML 지면 오버레이 액세스
  6. KML 속성 액세스
  7. KML 지원 기능

소개

KMLXML 데이터 형식을 확장한 것으로, 지도에서 지리 데이터를 나타냅니다. 이 유틸리티를 사용하면 KML 객체를 지리적 도형으로 변환하고 지도 위의 레이어로 렌더링할 수 있습니다. 지도에서 KML 데이터를 추가/삭제하려면 각각 addLayerToMap()removeLayerFromMap()을 호출합니다. KML 객체의 속성에 액세스하려면 Placemark, GroundOverlay, Document 또는 Folder에서 getProperties()를 호출합니다.

지도에 KML 레이어 추가

지도에 데이터 레이어를 추가하려면 먼저 KmlLayer 클래스의 인스턴스를 생성합니다. KmlLayer를 인스턴스화하는 방법은 두 가지가 있습니다.

로컬 리소스에서 KML 데이터 세트를 가져와서 렌더링하려면 다음 항목이 필요합니다.

  • 레이어를 렌더링할 GoogleMap 객체
  • KML 데이터가 포함된 로컬 리소스 파일
  • 로컬 리소스 파일을 여는 데 필요한 Context 객체

자바

KmlLayer layer = new KmlLayer(map, R.raw.geojson_file, context);
      

Kotlin

val layer = KmlLayer(map, R.raw.geojson_file, context)
      

로컬 스트림에서 KML 데이터 세트를 가져와서 렌더링하려면 다음 항목이 필요합니다.

  • 레이어를 렌더링할 GoogleMap 객체
  • KML 데이터가 포함된 InputStream
  • 로컬 리소스를 여는 데 필요한 Context 객체

자바

InputStream inputStream = // InputStream containing KML data
KmlLayer layer = new KmlLayer(map, inputStream, context);
      

Kotlin

val inputStream: InputStream? =  // InputStream containing KML data
val layer = KmlLayer(map, inputStream, context)
      

KmlLayer를 만든 후 addLayerToMap()()을 호출하여 가져온 데이터를 지도에 추가합니다.

자바

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

KML 레이어 삭제

다음 KmlLayer를 만들었다고 가정해 보겠습니다.

자바

InputStream inputStream = // InputStream containing KML data
KmlLayer layer = new KmlLayer(map, inputStream, context);
      

Kotlin

val inputStream: InputStream? =  // InputStream containing KML data
val layer = KmlLayer(map, inputStream, context)
      

지도에서 레이어를 삭제하려면 removeLayerFromMap()을 호출합니다.

자바

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

KML 컨테이너 액세스

레이어에 추가된 모든 컨테이너에 액세스하려는 경우 생성된 레이어에서 getContainers()를 호출하면 됩니다. 컨테이너에 중첩된 컨테이너가 있는지 확인하려면 hasContainers()를 호출합니다. 이러한 중첩 컨테이너에 액세스하려면 레이어에서와 마찬가지로 getContainers()를 호출하세요.

KmlLayer 또는 KmlContainer:에서 중첩되지 않은 컨테이너에 액세스하려면 다음을 실행합니다.

자바

for (KmlContainer containers : layer.getContainers()) {
    // Do something to container
}
      

Kotlin

for (containers in layer.containers) {
    // Do something to container
}
      

KmlLayer 또는 KmlContainer에서 중첩된 컨테이너에 액세스하려면 다음을 실행합니다.

자바

public void accessContainers(Iterable<KmlContainer> containers) {
    for (KmlContainer container : containers) {
        if (container.hasContainers()) {
            accessContainers(container.getContainers());
        }
    }
}
      

Kotlin

fun accessContainers(containers: Iterable<KmlContainer>) {
    for (container in containers) {
        if (container.hasContainers()) {
            accessContainers(container.containers)
        }
    }
      

KML 위치표시 및 KML 지면 오버레이 액세스

레이어에 추가된 위치표시 또는 지면 오버레이에 액세스하려면 레이어 또는 컨테이너에서 getPlacemarks() 또는 getGroundOverlays()를 호출합니다. 호출하면 각각 KmlPlacemarks 또는 KmlGroundOverlays의 반복 가능 항목을 반환합니다.

예를 들어 레이어에서 KmlPlacemark 객체에 액세스하려면 다음을 실행합니다.

자바

for (KmlPlacemark placemark : layer.getPlacemarks()) {
    // Do something to Placemark
}
      

Kotlin

for (placemark in layer.placemarks) {
    // Do something to Placemark
}
      

KML 속성 액세스

컨테이너 또는 위치표시의 속성에 액세스하려면 getProperty()를 호출하고 속성 키를 제공합니다. 또한 hasProperty()를 호출하여 속성이 존재하는지 확인할 수도 있습니다. 이 샘플은 컨테이너에서 속성 값 'name'(존재하는 경우)을 가져오는 방법을 보여줍니다.

자바

for (KmlContainer container : layer.getContainers()) {
    if (container.hasProperty("name")) {
        Log.i("KML", container.getProperty("name"));
    }
}
      

Kotlin

for (container in layer.containers) {
    if (container.hasProperty("name")) {
        Log.i("KML", container.getProperty("name"))
    }
}
      

KML 도형 클릭 이벤트

KmlLayer.OnFeatureClickListener()를 사용하여 지도의 도형 지형지물에서 클릭 이벤트를 수신할 수 있습니다. 다음 예시에서는 사용자가 하나의 지형지물을 클릭할 때 그 지형지물의 ID를 기록합니다.

자바

// 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());
    }
});
      

Kotlin

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i(
        "KML",
        "Feature clicked: " + feature.id
    )
}
      

데모 앱 보기

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>