@sowouldyoutech/google-maps
TypeScript icon, indicating that this package has built-in type declarations

0.0.2 • Public • Published

@capacitor/google-maps

Google maps on Capacitor

Install

npm install @sowouldyoutech/google-maps
npx cap sync

API Keys

To use the Google Maps SDK on any platform, API keys associated with an account with billing enabled are required. These can be obtained from the Google Cloud Console. This is required for all three platforms, Android, iOS, and Javascript. Additional information about obtaining these API keys can be found in the Google Maps documentation for each platform.

iOS

The Google Maps SDK supports the use of showing the users current location via enableCurrentLocation(bool). To use this, Apple requires privacy descriptions to be specified in Info.plist:

  • NSLocationAlwaysUsageDescription (Privacy - Location Always Usage Description)
  • NSLocationWhenInUseUsageDescription (Privacy - Location When In Use Usage Description)

Read about Configuring Info.plist in the iOS Guide for more information on setting iOS permissions in Xcode.

The Google Maps SDK currently does not support running on simulators using the new M1-based Macbooks. This is a known and acknowledged issue and requires a fix from Google. If you are developing on a M1 Macbook, building and running on physical devices is still supported and is the recommended approach.

Android

The Google Maps SDK for Android requires you to add your API key to the AndroidManifest.xml file in your project.

<meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_API_KEY_HERE"/>

To use certain location features, the SDK requires the following permissions to also be added to your AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Variables

This plugin will use the following project variables (defined in your app's variables.gradle file):

  • $googleMapsPlayServicesVersion: version of com.google.android.gms:play-services-maps (default: 18.0.2)
  • $googleMapsUtilsVersion: version of com.google.maps.android:android-maps-utils (default: 2.3.0)
  • $googleMapsKtxVersion: version of com.google.maps.android:maps-ktx (default: 3.4.0)
  • $googleMapsUtilsKtxVersion: version of com.google.maps.android:maps-utils-ktx (default: 3.4.0)
  • $kotlinxCoroutinesVersion: version of org.jetbrains.kotlinx:kotlinx-coroutines-android and org.jetbrains.kotlinx:kotlinx-coroutines-core (default: 1.6.3)
  • $androidxCoreKTXVersion: version of androidx.core:core-ktx (default: 1.8.0)
  • $kotlin_version: version of org.jetbrains.kotlin:kotlin-stdlib-jdk7 (default: 1.7.0)

Usage

The Google Maps Capacitor plugin ships with a web component that must be used to render the map in your application as it enables us to embed the native view more effectively on iOS. The plugin will automatically register this web component for use in your application.

For Angular users, you will get an error warning that this web component is unknown to the Angular compiler. This is resolved by modifying the module that declares your component to allow for custom web components.

import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

@NgModule({
  schemas: [CUSTOM_ELEMENTS_SCHEMA]
})

Include this component in your HTML and assign it an ID so that you can easily query for that element reference later.

<capacitor-google-map id="map"></capacitor-google-map>

On Android, the map is rendered beneath the entire webview, and uses this component to manage its positioning during scrolling events. This means that as the developer, you must ensure that the webview is transparent all the way through the layers to the very bottom. In a typically Ionic application, that means setting transparency on elements such as IonContent and the root HTML tag to ensure that it can be seen. If you can't see your map on Android, this should be the first thing you check.

On iOS, we render the map directly into the webview and so the same transparency effects are not required. We are investigating alternate methods for Android still and hope to resolve this better in a future update.

The Google Map element itself comes unstyled, so you should style it to fit within the layout of your page structure. Because we're rendering a view into this slot, by itself the element has no width or height, so be sure to set those explicitly.

capacitor-google-map {
    display: inline-block;
    width: 275px;
    height: 400px;
}

Next, we should create the map reference. This is done by importing the GoogleMap class from the Capacitor plugin and calling the create method, and passing in the required parameters.

import { GoogleMap } from '@capacitor/google-maps';

const apiKey = 'YOUR_API_KEY_HERE';

const mapRef = document.getElementById('map');

const newMap = await GoogleMap.create({
    id: 'my-map', // Unique identifier for this map instance
    element: mapRef, // reference to the capacitor-google-map element
    apiKey: apiKey, // Your Google Maps API Key
    config: {
        center: {
            // The initial position to be rendered by the map
            lat: 33.6,
            lng: -117.9,
        },
        zoom: 8, // The initial zoom level to be rendered by the map
    },
});

At this point, your map should be created within your application. Using the returned reference to the map, you can easily interact with your map in a number of way, a few of which are shown here.

const newMap = await GoogleMap.create({...});

// Add a marker to the map
const markerId = await newMap.addMarker({
    coordinate: {
        lat: 33.6,
        lng: -117.9
    }
});

// Move the map programmatically
await newMap.setCamera({
    coordinate: {
        lat: 33.6,
        lng: -117.9
    }
});

// Enable marker clustering
await newMap.enableClustering();

// Handle marker click
await newMap.setOnMarkerClickListener((event) => {...});

// Clean up map reference
await newMap.destroy();

Full Examples

Angular

import { GoogleMap } from '@capacitor/google-maps';

@Component({
    template: `
    <capacitor-google-map #map></capacitor-google-map>
    <button (click)="createMap()">Create Map</button>
  `,
    styles: [
        `
      capacitor-google-map {
        display: inline-block;
        width: 275px;
        height: 400px;
      }
    `,
    ],
})
export class MyMap {
    @ViewChild('map')
    mapRef: ElementRef<HTMLElement>;
    newMap: GoogleMap;

    async createMap() {
        this.newMap = await GoogleMap.create({
            id: 'my-cool-map',
            element: this.mapRef.nativeElement,
            apiKey: environment.apiKey,
            config: {
                center: {
                    lat: 33.6,
                    lng: -117.9,
                },
                zoom: 8,
            },
        });
    }
}

React

import { GoogleMap } from '@capacitor/google-maps';
import { useRef } from 'react';

const MyMap: React.FC = () => {
    const mapRef = useRef<HTMLElement>();
    let newMap: GoogleMap;

    async function createMap() {
        if (!mapRef.current) return;

        newMap = await GoogleMap.create({
            id: 'my-cool-map',
            element: mapRef.current,
            apiKey: process.env.REACT_APP_YOUR_API_KEY_HERE,
            config: {
                center: {
                    lat: 33.6,
                    lng: -117.9
                },
                zoom: 8
            }
        })
    }

    return (
        <div className="component-wrapper">
            <capacitor-google-map ref={mapRef} style={{
                display: 'inline-block',
                width: 275,
                height: 400
            }}></capacitor-google-map>

            <button onClick={createMap}>Create Map</button>
        </div>
    )
}

export default MyMap;

Javascript

<capacitor-google-map id="map"></capacitor-google-map>
<button onclick="createMap()">Create Map</button>

<style>
    capacitor-google-map {
        display: inline-block;
        width: 275px;
        height: 400px;
    }
</style>

<script>
    import { GoogleMap } from '@capacitor/google-maps';

    const createMap = async () => {
        const mapRef = document.getElementById('map');

        const newMap = await GoogleMap.create({
            id: 'my-map', // Unique identifier for this map instance
            element: mapRef, // reference to the capacitor-google-map element
            apiKey: 'YOUR_API_KEY_HERE', // Your Google Maps API Key
            config: {
                center: {
                    // The initial position to be rendered by the map
                    lat: 33.6,
                    lng: -117.9,
                },
                zoom: 8, // The initial zoom level to be rendered by the map
            },
        });
    };
</script>

API

create(...)

create(options: CreateMapArgs) => Promise<void>
Param Type
options CreateMapArgs

resize(...)

resize(options: ResizeArgs) => Promise<void>
Param Type
options ResizeArgs

addMarker(...)

addMarker(args: AddMarkerArgs) => Promise<{ id: string; }>
Param Type
args AddMarkerArgs

Returns: Promise<{ id: string; }>


addMarkers(...)

addMarkers(args: AddMarkersArgs) => Promise<{ ids: string[]; }>
Param Type
args AddMarkersArgs

Returns: Promise<{ ids: string[]; }>


removeMarker(...)

removeMarker(args: RemoveMarkerArgs) => Promise<void>
Param Type
args RemoveMarkerArgs

removeOverlayPositionChangeListener(...)

removeOverlayPositionChangeListener(args: RemoveOverlay) => Promise<void>
Param Type
args RemoveOverlay

removeMarkers(...)

removeMarkers(args: RemoveMarkersArgs) => Promise<void>
Param Type
args RemoveMarkersArgs

enableClustering(...)

enableClustering(args: { id: string; }) => Promise<void>
Param Type
args { id: string; }

disableClustering(...)

disableClustering(args: { id: string; }) => Promise<void>
Param Type
args { id: string; }

destroy(...)

destroy(args: DestroyMapArgs) => Promise<void>
Param Type
args DestroyMapArgs

setCamera(...)

setCamera(args: CameraArgs) => Promise<void>
Param Type
args CameraArgs

setMapType(...)

setMapType(args: MapTypeArgs) => Promise<void>
Param Type
args MapTypeArgs

enableIndoorMaps(...)

enableIndoorMaps(args: IndoorMapArgs) => Promise<void>
Param Type
args IndoorMapArgs

toScreenLocation(...)

toScreenLocation(args: ToScreenLocationArgs) => Promise<any>
Param Type
args ToScreenLocationArgs

Returns: Promise<any>


enableTrafficLayer(...)

enableTrafficLayer(args: TrafficLayerArgs) => Promise<void>
Param Type
args TrafficLayerArgs

enableAccessibilityElements(...)

enableAccessibilityElements(args: AccElementsArgs) => Promise<void>
Param Type
args AccElementsArgs

enableCurrentLocation(...)

enableCurrentLocation(args: CurrentLocArgs) => Promise<void>
Param Type
args CurrentLocArgs

setPadding(...)

setPadding(args: PaddingArgs) => Promise<void>
Param Type
args PaddingArgs

onScroll(...)

onScroll(args: OnScrollArgs) => Promise<void>
Param Type
args OnScrollArgs

dispatchMapEvent(...)

dispatchMapEvent(args: { id: string; focus: boolean; }) => Promise<void>
Param Type
args { id: string; focus: boolean; }

getMapBounds(...)

getMapBounds(args: { id: string; }) => Promise<LatLngBounds>
Param Type
args { id: string; }

Returns: Promise<LatLngBounds>


Interfaces

CreateMapArgs

An interface containing the options used when creating a map.

Prop Type Description Default
id string A unique identifier for the map instance.
apiKey string The Google Maps SDK API Key.
config GoogleMapConfig The initial configuration settings for the map.
element HTMLElement The DOM element that the Google Map View will be mounted on which determines size and positioning.
forceCreate boolean Destroy and re-create the map instance if a map with the supplied id already exists false

GoogleMapConfig

For web, all the javascript Google Maps options are available as GoogleMapConfig extends google.maps.MapOptions. For iOS and Android only the config options declared on GoogleMapConfig are available.

Prop Type Description Default Since
width number Override width for native map.
height number Override height for native map.
x number Override absolute x coordinate position for native map.
y number Override absolute y coordinate position for native map.
center LatLng Default location on the Earth towards which the camera points.
zoom number Sets the zoom of the map.
androidLiteMode boolean Enables image-based lite mode on Android. false
devicePixelRatio number Override pixel ratio for native map.
styles MapTypeStyle[] | null Styles to apply to each of the default map types. Note that for satellite, hybrid and terrain modes, these styles will only apply to labels and geometry. 4.3.0

LatLng

An interface representing a pair of latitude and longitude coordinates.

Prop Type Description
lat number Coordinate latitude, in degrees. This value is in the range [-90, 90].
lng number Coordinate longitude, in degrees. This value is in the range [-180, 180].

ResizeArgs

Prop Type
id string
bounds DOMRect

AddMarkerArgs

Prop Type
id string
marker Marker

Marker

A marker is an icon placed at a particular point on the map's surface.

Prop Type Description Default Since
coordinate LatLng Marker position
opacity number Sets the opacity of the marker, between 0 (completely transparent) and 1 inclusive. 1
title string Title, a short description of the overlay.
snippet string Snippet text, shown beneath the title in the info window when selected.
isFlat boolean Controls whether this marker should be flat against the Earth's surface or a billboard facing the camera. false
iconUrl string Path to a marker icon to render. It can be relative to the web app public directory, or a https url of a remote marker icon. SVGs are not supported on native platforms. 4.2.0
iconSize Size Controls the scaled size of the marker image set in iconUrl. 4.2.0
iconOrigin Point The position of the image within a sprite, if any. By default, the origin is located at the top left corner of the image . 4.2.0
iconAnchor Point The position at which to anchor an image in correspondence to the location of the marker on the map. By default, the anchor is located along the center point of the bottom of the image. 4.2.0
tintColor { r: number; g: number; b: number; a: number; } Customizes the color of the default marker image. Each value must be between 0 and 255. Only for iOS and Android. 4.2.0
draggable boolean Controls whether this marker can be dragged interactively false

Size

Prop Type
width number
height number

Point

Prop Type
x number
y number

AddMarkersArgs

Prop Type
id string
markers Marker[]

RemoveMarkerArgs

Prop Type
id string
markerId string

RemoveOverlay

Prop Type
id string
callbackId string

RemoveMarkersArgs

Prop Type
id string
markerIds string[]

DestroyMapArgs

Prop Type
id string

CameraArgs

Prop Type
id string
config CameraConfig

CameraConfig

Configuration properties for a Google Map Camera

Prop Type Description Default
coordinate LatLng Location on the Earth towards which the camera points.
zoom number Sets the zoom of the map.
bearing number Bearing of the camera, in degrees clockwise from true north. 0
angle number The angle, in degrees, of the camera from the nadir (directly facing the Earth). The only allowed values are 0 and 45. 0
animate boolean Animate the transition to the new Camera properties. false
animationDuration number This configuration option is not being used.

MapTypeArgs

Prop Type
id string
mapType MapType

IndoorMapArgs

Prop Type
id string
enabled boolean

ToScreenLocationArgs

Prop Type
id string
lat number
lng number

TrafficLayerArgs

Prop Type
id string
enabled boolean

AccElementsArgs

Prop Type
id string
enabled boolean

CurrentLocArgs

Prop Type
id string
enabled boolean

PaddingArgs

Prop Type
id string
padding MapPadding

MapPadding

Controls for setting padding on the 'visible' region of the view.

Prop Type
top number
left number
right number
bottom number

OnScrollArgs

Prop Type
id string
mapBounds { x: number; y: number; width: number; height: number; }

LatLngBounds

An interface representing the viewports latitude and longitude bounds.

Prop Type
southwest LatLng
center LatLng
northeast LatLng

Enums

MapType

Members Value Description
Normal 'Normal' Basic map.
Hybrid 'Hybrid' Satellite imagery with roads and labels.
Satellite 'Satellite' Satellite imagery with no labels.
Terrain 'Terrain' Topographic data.
None 'None' No base map tiles.

Readme

Keywords

Package Sidebar

Install

npm i @sowouldyoutech/google-maps

Weekly Downloads

2

Version

0.0.2

License

MIT

Unpacked Size

571 kB

Total Files

46

Last publish

Collaborators

  • sowouldyoutech