Utilitário de importação de KML do Google Maps

  1. Introdução
  2. Adicionar uma camada KML
  3. Limpar uma camada KML
  4. Acessar contêineres KML
  5. Acessar marcadores de local KML e sobreposições de solo KML
  6. Acessar propriedades KML
  7. Recursos permitidos do KML

Introdução

KML é uma extensão do formato de dados XML e representa os dados geográficos em um mapa. O uso desse utilitário permite converter objetos KML em formas geográficas e renderizá-las como uma camada sobre um mapa. Para adicionar e remover dados KML do mapa, chame addLayerToMap() e removeLayerFromMap(), respectivamente. Para acessar propriedades em um objeto KML, chame getProperties() em qualquer marcador de local, GroundOverlay, documento ou pasta.

Adicionar uma camada KML ao mapa

Para adicionar uma camada de dados ao mapa, primeiro crie uma instância da classe KmlLayer. Há duas maneiras de instanciar um KmlLayer.

Para importar e renderizar um conjunto de dados KML de um recurso local são necessários:

  • Um objeto GoogleMap em que a camada será renderizada
  • Um arquivo de recursos local contendo os dados KML
  • Um objeto Context, que é necessário para abrir um arquivo de recursos local.

Java

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

Kotlin

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

Para importar e renderizar um conjunto de dados KML de um stream local são necessários:

  • Um objeto GoogleMap em que a camada será renderizada
  • Um InputStream contendo os dados KML
  • Um objeto Context, que é necessário para abrir recursos locais

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)
      

Depois de criar um KmlLayer, chame addLayerToMap()() para adicionar os dados importados ao mapa.

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

Limpar uma camada KML

Vamos supor que você criou esta 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)
      

Para remover a camada do mapa, chame removeLayerFromMap():

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

Acessar contêineres KML

Para acessar qualquer contêiner que tenha sido adicionado à sua camada, chame getContainers() na camada criada. Para verificar se qualquer contêiner tem contêineres aninhados, chame hasContainers(). Para acessar esses contêineres aninhados, semelhantes ao que você pode fazer na camada, chame getContainers().

Para acessar contêineres que não estão aninhados em KmlLayer ou KmlContainer:

Java

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

Kotlin

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

Para acessar contêineres que estão aninhados em KmlLayer ou 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)
        }
    }
      

Acessar marcadores de local KML e sobreposições de solo KML

Para acessar qualquer marcador de local ou sobreposição de solo que tenha sido adicionado à camada, você pode chamar getPlacemarks() ou getGroundOverlays() em uma camada ou contêiner. Chamar um dos dois retornará um iterável de KmlPlacemarks ou KmlGroundOverlays, respectivamente.

Por exemplo, para acessar um objeto KmlPlacemark de uma camada:

Java

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

Kotlin

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

Acessar propriedades KML

Para acessar qualquer propriedade em um contêiner ou marcador de local, chame getProperty() e atribua a ela uma chave de propriedade. Você também pode chamar hasProperty() para verificar se ele existe. Este exemplo mostra como recuperar o valor de propriedade "name" de um contêiner, se houver.

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

Eventos de clique de geometria KML

É possível usar KmlLayer.OnFeatureClickListener() para ouvir os eventos de cliques nos recursos de geometria no mapa. O exemplo a seguir registra o ID de um recurso quando o usuário clica nele:

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

Ver o app de demonstração

Para ver um exemplo de como importar um arquivo KML e criar uma camada com ele, consulte KmlDemoActivity no app de demonstração que acompanha a biblioteca de utilitários. O guia de configuração mostra como executá-lo.

Recursos permitidos do KML

Elemento KML Permitido? Comentário
<address> parcialmente Armazenado como um valor de propriedade
<AddressDetails> não
<Alias> não
<altitude> não
<altitudeMode> não
<atom:author> não
<atom:link> não
<atom:name> não
<BalloonStyle> parcialmente somente <text> é suportado
<begin> N/A <TimeSpan> não é suportado
<bgColor> não
<bottomFov> N/A <PhotoOverlay> não é suportado
<Camera> não
<Change> parcialmente somente alterações de estilo são suportadas
<color> parcialmente inclui #AABBGGRR e #BBGGRR, não são suportados em <ScreenOverlay> e <GroundOverlay>
<colorMode> sim
<cookie> não <NetworkLinkControl> não é suportado
<coordinates> sim
<Create> não
<Data> não
<Delete> não
<description> sim Somente texto simples, conteúdo HTML não é suportado
<displayMode> não
<displayName> não
<Document> sim
<drawOrder> sim
<east> sim
<end> N/A <TimeSpan> não é suportado
<expires> não <NetworkLinkControl> não é suportado
<ExtendedData> parcialmente somente <Data> não digitados, sem <SimpleData> ou <Schema>, e substituições de entidades da forma $[dataName] não estão disponíveis.
<extrude> não
<fill> sim
<flyToView> não <NetworkLinkControl> não é suportado
<Folder> sim
<gridOrigin> N/A <PhotoOverlay> não é suportado
<GroundOverlay> sim
<heading> sim
<hotSpot> sim
<href> sim
<httpQuery> não
<Icon> sim
<IconStyle> sim
<ImagePyramid> N/A <PhotoOverlay> não é suportado
<innerBoundaryIs> sim implicitamente a partir da ordem de <LinearRing>
<ItemIcon> N/A <ListStyle> não é suportado
<key> sim
<kml> sim
<LabelStyle> não
<latitude> sim
<LatLonAltBox> não
<LatLonBox> sim
<leftFov> N/A <PhotoOverlay> não é suportado
<LinearRing> sim
<LineString> sim
<LineStyle> sim
<Link> não
<linkDescription> N/A <NetworkLinkControl> não é suportado
<linkName> N/A <NetworkLinkControl> não é suportado
<linkSnippet> N/A <NetworkLinkControl> não é suportado
<listItemType> N/A <ListStyle> não é suportado
<ListStyle> não
<Location> N/A <Model> não é suportado
<Lod> sim
<longitude> sim
<LookAt> não
<maxAltitude> não
<maxFadeExtent> não
<maxHeight> N/A <PhotoOverlay> não é suportado
<maxLodPixels> não
<maxSessionLength> não
<maxWidth> N/A <PhotoOverlay> não é suportado
<message> não
<minAltitude> não
<minFadeExtent> não
<minLodPixels> não
<minRefreshPeriod> não <NetworkLink>
<Model> não
<MultiGeometry> sim
<name> sim
<near> N/A <PhotoOverlay> não é suportado
<NetworkLink> não
<NetworkLinkControl> não
<north> sim
<open> sim Armazenado como um valor de propriedade
<Orientation> N/A <Model> não é suportado
<outerBoundaryIs> sim implicitamente a partir da ordem de <LinearRing>
<outline> sim
<overlayXY> não
<Pair> sim
<phoneNumber> parcialmente Armazenado como um valor de propriedade
<PhotoOverlay> não
<Placemark> sim
<Point> sim
<Polygon> sim
<PolyStyle> sim
<range> sim
<refreshInterval> não
<refreshMode> não
<refreshVisibility> não
<Region> sim
<ResourceMap> N/A <Model> não é suportado
<rightFov> N/A <PhotoOverlay> não é suportado
<roll> N/A <Camera> e <Model> não são suportados
<rotation> sim
<rotationXY> não
<Scale> N/A <Model> não é suportado
<scale> sim
<Schema> não
<SchemaData> não
<ScreenOverlay> não
<screenXY> N/A <ScreenOverlay> não é suportado
<shape> N/A <PhotoOverlay> não é suportado
<SimpleData> N/A <SchemaData> não é suportado
<SimpleField> N/A <Schema> não é suportad
<size> sim
<Snippet> não
<south> sim
<state> N/A <ListStyle> não é suportado
<Style> sim
<StyleMap> parcialmente Estilo realçado não fornecido. StyleMaps em linha não são suportados
<styleUrl> sim
<targetHref> não <Alias> não é suportado
<tessellate> não
<text> sim
<textColor> não
<tileSize> N/A <PhotoOverlay> não é suportado
<tilt> não
<TimeSpan> não
<TimeStamp> não
<topFov> N/A <PhotoOverlay> não é suportado
<Update> N/A <NetworkLinkControl< não é suportado
<value> sim
<viewBoundScale> não
<viewFormat> não
<viewRefreshMode> não
<viewRefreshTime> não
<ViewVolume> N/A <PhotoOverlay> não é suportado
<visibility> sim
<west> sim
<when> N/A <TimeStamp> não é suportado
<width> sim