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

Selecione a plataforma: Android iOS JavaScript
  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 uma 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, de modo semelhante 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 ela 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> é compatível
<begin> N/A <TimeSpan> não é compatível
<bgColor> não
<bottomFov> N/A <PhotoOverlay> não é compatível
<Camera> não
<Change> parcialmente somente mudanças de estilo são aceitas
<color> parcialmente inclui #AABBGGRR e #BBGGRR, não é compatível em <ScreenOverlay> e <GroundOverlay>
<colorMode> sim
<cookie> não <NetworkLinkControl> não é compatível
<coordinates> sim
<Create> não
<Data> não
<Delete> não
<description> sim Somente texto simples, conteúdo HTML não é permitido
<displayMode> não
<displayName> não
<Document> sim
<drawOrder> sim
<east> sim
<end> N/A <TimeSpan> não é compatível
<expires> não <NetworkLinkControl> não é compatível
<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 é compatível
<Folder> sim
<gridOrigin> N/A <PhotoOverlay> não é compatível
<GroundOverlay> sim
<heading> sim
<hotSpot> sim
<href> sim
<httpQuery> não
<Icon> sim
<IconStyle> sim
<ImagePyramid> N/A <PhotoOverlay> não é compatível
<innerBoundaryIs> sim implicitamente a partir da ordem de <LinearRing>
<ItemIcon> N/A <ListStyle> não é compatível
<key> sim
<kml> sim
<LabelStyle> não
<latitude> sim
<LatLonAltBox> não
<LatLonBox> sim
<leftFov> N/A <PhotoOverlay> não é compatível
<LinearRing> sim
<LineString> sim
<LineStyle> sim
<Link> não
<linkDescription> N/A <NetworkLinkControl> não é compatível
<linkName> N/A <NetworkLinkControl> não é compatível
<linkSnippet> N/A <NetworkLinkControl> não é compatível
<listItemType> N/A <ListStyle> não é compatível
<ListStyle> não
<Location> N/A <Model> não é compatível
<Lod> sim
<longitude> sim
<LookAt> não
<maxAltitude> não
<maxFadeExtent> não
<maxHeight> N/A <PhotoOverlay> não é compatível
<maxLodPixels> não
<maxSessionLength> não
<maxWidth> N/A <PhotoOverlay> não é compatível
<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 é compatível
<NetworkLink> não
<NetworkLinkControl> não
<north> sim
<open> sim Armazenado como um valor de propriedade
<Orientation> N/A <Model> não é compatível
<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 é compatível
<rightFov> N/A <PhotoOverlay> não é compatível
<roll> N/A <Camera> e <Model> não são compatíveis
<rotation> sim
<rotationXY> não
<Scale> N/A <Model> não é compatível
<scale> sim
<Schema> não
<SchemaData> não
<ScreenOverlay> não
<screenXY> N/A <ScreenOverlay> não é compatível
<shape> N/A <PhotoOverlay> não é compatível
<SimpleData> N/A <SchemaData> não é compatível
<SimpleField> N/A <Schema> não é compatível
<size> sim
<Snippet> não
<south> sim
<state> N/A <ListStyle> não é compatível
<Style> sim
<StyleMap> parcialmente Estilo realçado não fornecido. StyleMaps inline não é compatível
<styleUrl> sim
<targetHref> não <Alias> não é compatível
<tessellate> não
<text> sim
<textColor> não
<tileSize> N/A <PhotoOverlay> não é compatível
<tilt> não
<TimeSpan> não
<TimeStamp> não
<topFov> N/A <PhotoOverlay> não é compatível
<Update> N/A <NetworkLinkControl< não é compatível
<value> sim
<viewBoundScale> não
<viewFormat> não
<viewRefreshMode> não
<viewRefreshTime> não
<ViewVolume> N/A <PhotoOverlay> não é compatível
<visibility> sim
<west> sim
<when> N/A <TimeStamp> não é compatível
<width> sim