Utilitaire d'importation KML de Google Maps

  1. Introduction
  2. Ajouter un calque KML
  3. Effacer un calque KML
  4. Accéder aux conteneurs KML
  5. Accéder aux repères KML et aux superpositions au sol KML
  6. Accéder aux propriétés KML
  7. Fonctionnalités KML compatibles

Introduction

KML est une extension du format de données XML et représente des données géographiques sur une carte. Cet utilitaire permet de convertir des objets KML en formes géographiques et d'effectuer le rendu sous forme de calque au-dessus d'une carte. Pour ajouter et supprimer vos données KML de la carte, appelez respectivement addLayerToMap() et removeLayerFromMap(). Vous pouvez accéder aux propriétés d'un objet KML en appelant getProperties() sur n'importe quel élément Placemark, GroundOverlay, Document ou Folder.

Ajouter un calque KML à la carte

Pour ajouter un calque de données à la carte, vous devez d'abord créer une instance de la classe KmlLayer. Il existe deux façons d'instancier un KmlLayer.

Pour importer et effectuer le rendu d'un jeu de données KML à partir d'une ressource locale, il vous faut :

  • Un objet GoogleMap dans lequel le calque doit être affiché
  • Un fichier de ressources local contenant les données KML
  • Un objet Context, nécessaire pour ouvrir un fichier de ressources local

Java

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

Kotlin

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

Pour importer et effectuer le rendu d'un jeu de données KML à partir d'un flux local, il vous faut :

  • Un objet GoogleMap dans lequel le calque doit être affiché
  • Un tableau (InputStream) contenant les données KML
  • Un objet Context, nécessaire pour ouvrir les ressources locales

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)
      

Après avoir créé un KmlLayer, appelez addLayerToMap()() pour ajouter les données importées à la carte.

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

Effacer un calque KML

Supposons que vous avez créé ce 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)
      

Pour supprimer le calque de la carte, appelez removeLayerFromMap() :

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

Accéder aux conteneurs KML

Pour accéder aux conteneurs qui ont été ajoutés à votre calque, vous pouvez appeler getContainers() sur le calque que vous avez créé. Pour savoir si un conteneur contient des conteneurs imbriqués, vous pouvez appeler hasContainers(). Pour accéder à ces conteneurs imbriqués, de la même manière que vous pouvez le faire dans votre calque, vous pouvez appeler getContainers().

Pour accéder aux conteneurs qui ne sont pas imbriqués dans KmlLayer ou KmlContainer:

Java

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

Kotlin

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

Pour accéder aux conteneurs qui sont imbriqués dans un KmlLayer ou une 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)
        }
    }
      

Accéder aux repères KML et aux superpositions au sol KML

Pour accéder à un repère ou à une superposition au sol qui a été ajouté(e) au calque, vous pouvez appeler getPlacemarks() ou getGroundOverlays() sur un calque ou un conteneur. Le fait d'appeler l'une ou l'autre de ces méthodes renverra un itérable de KmlPlacemarks ou KmlGroundOverlays respectivement.

Par exemple, pour accéder aux objets KmlPlacemark à partir d'un calque :

Java

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

Kotlin

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

Accéder aux propriétés KML

Pour accéder à n'importe quelle propriété d'un conteneur ou d'un repère, appelez getProperty() et attribuez-lui une clé de propriété. Vous pouvez également appeler hasProperty() pour vérifier qu'elle existe. Cet exemple montre comment extraire la valeur de propriété "name" d'un conteneur, si elle existe.

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"))
    }
}
      

Événements de clic sur la géométrie KML

Vous pouvez utiliser KmlLayer.OnFeatureClickListener() pour écouter les événements de clic sur les éléments géométriques de la carte. L'exemple suivant enregistre l'ID d'un élément géographique lorsque l'utilisateur clique dessus :

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

Voir l'application de démonstration

Pour savoir comment importer un fichier KML et créer un calque avec ce fichier, consultez KmlDemoActivity dans l'application de démonstration fournie avec la bibliothèque d'utilitaires. Le guide de configuration vous explique comment exécuter l'application de démonstration.

Fonctionnalités KML compatibles

Élément KML Pris en charge ? Commentaire
<address> partiellement Stocké en tant que valeur de propriété
<AddressDetails> non
<Alias> non
<altitude> non
<altitudeMode> non
<atom:author> non
<atom:link> non
<atom:name> non
<BalloonStyle> partiellement seul <text> est pris en charge
<begin> N/A <TimeSpan> n'est pas pris en charge
<bgColor> non
<bottomFov> N/A <PhotoOverlay> n'est pas pris en charge
<Camera> non
<Change> partiellement seuls les changements de style sont pris en charge
<color> partiellement inclut #AABBGGRR et #BBGGRR ; non pris en charge dans <ScreenOverlay> et <GroundOverlay>
<colorMode> oui
<cookie> non <NetworkLinkControl> non pris en charge
<coordinates> oui
<Create> non
<Data> non
<Delete> non
<description> oui Texte brut uniquement, le contenu HTML n'est pas pris en charge
<displayMode> non
<DisplayName> non
<Document> oui
<drawOrder> oui
<east> oui
<end> N/A <TimeSpan> n'est pas pris en charge
<expires> non <NetworkLinkControl> non pris en charge
<ExtendedData> partiellement Éléments <Data> non typés uniquement, pas d'éléments <SimpleData> ou <Schema>, et les remplacements d'entité de form$[dataName] ne sont pas pris en charge.
<extrude> non
<fill> oui
<flyToView> non <NetworkLinkControl> non pris en charge
<Folder> oui
<gridOrigin> N/A <PhotoOverlay> n'est pas pris en charge
<GroundOverlay> oui
<heading> oui
<hotSpot> oui
<href> oui
<httpQuery> non
<Icon> oui
<IconStyle> oui
<ImagePyramid> N/A <PhotoOverlay> n'est pas pris en charge
<innerBoundaryIs> oui implicitement selon l'ordre <LinearRing>
<ItemIcon> N/A <ListStyle> non pris en charge
<key> oui
<kml> oui
<LabelStyle> non
<latitude> oui
<LatLonAltBox> non
<LatLonBox> oui
<leftFov> N/A <PhotoOverlay> n'est pas pris en charge
<LinearRing> oui
<LineString> oui
<LineStyle> oui
<Link> non
<linkDescription> N/A <NetworkLinkControl> non pris en charge
<linkName> N/A <NetworkLinkControl> non pris en charge
<linkSnippet> N/A <NetworkLinkControl> non pris en charge
<listItemType> N/A <ListStyle> non pris en charge
<ListStyle> non
<Location> N/A <Model> non pris en charge
<Lod> oui
<longitude> oui
<LookAt> non
<maxAltitude> non
<maxFadeExtent> non
<maxHeight> N/A <PhotoOverlay> n'est pas pris en charge
<maxLodPixels> non
<maxSessionLength> non
<maxWidth> N/A <PhotoOverlay> n'est pas pris en charge
<message> non
<minAltitude> non
<minFadeExtent> non
<minLodPixels>, non
<minRefreshPeriod> non <NetworkLink>
<Model> non
<MultiGeometry> oui
<name> oui
<near> N/A <PhotoOverlay> n'est pas pris en charge
<NetworkLink> non
<NetworkLinkControl> non
<north> oui
<open> oui Stocké en tant que valeur de propriété
<Orientation> N/A <Model> non pris en charge
<outerBoundaryIs> oui implicitement selon l'ordre <LinearRing>
<outline> oui
<overlayXY> non
<Pair> oui
<phoneNumber> partiellement Stocké en tant que valeur de propriété
<PhotoOverlay> non
<Placemark> oui
<Point> oui
<Polygon> oui
<PolyStyle> oui
<range> oui
<refreshInterval> non
<refreshMode> non
<refreshVisibility> non
<Region> oui
<ResourceMap> N/A <Model> non pris en charge
<rightFov> N/A <PhotoOverlay> n'est pas pris en charge
<roll> N/A <Camera> et <Model> non pris en charge
<rotation> oui
<rotationXY> non
<Scale> N/A <Model> non pris en charge
<scale> oui
<Schema> non
<SchemaData> non
<ScreenOverlay> non
<screenXY> N/A <ScreenOverlay> non pris en charge
<shape> N/A <PhotoOverlay> n'est pas pris en charge
<SimpleData> N/A <SchemaData> non pris en charge
<SimpleField> N/A <Schema> non pris en charge
<size> oui
<Snippet> non
<south> oui
<state> N/A <ListStyle> non pris en charge
<Style> oui
<StyleMap> partiellement Style en surbrillance non fourni. Inline StyleMaps non pris en charge
<styleUrl> oui
<targetHref> non <Alias> non pris en charge
<tessellate> non
<text> oui
<textColor> non
<tileSize> N/A <PhotoOverlay> n'est pas pris en charge
<tilt> non
<TimeSpan> non
<TimeStamp> non
<topFov> N/A <PhotoOverlay> n'est pas pris en charge
<Update> N/A <NetworkLinkControl> non pris en charge
<value> oui
<viewBoundScale> non
<viewFormat> non
<viewRefreshMode> non
<viewRefreshTime> non
<ViewVolume> N/A <PhotoOverlay> n'est pas pris en charge
<visibility> oui
<west> oui
<when> N/A <TimeStamp> n'est pas pris en charge
<width> oui