- Introdução
- Adicionar uma camada KML
- Limpar uma camada KML
- Acessar contêineres KML
- Acessar marcadores de local KML e sobreposições de solo KML
- Acessar propriedades KML
- 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
Kotlin
val layer = KmlLayer(map, R.raw.geojson_file, context)
Java
KmlLayer layer = new 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
Kotlin
val inputStream: InputStream? = // InputStream containing KML data val layer = KmlLayer(map, inputStream, context)
Java
InputStream inputStream = // InputStream containing KML data KmlLayer layer = new KmlLayer(map, inputStream, context);
Depois de criar um KmlLayer
, chame addLayerToMap()()
para adicionar os dados importados ao mapa.
Kotlin
layer.addLayerToMap()
Java
layer.addLayerToMap();
Limpar uma camada KML
Vamos supor que você criou esta KmlLayer
:
Kotlin
val inputStream: InputStream? = // InputStream containing KML data val layer = KmlLayer(map, inputStream, context)
Java
InputStream inputStream = // InputStream containing KML data KmlLayer layer = new KmlLayer(map, inputStream, context);
Para remover a camada do mapa, chame removeLayerFromMap()
:
Kotlin
layer.removeLayerFromMap()
Java
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:
Kotlin
for (containers in layer.containers) { // Do something to container }
Java
for (KmlContainer containers : layer.getContainers()) { // Do something to container }
Para acessar contêineres que estão aninhados em KmlLayer
ou KmlContainer
:
Kotlin
fun accessContainers(containers: Iterable<KmlContainer>) { for (container in containers) { if (container.hasContainers()) { accessContainers(container.containers) } }
Java
public void accessContainers(Iterable<KmlContainer> containers) { for (KmlContainer container : containers) { if (container.hasContainers()) { accessContainers(container.getContainers()); } } }
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:
Kotlin
for (placemark in layer.placemarks) { // Do something to Placemark }
Java
for (KmlPlacemark placemark : layer.getPlacemarks()) { // 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.
Kotlin
for (container in layer.containers) { if (container.hasProperty("name")) { Log.i("KML", container.getProperty("name")) } }
Java
for (KmlContainer container : layer.getContainers()) { 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:
Kotlin
// Set a listener for geometry clicked events. layer.setOnFeatureClickListener { feature -> Log.i( "KML", "Feature clicked: " + feature.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()); } });
Conferir 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 |