Google マップ KML インポート ユーティリティ

  1. はじめに
  2. KML レイヤを追加する
  3. KML レイヤを消去する
  4. KML コンテナにアクセスする
  5. KML 目印と KML 地面オーバーレイにアクセスする
  6. KML プロパティにアクセスする
  7. KML でサポートされている機能

はじめに

KMLXML データ形式の拡張で、マップ上の地理データを表します。このユーティリティを使用すると、KML オブジェクトを地理的図形に変換して、マップ上にレイヤとしてレンダリングできます。マップに GeoJSON データを追加する場合は addLayerToMap() を、マップからこのデータを削除する場合は removeLayerFromMap() を呼び出します。KML オブジェクトのプロパティにアクセスするには、任意の Placemark、GroundOverlay、Document、または Folder で getProperties() を呼び出します。

マップに KML レイヤを追加する

マップにデータレイヤを追加するには、まず KmlLayer クラスのインスタンスを作成します。KmlLayer をインスタンス化するには、2 つの方法があります。

ローカル リソースから KML データセットをインポートしてレンダリングする場合は、以下のものが必要です。

  • レイヤをレンダリングする GoogleMap オブジェクト。
  • KML データを含むローカル リソース ファイル。
  • Context オブジェクト。これはローカル リソース ファイルを開くために必要です。

Java

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 オブジェクト。これはローカル リソースを開くために必要です。

Java

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()() を呼び出して、インポートしたデータをマップに追加します。

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

KML レイヤを消去する

たとえば、次の KmlLayer を作成したとします。

Java

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() を呼び出します。

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

KML コンテナにアクセスする

レイヤに追加したコンテナにアクセスするには、作成したレイヤで getContainers() を呼び出します。いずれかのコンテナ内にコンテナがネストされているかどうかをチェックするには、hasContainers() を呼び出します。これらのネストされたコンテナにアクセスするには、レイヤでの操作と同様に、getContainers() を呼び出します。

KmlLayer または KmlContainer: にネストされていないコンテナにアクセスするには、以下のようにします。

Java

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

Kotlin

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

KmlLayer または KmlContainer にネストされているコンテナにアクセスするには、以下のようにします。

Java

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 の iterable が返されます。

たとえば、レイヤから KmlPlacemark オブジェクトにアクセスするには、次のようにします。

Java

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

Kotlin

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

KML プロパティにアクセスする

コンテナまたは目印のプロパティにアクセスするには、getProperty() を呼び出して、プロパティキーを渡します。hasProperty() を呼び出して、そのプロパティが存在するかどうかをチェックすることもできます。このサンプルは、プロパティ値「name」が存在する場合に、それをコンテナから取得する方法を示しています。

Java

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 をログに記録しています。

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

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> 部分的にあり ハイライト スタイルとインライン StyleMap はサポートされない
<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> あり